mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-03-11 06:05:16 +08:00
Resolved merge conflicts
This commit is contained in:
commit
6d0c627b6f
38 changed files with 15546 additions and 440 deletions
5
.firebaserc_example
Normal file
5
.firebaserc_example
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"projects": {
|
||||
"default": "your-firebase-project-id"
|
||||
}
|
||||
}
|
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
|
@ -1,4 +1,4 @@
|
|||
Adding a language or a theme? Make sure to edit the `list.json` file as well, otherwise, it will not work!
|
||||
Adding a language or a theme? Make sure to edit the `_list.json` file as well, otherwise, it will not work!
|
||||
|
||||
Please reference any issues related to your pull request.
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
*.min.js
|
||||
layouts.js
|
||||
english_quotes.json
|
||||
quotes/english.json
|
||||
chartjs-plugin-*.js
|
||||
sound/*
|
||||
node_modules
|
||||
css/balloon.css
|
||||
css/fa.css
|
||||
css/style.min.css
|
||||
list.json
|
||||
_list.json
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
const functions = require("firebase-functions");
|
||||
const admin = require("firebase-admin");
|
||||
let key = "./serviceAccountKey.json";
|
||||
let origin = "http://localhost:5000";
|
||||
|
||||
if (process.env.GCLOUD_PROJECT === "monkey-type") {
|
||||
key = "./serviceAccountKey_live.json";
|
||||
origin = "https://monkeytype.com";
|
||||
}
|
||||
|
||||
var serviceAccount = require(key);
|
||||
|
@ -133,14 +135,36 @@ exports.clearName = functions.auth.user().onDelete((user) => {
|
|||
db.collection("users").doc(user.uid).delete();
|
||||
});
|
||||
|
||||
exports.checkNameAvailability = functions.https.onCall(
|
||||
exports.checkNameAvailability = functions.https.onRequest(
|
||||
async (request, response) => {
|
||||
response.set("Access-Control-Allow-Origin", origin);
|
||||
if (request.method === "OPTIONS") {
|
||||
// Send response to OPTIONS requests
|
||||
response.set("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
|
||||
response.set(
|
||||
"Access-Control-Allow-Headers",
|
||||
"Authorization,Content-Type"
|
||||
);
|
||||
response.set("Access-Control-Max-Age", "3600");
|
||||
response.status(204).send("");
|
||||
return;
|
||||
}
|
||||
request = request.body.data;
|
||||
|
||||
// 1 - available
|
||||
// -1 - unavailable (taken)
|
||||
// -2 - not valid name
|
||||
// -999 - unknown error
|
||||
try {
|
||||
if (!isUsernameValid(request.name)) return -2;
|
||||
if (!isUsernameValid(request.name)) {
|
||||
response.status(200).send({
|
||||
data: {
|
||||
resultCode: -2,
|
||||
message: "Username is not valid",
|
||||
},
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
let takendata = await db
|
||||
.collection("takenNames")
|
||||
|
@ -150,9 +174,21 @@ exports.checkNameAvailability = functions.https.onCall(
|
|||
takendata = takendata.data();
|
||||
|
||||
if (takendata !== undefined && takendata.taken) {
|
||||
return -1;
|
||||
response.status(200).send({
|
||||
data: {
|
||||
resultCode: -1,
|
||||
message: "Username is taken",
|
||||
},
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
return 1;
|
||||
response.status(200).send({
|
||||
data: {
|
||||
resultCode: 1,
|
||||
message: "Username is available",
|
||||
},
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// return getAllNames().then((data) => {
|
||||
|
@ -167,8 +203,17 @@ exports.checkNameAvailability = functions.https.onCall(
|
|||
// return available;
|
||||
// });
|
||||
} catch (e) {
|
||||
console.log(e.message);
|
||||
return -999;
|
||||
console.error(
|
||||
`Error while checking name availability for ${request.name}:` +
|
||||
e.message
|
||||
);
|
||||
response.status(200).send({
|
||||
data: {
|
||||
resultCode: -999,
|
||||
message: "Unexpected error: " + e,
|
||||
},
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -456,7 +501,7 @@ function checkIfPB(uid, obj, userdata) {
|
|||
}
|
||||
}
|
||||
|
||||
async function checkIfTagPB(uid, obj) {
|
||||
async function checkIfTagPB(uid, obj, userdata) {
|
||||
if (obj.tags.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
@ -471,24 +516,152 @@ async function checkIfTagPB(uid, obj) {
|
|||
dbtags.push(data);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
let wpm = obj.wpm;
|
||||
|
||||
let ret = [];
|
||||
for (let i = 0; i < dbtags.length; i++) {
|
||||
let dbtag = dbtags[i];
|
||||
if (dbtag.pb === undefined || dbtag.pb < wpm) {
|
||||
//no pb found, meaning this one is a pb
|
||||
await db.collection(`users/${uid}/tags`).doc(dbtag.id).update({
|
||||
pb: wpm,
|
||||
let pbs = null;
|
||||
try {
|
||||
pbs = dbtags[i].personalBests;
|
||||
if (pbs === undefined) {
|
||||
throw new Error("pb is undefined");
|
||||
}
|
||||
} catch (e) {
|
||||
//undefined personal best = new personal best
|
||||
db.collection(`users/${uid}/tags`)
|
||||
.doc(dbtags[i].id)
|
||||
.set(
|
||||
{
|
||||
personalBests: {
|
||||
[obj.mode]: {
|
||||
[obj.mode2]: [
|
||||
{
|
||||
language: obj.language,
|
||||
difficulty: obj.difficulty,
|
||||
punctuation: obj.punctuation,
|
||||
wpm: obj.wpm,
|
||||
acc: obj.acc,
|
||||
raw: obj.rawWpm,
|
||||
timestamp: Date.now(),
|
||||
consistency: obj.consistency,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{ merge: true }
|
||||
)
|
||||
.then((e) => {
|
||||
ret.push(dbtags[i].id);
|
||||
});
|
||||
continue;
|
||||
}
|
||||
let toUpdate = false;
|
||||
let found = false;
|
||||
try {
|
||||
if (pbs[obj.mode][obj.mode2] === undefined) {
|
||||
pbs[obj.mode][obj.mode2] = [];
|
||||
}
|
||||
pbs[obj.mode][obj.mode2].forEach((pb) => {
|
||||
if (
|
||||
pb.punctuation === obj.punctuation &&
|
||||
pb.difficulty === obj.difficulty &&
|
||||
pb.language === obj.language
|
||||
) {
|
||||
//entry like this already exists, compare wpm
|
||||
found = true;
|
||||
if (pb.wpm < obj.wpm) {
|
||||
//new pb
|
||||
pb.wpm = obj.wpm;
|
||||
pb.acc = obj.acc;
|
||||
pb.raw = obj.rawWpm;
|
||||
pb.timestamp = Date.now();
|
||||
pb.consistency = obj.consistency;
|
||||
toUpdate = true;
|
||||
} else {
|
||||
//no pb
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
ret.push(dbtag.id);
|
||||
//checked all pbs, nothing found - meaning this is a new pb
|
||||
if (!found) {
|
||||
pbs[obj.mode][obj.mode2].push({
|
||||
language: obj.language,
|
||||
difficulty: obj.difficulty,
|
||||
punctuation: obj.punctuation,
|
||||
wpm: obj.wpm,
|
||||
acc: obj.acc,
|
||||
raw: obj.rawWpm,
|
||||
timestamp: Date.now(),
|
||||
consistency: obj.consistency,
|
||||
});
|
||||
toUpdate = true;
|
||||
}
|
||||
} catch (e) {
|
||||
// console.log(e);
|
||||
pbs[obj.mode] = {};
|
||||
pbs[obj.mode][obj.mode2] = [
|
||||
{
|
||||
language: obj.language,
|
||||
difficulty: obj.difficulty,
|
||||
punctuation: obj.punctuation,
|
||||
wpm: obj.wpm,
|
||||
acc: obj.acc,
|
||||
raw: obj.rawWpm,
|
||||
timestamp: Date.now(),
|
||||
consistency: obj.consistency,
|
||||
},
|
||||
];
|
||||
toUpdate = true;
|
||||
}
|
||||
|
||||
if (toUpdate) {
|
||||
db.collection(`users/${uid}/tags`)
|
||||
.doc(dbtags[i].id)
|
||||
.update({ personalBests: pbs });
|
||||
ret.push(dbtags[i].id);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//old
|
||||
// async function checkIfTagPB(uid, obj) {
|
||||
// if (obj.tags.length === 0) {
|
||||
// return [];
|
||||
// }
|
||||
// let dbtags = [];
|
||||
// let restags = obj.tags;
|
||||
// try {
|
||||
// let snap = await db.collection(`users/${uid}/tags`).get();
|
||||
// snap.forEach((doc) => {
|
||||
// if (restags.includes(doc.id)) {
|
||||
// let data = doc.data();
|
||||
// data.id = doc.id;
|
||||
// dbtags.push(data);
|
||||
// }
|
||||
// });
|
||||
// } catch (e) {
|
||||
// return [];
|
||||
// }
|
||||
// let wpm = obj.wpm;
|
||||
// let ret = [];
|
||||
// for (let i = 0; i < dbtags.length; i++) {
|
||||
// let dbtag = dbtags[i];
|
||||
// if (dbtag.pb === undefined || dbtag.pb < wpm) {
|
||||
// //no pb found, meaning this one is a pb
|
||||
// await db.collection(`users/${uid}/tags`).doc(dbtag.id).update({
|
||||
// pb: wpm,
|
||||
// });
|
||||
// ret.push(dbtag.id);
|
||||
// }
|
||||
// }
|
||||
// return ret;
|
||||
// }
|
||||
|
||||
exports.clearTagPb = functions.https.onCall((request, response) => {
|
||||
try {
|
||||
return db
|
||||
|
@ -588,14 +761,14 @@ function validateResult(result) {
|
|||
}
|
||||
|
||||
exports.requestTest = functions.https.onRequest((request, response) => {
|
||||
response.set("Access-Control-Allow-Origin", "*");
|
||||
response.set("Access-Control-Allow-Origin", origin);
|
||||
response.set("Access-Control-Allow-Headers", "*");
|
||||
response.set("Access-Control-Allow-Credentials", "true");
|
||||
response.status(200).send({ data: "test" });
|
||||
});
|
||||
|
||||
exports.getPatreons = functions.https.onRequest(async (request, response) => {
|
||||
response.set("Access-Control-Allow-Origin", "*");
|
||||
response.set("Access-Control-Allow-Origin", origin);
|
||||
response.set("Access-Control-Allow-Headers", "*");
|
||||
response.set("Access-Control-Allow-Credentials", "true");
|
||||
if (request.method === "OPTIONS") {
|
||||
|
@ -629,7 +802,7 @@ exports.getPatreons = functions.https.onRequest(async (request, response) => {
|
|||
});
|
||||
|
||||
exports.verifyUser = functions.https.onRequest(async (request, response) => {
|
||||
response.set("Access-Control-Allow-Origin", "*");
|
||||
response.set("Access-Control-Allow-Origin", origin);
|
||||
response.set("Access-Control-Allow-Headers", "*");
|
||||
response.set("Access-Control-Allow-Credentials", "true");
|
||||
if (request.method === "OPTIONS") {
|
||||
|
@ -1002,7 +1175,7 @@ async function incrementTimeSpentTyping(uid, res, userData) {
|
|||
}
|
||||
|
||||
exports.testCompleted = functions.https.onRequest(async (request, response) => {
|
||||
response.set("Access-Control-Allow-Origin", "*");
|
||||
response.set("Access-Control-Allow-Origin", origin);
|
||||
if (request.method === "OPTIONS") {
|
||||
// Send response to OPTIONS requests
|
||||
response.set("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
|
||||
|
@ -1055,7 +1228,13 @@ exports.testCompleted = functions.https.onRequest(async (request, response) => {
|
|||
return;
|
||||
}
|
||||
|
||||
if (obj.wpm <= 0 || obj.wpm > 350 || obj.acc < 50 || obj.acc > 100) {
|
||||
if (
|
||||
obj.wpm <= 0 ||
|
||||
obj.wpm > 350 ||
|
||||
obj.acc < 50 ||
|
||||
obj.acc > 100 ||
|
||||
obj.consistency > 100
|
||||
) {
|
||||
response.status(200).send({ data: { resultCode: -1 } });
|
||||
return;
|
||||
}
|
||||
|
@ -1426,12 +1605,12 @@ exports.addTag = functions.https.onCall((request, response) => {
|
|||
console.error(
|
||||
`error while creating tag for user ${request.uid}: ${e.message}`
|
||||
);
|
||||
return { resultCode: -999 };
|
||||
return { resultCode: -999, message: e.message };
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`error adding tag for ${request.uid} - ${e}`);
|
||||
return { resultCode: -999 };
|
||||
return { resultCode: -999, message: e.message };
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -1456,12 +1635,12 @@ exports.editTag = functions.https.onCall((request, response) => {
|
|||
console.error(
|
||||
`error while updating tag for user ${request.uid}: ${e.message}`
|
||||
);
|
||||
return { resultCode: -999 };
|
||||
return { resultCode: -999, message: e.message };
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`error updating tag for ${request.uid} - ${e}`);
|
||||
return { resultCode: -999 };
|
||||
return { resultCode: -999, message: e.message };
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -1522,7 +1701,7 @@ exports.updateResultTags = functions.https.onCall((request, response) => {
|
|||
}
|
||||
} catch (e) {
|
||||
console.error(`error updating tags by ${request.uid} - ${e}`);
|
||||
return { resultCode: -999 };
|
||||
return { resultCode: -999, message: e };
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -1984,7 +2163,7 @@ class Leaderboard {
|
|||
// });
|
||||
|
||||
exports.unlinkDiscord = functions.https.onRequest((request, response) => {
|
||||
response.set("Access-Control-Allow-Origin", "*");
|
||||
response.set("Access-Control-Allow-Origin", origin);
|
||||
if (request.method === "OPTIONS") {
|
||||
// Send response to OPTIONS requests
|
||||
response.set("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
|
||||
|
|
|
@ -93,6 +93,7 @@ const refactoredSrc = [
|
|||
"./src/js/layouts.js",
|
||||
"./src/js/monkey.js",
|
||||
"./src/js/result-filters.js",
|
||||
"./src/js/notification-center.js",
|
||||
];
|
||||
|
||||
//legacy files
|
||||
|
|
|
@ -24,7 +24,7 @@ function signIn() {
|
|||
changePage("test");
|
||||
})
|
||||
.catch(function (error) {
|
||||
Misc.showNotification(error.message, 5000);
|
||||
Notifications.add(error.message, -1);
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
});
|
||||
});
|
||||
|
@ -41,7 +41,7 @@ function signIn() {
|
|||
changePage("test");
|
||||
})
|
||||
.catch(function (error) {
|
||||
Misc.showNotification(error.message, 5000);
|
||||
Notifications.add(error.message, -1);
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
});
|
||||
});
|
||||
|
@ -59,27 +59,27 @@ function signUp() {
|
|||
let passwordVerify = $(".pageLogin .register input")[3].value;
|
||||
|
||||
if (password != passwordVerify) {
|
||||
Misc.showNotification("Passwords do not match", 3000);
|
||||
Notifications.add("Passwords do not match", 0, 3);
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
$(".pageLogin .register .button").removeClass("disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
CloudFunctions.namecheck({ name: nname }).then((d) => {
|
||||
if (d.data === -1) {
|
||||
Misc.showNotification("Name unavailable", 3000);
|
||||
if (d.data.resultCode === -1) {
|
||||
Notifications.add("Name unavailable", -1);
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
$(".pageLogin .register .button").removeClass("disabled");
|
||||
return;
|
||||
} else if (d.data === -2) {
|
||||
Misc.showNotification(
|
||||
} else if (d.data.resultCode === -2) {
|
||||
Notifications.add(
|
||||
"Name cannot contain special characters or contain more than 14 characters. Can include _ . and -",
|
||||
8000
|
||||
-1
|
||||
);
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
$(".pageLogin .register .button").removeClass("disabled");
|
||||
return;
|
||||
} else if (d.data === 1) {
|
||||
} else if (d.data.resultCode === 1) {
|
||||
firebase
|
||||
.auth()
|
||||
.createUserWithEmailAndPassword(email, password)
|
||||
|
@ -106,7 +106,7 @@ function signUp() {
|
|||
);
|
||||
usr.sendEmailVerification();
|
||||
clearGlobalStats();
|
||||
Misc.showNotification("Account created", 2000);
|
||||
Notifications.add("Account created", 1, 3);
|
||||
$("#menu .icon-button.account .text").text(nname);
|
||||
try {
|
||||
firebase.analytics().logEvent("accountCreated", usr.uid);
|
||||
|
@ -144,15 +144,19 @@ function signUp() {
|
|||
.delete()
|
||||
.then(function () {
|
||||
// User deleted.
|
||||
Misc.showNotification(
|
||||
"An error occured. Account not created.",
|
||||
2000
|
||||
Notifications.add(
|
||||
"Account not created. " + error.message,
|
||||
-1
|
||||
);
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
})
|
||||
.catch(function (error) {
|
||||
// An error happened.
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
Notifications.add(
|
||||
"Something went wrong. " + error.message,
|
||||
-1
|
||||
);
|
||||
console.error(error);
|
||||
});
|
||||
});
|
||||
|
@ -160,10 +164,14 @@ function signUp() {
|
|||
.catch(function (error) {
|
||||
// Handle Errors here.
|
||||
$(".pageLogin .register .button").removeClass("disabled");
|
||||
var errorMessage = error.message;
|
||||
Misc.showNotification(errorMessage, 5000);
|
||||
Notifications.add(error.message, -1);
|
||||
$(".pageLogin .preloader").addClass("hidden");
|
||||
});
|
||||
} else {
|
||||
Notifications.add(
|
||||
"Something went wrong when checking name: " + d.data.message,
|
||||
-1
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -173,7 +181,7 @@ function signOut() {
|
|||
.auth()
|
||||
.signOut()
|
||||
.then(function () {
|
||||
Misc.showNotification("Signed out", 2000);
|
||||
Notifications.add("Signed out", 0, 2);
|
||||
clearGlobalStats();
|
||||
hideAccountSettingsSection();
|
||||
updateAccountLoginButton();
|
||||
|
@ -181,7 +189,7 @@ function signOut() {
|
|||
db_setSnapshot(null);
|
||||
})
|
||||
.catch(function (error) {
|
||||
Misc.showNotification(error.message, 5000);
|
||||
Notifications.add(error.message, -1);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -221,13 +229,15 @@ firebase.auth().onAuthStateChanged(function (user) {
|
|||
$(".pageAccount .group.createdDate").text(text);
|
||||
|
||||
if (verifyUserWhenLoggedIn !== null) {
|
||||
Misc.showNotification("Verifying", 1000);
|
||||
Notifications.add("Verifying", 0, 3);
|
||||
verifyUserWhenLoggedIn.uid = user.uid;
|
||||
CloudFunctions.verifyUser(verifyUserWhenLoggedIn).then((data) => {
|
||||
Misc.showNotification(data.data.message, 3000);
|
||||
if (data.data.status === 1) {
|
||||
Notifications.add(data.data.message, 1);
|
||||
db_getSnapshot().discordId = data.data.did;
|
||||
updateDiscordSettingsSection();
|
||||
} else {
|
||||
Notifications.add(data.data.message, -1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -237,11 +247,11 @@ firebase.auth().onAuthStateChanged(function (user) {
|
|||
try {
|
||||
theme = theme.split(",");
|
||||
config.customThemeColors = theme;
|
||||
Misc.showNotification("Custom theme applied.", 1000);
|
||||
Notifications.add("Custom theme applied.", 1);
|
||||
} catch (e) {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong. Reverting to default custom colors.",
|
||||
3000
|
||||
0
|
||||
);
|
||||
config.customThemeColors = defaultConfig.customThemeColors;
|
||||
}
|
||||
|
@ -366,9 +376,9 @@ function getAccountDataAndInit() {
|
|||
.catch((e) => {
|
||||
accountIconLoading(false);
|
||||
console.error(e);
|
||||
Misc.showNotification(
|
||||
"Error downloading user data. Refresh to try again. If error persists contact Miodec.",
|
||||
5000
|
||||
Notifications.add(
|
||||
"Error downloading user data - refresh to try again. Client likely could not connect to the backend, if error persists contact Miodec.",
|
||||
-1
|
||||
);
|
||||
$("#top #menu .account .icon").html('<i class="fas fa-fw fa-times"></i>');
|
||||
$("#top #menu .account").css("opacity", 1);
|
||||
|
@ -1004,9 +1014,9 @@ function toggleFilter(group, filter) {
|
|||
ResultFilters.toggleFilter(group, filter);
|
||||
ResultFilters.save();
|
||||
} catch (e) {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong toggling filter. Reverting to defaults",
|
||||
3000
|
||||
0
|
||||
);
|
||||
console.log("toggling filter error");
|
||||
console.error(e);
|
||||
|
@ -1851,9 +1861,9 @@ function refreshAccountPage() {
|
|||
|
||||
filteredResults.push(result);
|
||||
} catch (e) {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong when filtering. Resetting filters.",
|
||||
5000
|
||||
0
|
||||
);
|
||||
console.log(result);
|
||||
console.error(e);
|
||||
|
@ -2206,7 +2216,7 @@ function refreshAccountPage() {
|
|||
swapElements($(".pageAccount .preloader"), $(".pageAccount .content"), 250);
|
||||
}
|
||||
if (db_getSnapshot() === null) {
|
||||
Misc.showNotification(`Missing account data. Please refresh.`, 5000);
|
||||
Notifications.add(`Missing account data. Please refresh.`, -1);
|
||||
$(".pageAccount .preloader").html("Missing account data. Please refresh.");
|
||||
} else if (db_getSnapshot().results === undefined) {
|
||||
db_getUserResults().then((d) => {
|
||||
|
@ -2224,7 +2234,7 @@ function refreshAccountPage() {
|
|||
cont();
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
Misc.showNotification(`Something went wrong: ${e}`, 5000);
|
||||
Notifications.add(`Something went wrong: ${e}`, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2326,7 +2336,7 @@ $("#resultEditTagsPanel .confirmButton").click((f) => {
|
|||
}).then((r) => {
|
||||
hideBackgroundLoader();
|
||||
if (r.data.resultCode === 1) {
|
||||
Misc.showNotification("Tags updated.", 3000);
|
||||
Notifications.add("Tags updated.", 1, 2);
|
||||
db_getSnapshot().results.forEach((result) => {
|
||||
if (result.id === resultid) {
|
||||
result.tags = newtags;
|
||||
|
@ -2377,7 +2387,7 @@ $("#resultEditTagsPanel .confirmButton").click((f) => {
|
|||
);
|
||||
}
|
||||
} else {
|
||||
Misc.showNotification("Error updating tags", 3000);
|
||||
Notifications.add("Error updating tags: " + r.data.message, -1);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -2425,11 +2435,11 @@ $(".pageLogin #forgotPasswordButton").click((e) => {
|
|||
.sendPasswordResetEmail(email)
|
||||
.then(function () {
|
||||
// Email sent.
|
||||
Misc.showNotification("Email sent", 2000);
|
||||
Notifications.add("Email sent", 1, 2);
|
||||
})
|
||||
.catch(function (error) {
|
||||
// An error happened.
|
||||
Misc.showNotification(error.message, 5000);
|
||||
Notifications.add(error.message, -1);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
function canBailOut() {
|
||||
return (
|
||||
(config.mode === "custom" &&
|
||||
customTextIsRandom &&
|
||||
customTextWordCount >= 5000) ||
|
||||
customText.isWordRandom &&
|
||||
customText.word >= 5000) ||
|
||||
(config.mode === "custom" &&
|
||||
!customTextIsRandom &&
|
||||
customText.length >= 5000) ||
|
||||
!customText.isWordRandom &&
|
||||
!customText.isTimeRandom &&
|
||||
customText.text.length >= 5000) ||
|
||||
(config.mode === "custom" &&
|
||||
customText.isTimeRandom &&
|
||||
customText.time >= 3600) ||
|
||||
(config.mode === "words" && config.words >= 5000) ||
|
||||
config.words === 0 ||
|
||||
(config.mode === "time" && (config.time >= 3600 || config.time === 0)) ||
|
||||
|
@ -885,7 +889,7 @@ let commandsEnableAds = {
|
|||
display: "off",
|
||||
exec: () => {
|
||||
setEnableAds("off");
|
||||
Misc.showNotification("Don't forget to refresh the page!", 3000);
|
||||
Notifications.add("Don't forget to refresh the page!", 0);
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -893,7 +897,7 @@ let commandsEnableAds = {
|
|||
display: "on",
|
||||
exec: () => {
|
||||
setEnableAds("on");
|
||||
Misc.showNotification("Don't forget to refresh the page!", 3000);
|
||||
Notifications.add("Don't forget to refresh the page!", 0);
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -901,7 +905,7 @@ let commandsEnableAds = {
|
|||
display: "Sellout",
|
||||
exec: () => {
|
||||
setEnableAds("max");
|
||||
Misc.showNotification("Don't forget to refresh the page!", 3000);
|
||||
Notifications.add("Don't forget to refresh the page!", 0);
|
||||
},
|
||||
},
|
||||
],
|
||||
|
|
130
src/js/db.js
130
src/js/db.js
|
@ -45,6 +45,9 @@ export async function db_getUserSnapshot() {
|
|||
data.docs.forEach((doc) => {
|
||||
let tag = doc.data();
|
||||
tag.id = doc.id;
|
||||
if (tag.personalBests === undefined) {
|
||||
tag.personalBests = {};
|
||||
}
|
||||
snap.tags.push(tag);
|
||||
});
|
||||
snap.tags = snap.tags.sort((a, b) => {
|
||||
|
@ -305,14 +308,27 @@ export async function db_saveLocalPB(
|
|||
}
|
||||
}
|
||||
|
||||
export async function db_getLocalTagPB(tagId) {
|
||||
export async function db_getLocalTagPB(
|
||||
tagId,
|
||||
mode,
|
||||
mode2,
|
||||
punctuation,
|
||||
language,
|
||||
difficulty
|
||||
) {
|
||||
function cont() {
|
||||
let ret = 0;
|
||||
let filteredtag = dbSnapshot.tags.filter((t) => t.id === tagId)[0];
|
||||
try {
|
||||
ret = dbSnapshot.tags.filter((t) => t.id === tagId)[0].pb;
|
||||
if (ret == undefined) {
|
||||
ret = 0;
|
||||
}
|
||||
filteredtag.personalBests[mode][mode2].forEach((pb) => {
|
||||
if (
|
||||
pb.punctuation == punctuation &&
|
||||
pb.difficulty == difficulty &&
|
||||
pb.language == language
|
||||
) {
|
||||
ret = pb.wpm;
|
||||
}
|
||||
});
|
||||
return ret;
|
||||
} catch (e) {
|
||||
return ret;
|
||||
|
@ -320,22 +336,114 @@ export async function db_getLocalTagPB(tagId) {
|
|||
}
|
||||
|
||||
let retval;
|
||||
if (dbSnapshot != null) {
|
||||
if (dbSnapshot == null) {
|
||||
retval = 0;
|
||||
} else {
|
||||
retval = cont();
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
export async function db_saveLocalTagPB(tagId, wpm) {
|
||||
export async function db_saveLocalTagPB(
|
||||
tagId,
|
||||
mode,
|
||||
mode2,
|
||||
punctuation,
|
||||
language,
|
||||
difficulty,
|
||||
wpm,
|
||||
acc,
|
||||
raw,
|
||||
consistency
|
||||
) {
|
||||
function cont() {
|
||||
dbSnapshot.tags.forEach((tag) => {
|
||||
if (tag.id === tagId) {
|
||||
tag.pb = wpm;
|
||||
let filteredtag = dbSnapshot.tags.filter((t) => t.id === tagId)[0];
|
||||
try {
|
||||
let found = false;
|
||||
if (filteredtag.personalBests[mode][mode2] === undefined) {
|
||||
filteredtag.personalBests[mode][mode2] = [];
|
||||
}
|
||||
});
|
||||
filteredtag.personalBests[mode][mode2].forEach((pb) => {
|
||||
if (
|
||||
pb.punctuation == punctuation &&
|
||||
pb.difficulty == difficulty &&
|
||||
pb.language == language
|
||||
) {
|
||||
found = true;
|
||||
pb.wpm = wpm;
|
||||
pb.acc = acc;
|
||||
pb.raw = raw;
|
||||
pb.timestamp = Date.now();
|
||||
pb.consistency = consistency;
|
||||
}
|
||||
});
|
||||
if (!found) {
|
||||
//nothing found
|
||||
filteredtag.personalBests[mode][mode2].push({
|
||||
language: language,
|
||||
difficulty: difficulty,
|
||||
punctuation: punctuation,
|
||||
wpm: wpm,
|
||||
acc: acc,
|
||||
raw: raw,
|
||||
timestamp: Date.now(),
|
||||
consistency: consistency,
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
//that mode or mode2 is not found
|
||||
filteredtag.personalBests[mode] = {};
|
||||
filteredtag.personalBests[mode][mode2] = [
|
||||
{
|
||||
language: language,
|
||||
difficulty: difficulty,
|
||||
punctuation: punctuation,
|
||||
wpm: wpm,
|
||||
acc: acc,
|
||||
raw: raw,
|
||||
timestamp: Date.now(),
|
||||
consistency: consistency,
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (dbSnapshot != null) {
|
||||
cont();
|
||||
}
|
||||
}
|
||||
|
||||
// export async function db_getLocalTagPB(tagId) {
|
||||
// function cont() {
|
||||
// let ret = 0;
|
||||
// try {
|
||||
// ret = dbSnapshot.tags.filter((t) => t.id === tagId)[0].pb;
|
||||
// if (ret == undefined) {
|
||||
// ret = 0;
|
||||
// }
|
||||
// return ret;
|
||||
// } catch (e) {
|
||||
// return ret;
|
||||
// }
|
||||
// }
|
||||
|
||||
// let retval;
|
||||
// if (dbSnapshot != null) {
|
||||
// retval = cont();
|
||||
// }
|
||||
// return retval;
|
||||
// }
|
||||
|
||||
// export async function db_saveLocalTagPB(tagId, wpm) {
|
||||
// function cont() {
|
||||
// dbSnapshot.tags.forEach((tag) => {
|
||||
// if (tag.id === tagId) {
|
||||
// tag.pb = wpm;
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
// if (dbSnapshot != null) {
|
||||
// cont();
|
||||
// }
|
||||
// }
|
||||
|
|
|
@ -7,3 +7,4 @@ global.sendVerificationEmail = Misc.sendVerificationEmail;
|
|||
//these exports are just for debugging in the browser
|
||||
global.snapshot = db_getSnapshot;
|
||||
global.config = config;
|
||||
global.addnotif = Notifications.add;
|
||||
|
|
|
@ -25,4 +25,5 @@ import * as Misc from "./misc";
|
|||
import * as CloudFunctions from "./cloud-functions";
|
||||
import layouts from "./layouts";
|
||||
import * as Monkey from "./monkey";
|
||||
import * as Notifications from "./notification-center";
|
||||
import * as ResultFilters from "./result-filters";
|
||||
|
|
|
@ -217,7 +217,8 @@ function updateLeaderboards() {
|
|||
}
|
||||
})
|
||||
.catch((e) => {
|
||||
Misc.showNotification("Something went wrong", 3000);
|
||||
hideBackgroundLoader();
|
||||
Notifications.add("Something went wrong: " + e.message, -1);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ function hexToHSL(H) {
|
|||
let themesList = null;
|
||||
export async function getThemesList() {
|
||||
if (themesList == null) {
|
||||
return $.getJSON("themes/list.json", function (data) {
|
||||
return $.getJSON("themes/_list.json", function (data) {
|
||||
const list = data.sort(function (a, b) {
|
||||
const nameA = a.name.toLowerCase();
|
||||
const nameB = b.name.toLowerCase();
|
||||
|
@ -87,7 +87,7 @@ export async function getSortedThemesList() {
|
|||
let funboxList = null;
|
||||
export async function getFunboxList() {
|
||||
if (funboxList == null) {
|
||||
return $.getJSON("funbox/list.json", function (data) {
|
||||
return $.getJSON("funbox/_list.json", function (data) {
|
||||
funboxList = data.sort(function (a, b) {
|
||||
const nameA = a.name.toLowerCase();
|
||||
const nameB = b.name.toLowerCase();
|
||||
|
@ -105,7 +105,7 @@ export async function getFunboxList() {
|
|||
let fontsList = null;
|
||||
export async function getFontsList() {
|
||||
if (fontsList == null) {
|
||||
return $.getJSON("js/fonts.json", function (data) {
|
||||
return $.getJSON("fonts/_list.json", function (data) {
|
||||
fontsList = data.sort(function (a, b) {
|
||||
const nameA = a.name.toLowerCase();
|
||||
const nameB = b.name.toLowerCase();
|
||||
|
@ -123,7 +123,7 @@ export async function getFontsList() {
|
|||
let languageList = null;
|
||||
export async function getLanguageList() {
|
||||
if (languageList == null) {
|
||||
return $.getJSON("languages/list.json", function (data) {
|
||||
return $.getJSON("languages/_list.json", function (data) {
|
||||
languageList = data;
|
||||
return languageList;
|
||||
});
|
||||
|
@ -135,7 +135,7 @@ export async function getLanguageList() {
|
|||
let challengeList = null;
|
||||
export async function getChallengeList() {
|
||||
if (challengeList == null) {
|
||||
return $.getJSON("challenges/list.json", function (data) {
|
||||
return $.getJSON("challenges/_list.json", function (data) {
|
||||
challengeList = data;
|
||||
return challengeList;
|
||||
});
|
||||
|
|
131
src/js/notification-center.js
Normal file
131
src/js/notification-center.js
Normal file
|
@ -0,0 +1,131 @@
|
|||
const notificationHistory = [];
|
||||
let id = 0;
|
||||
class Notification {
|
||||
constructor(message, level, duration, customTitle, customIcon) {
|
||||
this.message = message;
|
||||
this.level = level;
|
||||
if (duration == undefined) {
|
||||
if (level === -1) {
|
||||
this.duration = 0;
|
||||
} else {
|
||||
this.duration = 3000;
|
||||
}
|
||||
} else {
|
||||
this.duration = duration * 1000;
|
||||
}
|
||||
this.customTitle = customTitle;
|
||||
this.customIcon = customIcon;
|
||||
this.id = id++;
|
||||
}
|
||||
//level
|
||||
//0 - notice
|
||||
//1 - good
|
||||
//-1 - bad
|
||||
show() {
|
||||
let cls = "notice";
|
||||
let icon = `<i class="fas fa-fw fa-exclamation"></i>`;
|
||||
let title = "Notice";
|
||||
if (this.level === 1) {
|
||||
cls = "good";
|
||||
icon = `<i class="fas fa-fw fa-check"></i>`;
|
||||
title = "Success";
|
||||
} else if (this.level === -1) {
|
||||
cls = "bad";
|
||||
icon = `<i class="fas fa-fw fa-times"></i>`;
|
||||
title = "Error";
|
||||
console.error(this.message);
|
||||
}
|
||||
|
||||
if (this.customTitle != undefined) {
|
||||
title = this.customTitle;
|
||||
}
|
||||
|
||||
if (this.customIcon != undefined) {
|
||||
icon = `<i class="fas fa-fw fa-${this.customIcon}"></i>`;
|
||||
}
|
||||
|
||||
// moveCurrentToHistory();
|
||||
let oldHeight = $("#notificationCenter .history").height();
|
||||
$("#notificationCenter .history").prepend(`
|
||||
|
||||
<div class="notif ${cls}" id=${this.id}>
|
||||
<div class="icon">${icon}</div>
|
||||
<div class="message"><div class="title">${title}</div>${this.message}</div>
|
||||
</div>
|
||||
|
||||
`);
|
||||
let newHeight = $("#notificationCenter .history").height();
|
||||
$(`#notificationCenter .notif[id='${this.id}']`).remove();
|
||||
$("#notificationCenter .history")
|
||||
.css("margin-top", 0)
|
||||
.animate(
|
||||
{
|
||||
marginTop: newHeight - oldHeight,
|
||||
},
|
||||
125,
|
||||
() => {
|
||||
$("#notificationCenter .history").css("margin-top", 0);
|
||||
$("#notificationCenter .history").prepend(`
|
||||
|
||||
<div class="notif ${cls}" id=${this.id}>
|
||||
<div class="icon">${icon}</div>
|
||||
<div class="message"><div class="title">${title}</div>${this.message}</div>
|
||||
</div>
|
||||
|
||||
`);
|
||||
$(`#notificationCenter .notif[id='${this.id}']`)
|
||||
.css("opacity", 0)
|
||||
.animate(
|
||||
{
|
||||
opacity: 1,
|
||||
},
|
||||
125,
|
||||
() => {
|
||||
$(`#notificationCenter .notif[id='${this.id}']`).css(
|
||||
"opacity",
|
||||
""
|
||||
);
|
||||
}
|
||||
);
|
||||
$(`#notificationCenter .notif[id='${this.id}']`).click((e) => {
|
||||
this.hide();
|
||||
});
|
||||
}
|
||||
);
|
||||
if (this.duration > 0) {
|
||||
setTimeout(() => {
|
||||
this.hide();
|
||||
}, this.duration + 250);
|
||||
}
|
||||
$(`#notificationCenter .notif[id='${this.id}']`).hover((e) => {
|
||||
$(`#notificationCenter .notif[id='${this.id}']`).toggleClass("hover");
|
||||
});
|
||||
}
|
||||
hide() {
|
||||
$(`#notificationCenter .notif[id='${this.id}']`)
|
||||
.css("opacity", 1)
|
||||
.animate(
|
||||
{
|
||||
opacity: 0,
|
||||
},
|
||||
125,
|
||||
() => {
|
||||
$(`#notificationCenter .notif[id='${this.id}']`).animate(
|
||||
{
|
||||
height: 0,
|
||||
},
|
||||
125,
|
||||
() => {
|
||||
$(`#notificationCenter .notif[id='${this.id}']`).remove();
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function add(message, level, duration, customTitle, customIcon) {
|
||||
notificationHistory.push(
|
||||
new Notification(message, level, duration, customTitle, customIcon).show()
|
||||
);
|
||||
}
|
924
src/js/script.js
924
src/js/script.js
File diff suppressed because it is too large
Load diff
|
@ -473,9 +473,10 @@ function hideCustomThemeShare() {
|
|||
$("#customThemeShareWrapper input").val()
|
||||
);
|
||||
} catch (e) {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong. Reverting to default custom colors.",
|
||||
3000
|
||||
0,
|
||||
4
|
||||
);
|
||||
config.customThemeColors = defaultConfig.customThemeColors;
|
||||
}
|
||||
|
@ -524,12 +525,12 @@ $("#shareCustomThemeButton").click((e) => {
|
|||
Misc.objectToQueryString({ customTheme: share });
|
||||
navigator.clipboard.writeText(url).then(
|
||||
function () {
|
||||
Misc.showNotification("URL Copied to clipboard", 2000);
|
||||
Notifications.add("URL Copied to clipboard", 0);
|
||||
},
|
||||
function (err) {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong when copying the URL: " + err,
|
||||
5000
|
||||
-1
|
||||
);
|
||||
}
|
||||
);
|
||||
|
@ -583,7 +584,7 @@ function refreshTagsSettingsSection() {
|
|||
</div>
|
||||
<div class="title">${tag.name}</div>
|
||||
<div class="editButton"><i class="fas fa-pen"></i></div>
|
||||
<div class="clearPbButton" aria-label="${tagPbString}" data-balloon-pos="up"><i class="fas fa-crown"></i></div>
|
||||
<div class="clearPbButton hidden" aria-label="${tagPbString}" data-balloon-pos="up"><i class="fas fa-crown"></i></div>
|
||||
<div class="removeButton"><i class="fas fa-trash"></i></div>
|
||||
</div>
|
||||
|
||||
|
@ -597,7 +598,7 @@ function refreshTagsSettingsSection() {
|
|||
</div>
|
||||
<div class="title">${tag.name}</div>
|
||||
<div class="editButton"><i class="fas fa-pen"></i></div>
|
||||
<div class="clearPbButton" aria-label="${tagPbString}" data-balloon-pos="up"><i class="fas fa-crown"></i></div>
|
||||
<div class="clearPbButton hidden" aria-label="${tagPbString}" data-balloon-pos="up"><i class="fas fa-crown"></i></div>
|
||||
<div class="removeButton"><i class="fas fa-trash"></i></div>
|
||||
</div>
|
||||
|
||||
|
@ -766,7 +767,7 @@ $(
|
|||
})
|
||||
.catch((e) => {
|
||||
hideBackgroundLoader();
|
||||
Misc.showNotification("Something went wrong. Error: " + e.message, 4000);
|
||||
Notifications.add("Something went wrong. Error: " + e.message, -1);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -781,13 +782,10 @@ $(".pageSettings .section.discordIntegration #unlinkDiscordButton").click(
|
|||
console.log(ret);
|
||||
if (ret.data.status === 1) {
|
||||
db_getSnapshot().discordId = null;
|
||||
Misc.showNotification("Accounts unlinked", 2000);
|
||||
Notifications.add("Accounts unlinked", 0);
|
||||
updateDiscordSettingsSection();
|
||||
} else {
|
||||
Misc.showNotification(
|
||||
"Something went wrong: " + ret.data.message,
|
||||
5000
|
||||
);
|
||||
Notifications.add("Something went wrong: " + ret.data.message, -1);
|
||||
updateDiscordSettingsSection();
|
||||
}
|
||||
});
|
||||
|
@ -908,7 +906,7 @@ $(".pageSettings .saveCustomThemeButton").click((e) => {
|
|||
}
|
||||
);
|
||||
setCustomThemeColors(save);
|
||||
Misc.showNotification("Custom theme colors saved", 1000);
|
||||
Notifications.add("Custom theme colors saved", 0);
|
||||
});
|
||||
|
||||
$(".pageSettings #loadCustomColorsFromPreset").click((e) => {
|
||||
|
@ -960,12 +958,12 @@ $("#exportSettingsButton").click((e) => {
|
|||
let configJSON = JSON.stringify(config);
|
||||
navigator.clipboard.writeText(configJSON).then(
|
||||
function () {
|
||||
Misc.showNotification("JSON Copied to clipboard", 2000);
|
||||
Notifications.add("JSON Copied to clipboard", 0);
|
||||
},
|
||||
function (err) {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong when copying the settings JSON: " + err,
|
||||
5000
|
||||
-1
|
||||
);
|
||||
}
|
||||
);
|
||||
|
@ -991,9 +989,9 @@ function hideSettingsImport() {
|
|||
try {
|
||||
applyConfig(JSON.parse($("#settingsImportWrapper input").val()));
|
||||
} catch (e) {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"An error occured while importing settings: " + e,
|
||||
5000
|
||||
-1
|
||||
);
|
||||
}
|
||||
saveConfigToCookie();
|
||||
|
|
|
@ -150,21 +150,21 @@ simplePopups.updateEmail = new SimplePopup(
|
|||
}).then((data) => {
|
||||
hideBackgroundLoader();
|
||||
if (data.data.resultCode === 1) {
|
||||
Misc.showNotification("Email updated", 2000);
|
||||
Notifications.add("Email updated", 0);
|
||||
setTimeout(() => {
|
||||
signOut();
|
||||
}, 1000);
|
||||
} else if (data.data.resultCode === -1) {
|
||||
Misc.showNotification("Current email doesn't match", 2000);
|
||||
Notifications.add("Current email doesn't match", 0);
|
||||
} else {
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong: " + JSON.stringify(data.data),
|
||||
7000
|
||||
-1
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
Misc.showNotification("Something went wrong: " + e, 5000);
|
||||
Notifications.add("Something went wrong: " + e, -1);
|
||||
}
|
||||
},
|
||||
() => {}
|
||||
|
@ -192,21 +192,16 @@ simplePopups.clearTagPb = new SimplePopup(
|
|||
$(
|
||||
`.pageSettings .section.tags .tagsList .tag[id="${tagid}"] .clearPbButton`
|
||||
).attr("aria-label", "No PB found");
|
||||
Misc.showNotification("Tag PB cleared.", 1000);
|
||||
Notifications.add("Tag PB cleared.", 0);
|
||||
} else {
|
||||
console.error(res.data.message);
|
||||
Misc.showNotification(
|
||||
"Something went wrong: " + res.data.message,
|
||||
5000
|
||||
);
|
||||
Notifications.add("Something went wrong: " + res.data.message, -1);
|
||||
}
|
||||
})
|
||||
.catch((e) => {
|
||||
hideBackgroundLoader();
|
||||
console.error(e);
|
||||
Misc.showNotification(
|
||||
Notifications.add(
|
||||
"Something went wrong while clearing tag pb " + e,
|
||||
5000
|
||||
-1
|
||||
);
|
||||
});
|
||||
// console.log(`clearing for ${eval("this.parameters[0]")} ${eval("this.parameters[1]")}`);
|
||||
|
|
|
@ -104,23 +104,20 @@ async function saveConfigToCookie(noDbCheck = false) {
|
|||
}
|
||||
|
||||
async function saveConfigToDB() {
|
||||
// if (firebase.auth().currentUser !== null) {
|
||||
// accountIconLoading(true);
|
||||
// CloudFunctions.saveConfig({
|
||||
// uid: firebase.auth().currentUser.uid,
|
||||
// obj: config,
|
||||
// }).then((d) => {
|
||||
// accountIconLoading(false);
|
||||
// if (d.data.returnCode === 1) {
|
||||
// } else {
|
||||
// Misc.showNotification(
|
||||
// `Error saving config to DB! ${d.data.message}`,
|
||||
// 4000
|
||||
// );
|
||||
// }
|
||||
// return;
|
||||
// });
|
||||
// }
|
||||
if (firebase.auth().currentUser !== null) {
|
||||
accountIconLoading(true);
|
||||
CloudFunctions.saveConfig({
|
||||
uid: firebase.auth().currentUser.uid,
|
||||
obj: config,
|
||||
}).then((d) => {
|
||||
accountIconLoading(false);
|
||||
if (d.data.returnCode === 1) {
|
||||
} else {
|
||||
Notifications.add(`Error saving config to DB! ${d.data.message}`, 4000);
|
||||
}
|
||||
return;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function resetConfig() {
|
||||
|
@ -680,7 +677,7 @@ function setHighlightMode(mode, nosave) {
|
|||
mode === "word" &&
|
||||
(activeFunBox === "nospace" || activeFunBox === "read_ahead")
|
||||
) {
|
||||
Misc.showNotification("Can't use word highlight with this funbox", 3000);
|
||||
Notifications.add("Can't use word highlight with this funbox", 0);
|
||||
return;
|
||||
}
|
||||
if (mode == null || mode == undefined) {
|
||||
|
@ -1145,7 +1142,7 @@ function randomiseTheme() {
|
|||
randomList = config.favThemes;
|
||||
randomTheme = randomList[Math.floor(Math.random() * randomList.length)];
|
||||
setTheme(randomTheme, true);
|
||||
Misc.showNotification(randomTheme.replace(/_/g, " "), 1500);
|
||||
Notifications.add(randomTheme.replace(/_/g, " "), 0);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1482,8 +1479,7 @@ function setFontSize(fontSize, nosave) {
|
|||
|
||||
function applyConfig(configObj) {
|
||||
if (configObj == null || configObj == undefined) {
|
||||
Misc.showNotification("Could not apply config", 1000);
|
||||
console.error("configobj is null or undefined");
|
||||
Notifications.add("Could not apply config", -1);
|
||||
return;
|
||||
}
|
||||
Object.keys(defaultConfig).forEach((configKey) => {
|
||||
|
|
|
@ -415,6 +415,13 @@ a:hover {
|
|||
justify-items: left;
|
||||
}
|
||||
|
||||
.randomInputFields {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
text-align: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.check {
|
||||
span {
|
||||
display: block;
|
||||
|
@ -697,6 +704,82 @@ a:hover {
|
|||
}
|
||||
}
|
||||
|
||||
#notificationCenter {
|
||||
width: 350px;
|
||||
z-index: 99999999;
|
||||
display: grid;
|
||||
gap: 1rem;
|
||||
position: fixed;
|
||||
right: 1rem;
|
||||
top: 1rem;
|
||||
.history {
|
||||
display: grid;
|
||||
gap: 1rem;
|
||||
}
|
||||
.notif {
|
||||
.icon {
|
||||
color: var(--bg-color);
|
||||
opacity: 0.5;
|
||||
padding: 1rem 1rem;
|
||||
align-items: center;
|
||||
display: grid;
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
.message {
|
||||
padding: 1rem 1rem 1rem 0;
|
||||
.title {
|
||||
color: var(--bg-color);
|
||||
font-size: 0.75em;
|
||||
opacity: 0.5;
|
||||
line-height: 0.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
position: relative;
|
||||
background: var(--sub-color);
|
||||
color: var(--bg-color);
|
||||
display: grid;
|
||||
grid-template-columns: min-content auto min-content;
|
||||
border-radius: var(--roundness);
|
||||
border-width: 0.25rem;
|
||||
|
||||
&.bad {
|
||||
background-color: var(--error-color);
|
||||
}
|
||||
|
||||
&.good {
|
||||
background-color: var(--main-color);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
// opacity: .5;
|
||||
// box-shadow: 0 0 20px rgba(0,0,0,.25);
|
||||
cursor: pointer;
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
&::after {
|
||||
transition: 0.125s;
|
||||
font-family: "Font Awesome 5 Free";
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
opacity: 0;
|
||||
font-weight: 900;
|
||||
content: "\f00d";
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
color: var(--bg-color);
|
||||
font-size: 2.5rem;
|
||||
display: grid;
|
||||
/* align-self: center; */
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
border-radius: var(--roundness);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#supportMeWrapper {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
@ -1704,6 +1787,10 @@ key {
|
|||
user-select: none;
|
||||
padding-bottom: 1em;
|
||||
|
||||
.newline {
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
letter {
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 0.05em;
|
||||
|
@ -1712,6 +1799,11 @@ key {
|
|||
border-bottom-width: 0.05em;
|
||||
border-bottom-color: var(--sub-color);
|
||||
}
|
||||
&.tabChar,
|
||||
&.nlChar {
|
||||
margin: 0 0.25rem;
|
||||
opacity: 0.2;
|
||||
}
|
||||
}
|
||||
|
||||
/* a little hack for right-to-left languages */
|
||||
|
@ -1970,6 +2062,14 @@ key {
|
|||
display: inline-block;
|
||||
}
|
||||
|
||||
&.lastbeforenewline::after {
|
||||
font-family: "Font Awesome 5 Free";
|
||||
font-weight: 600;
|
||||
content: "\f107";
|
||||
margin-left: 0.5rem;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
// transition: .25s;
|
||||
.wordInputAfter {
|
||||
opacity: 1;
|
||||
|
@ -2045,6 +2145,10 @@ key {
|
|||
border-bottom: 2px dotted var(--main-color);
|
||||
}
|
||||
|
||||
.word letter.extraCorrected {
|
||||
border-right: 2px dotted var(--main-color);
|
||||
}
|
||||
|
||||
.word letter.incorrect {
|
||||
color: var(--error-color);
|
||||
position: relative;
|
||||
|
|
|
@ -49,6 +49,9 @@
|
|||
|
||||
<body>
|
||||
<div id="backgroundLoader" style="display: none"></div>
|
||||
<div id="notificationCenter">
|
||||
<div class="history"></div>
|
||||
</div>
|
||||
<div
|
||||
class="nameChangeMessage"
|
||||
style="
|
||||
|
@ -107,10 +110,17 @@
|
|||
generated.
|
||||
</span>
|
||||
</label>
|
||||
<label class="wordcount">
|
||||
Word count
|
||||
<input type="number" value="1" min="1" max="10000" />
|
||||
</label>
|
||||
<div class="randomInputFields hidden">
|
||||
<label class="wordcount">
|
||||
Word count
|
||||
<input type="number" value="" min="1" max="10000" />
|
||||
</label>
|
||||
<div style="color: var(--sub-color)">or</div>
|
||||
<label class="time">
|
||||
Time
|
||||
<input type="number" value="" min="1" max="10000" />
|
||||
</label>
|
||||
</div>
|
||||
<label class="typographyCheck">
|
||||
<input type="checkbox" checked />
|
||||
<div class="customTextTypographyCheckbox"></div>
|
||||
|
@ -1583,11 +1593,6 @@
|
|||
<key>esc</key>
|
||||
)
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
For testing purposes, account config synchronisation has been
|
||||
temporarily disabled (only local config will be remembered). Sorry
|
||||
for the inconvenience.
|
||||
</div>
|
||||
<!-- <div class="sectionGroupTitle">quick navigation</div> -->
|
||||
<div class="settingsGroup quickNav">
|
||||
<div class="links">
|
||||
|
@ -1649,7 +1654,7 @@
|
|||
<div class="buttons">
|
||||
<a
|
||||
class="button"
|
||||
href="https://discord.com/api/oauth2/authorize?client_id=757704816532258856&redirect_uri=https%3A%2F%2Fmonkeytype.com%2Fverify&response_type=token&scope=identify"
|
||||
href="https://discord.com/api/oauth2/authorize?client_id=798272335035498557&redirect_uri=https%3A%2F%2Fmonkeytype.com%2Fverify&response_type=token&scope=identify"
|
||||
style="text-decoration: none"
|
||||
>
|
||||
Verify with Discord
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
,"french"
|
||||
,"french_1k"
|
||||
,"arabic"
|
||||
,"malay"
|
||||
,"mongolian"
|
||||
,"mongolian_10k"
|
||||
,"russian"
|
||||
|
@ -24,8 +25,10 @@
|
|||
,"italian_1k"
|
||||
,"thai"
|
||||
,"polish"
|
||||
,"polish_2k"
|
||||
,"czech"
|
||||
,"czech_1k"
|
||||
,"czech_10k"
|
||||
,"slovak"
|
||||
,"dutch"
|
||||
,"filipino"
|
||||
|
@ -60,6 +63,7 @@
|
|||
,"code_csharp"
|
||||
,"code_c++"
|
||||
,"code_javascript"
|
||||
,"code_javascript_1k"
|
||||
,"code_html"
|
||||
,"code_java"
|
||||
,"code_go"
|
1007
static/languages/code_javascript_1k.json
Normal file
1007
static/languages/code_javascript_1k.json
Normal file
File diff suppressed because it is too large
Load diff
9615
static/languages/czech_10k.json
Normal file
9615
static/languages/czech_10k.json
Normal file
File diff suppressed because it is too large
Load diff
246
static/languages/malay.json
Normal file
246
static/languages/malay.json
Normal file
|
@ -0,0 +1,246 @@
|
|||
{
|
||||
"name": "malay",
|
||||
"leftToRight": true,
|
||||
"_comment": "Sourced from: https://www.101languages.net/malay/most-common-malay-words/",
|
||||
"words": [
|
||||
"aku",
|
||||
"yang",
|
||||
"tidak",
|
||||
"kau",
|
||||
"ini",
|
||||
"itu",
|
||||
"dan",
|
||||
"di",
|
||||
"anda",
|
||||
"akan",
|
||||
"apa",
|
||||
"dia",
|
||||
"saya",
|
||||
"kita",
|
||||
"untuk",
|
||||
"mereka",
|
||||
"ada",
|
||||
"tahu",
|
||||
"dengan",
|
||||
"bisa",
|
||||
"dari",
|
||||
"tak",
|
||||
"kamu",
|
||||
"kami",
|
||||
"adalah",
|
||||
"ke",
|
||||
"ya",
|
||||
"orang",
|
||||
"tapi",
|
||||
"harus",
|
||||
"pergi",
|
||||
"baik",
|
||||
"dalam",
|
||||
"sini",
|
||||
"seperti",
|
||||
"hanya",
|
||||
"ingin",
|
||||
"sekarang",
|
||||
"semua",
|
||||
"saja",
|
||||
"sudah",
|
||||
"jika",
|
||||
"oh",
|
||||
"apakah",
|
||||
"jadi",
|
||||
"satu",
|
||||
"jangan",
|
||||
"pada",
|
||||
"punya",
|
||||
"lebih",
|
||||
"benar",
|
||||
"bukan",
|
||||
"bagaimana",
|
||||
"lagi",
|
||||
"telah",
|
||||
"lakukan",
|
||||
"mungkin",
|
||||
"hal",
|
||||
"sangat",
|
||||
"bahwa",
|
||||
"pernah",
|
||||
"melihat",
|
||||
"datang",
|
||||
"hari",
|
||||
"kembali",
|
||||
"lihat",
|
||||
"ayo",
|
||||
"karena",
|
||||
"siapa",
|
||||
"atau",
|
||||
"sesuatu",
|
||||
"banyak",
|
||||
"tentang",
|
||||
"dapat",
|
||||
"kasih",
|
||||
"terima",
|
||||
"yeah",
|
||||
"menjadi",
|
||||
"anak",
|
||||
"seorang",
|
||||
"ia",
|
||||
"kalian",
|
||||
"juga",
|
||||
"mau",
|
||||
"oke",
|
||||
"keluar",
|
||||
"begitu",
|
||||
"mana",
|
||||
"bagus",
|
||||
"hei",
|
||||
"melakukan",
|
||||
"sana",
|
||||
"terjadi",
|
||||
"yg",
|
||||
"sebuah",
|
||||
"lain",
|
||||
"malam",
|
||||
"waktu",
|
||||
"membuat",
|
||||
"tahun",
|
||||
"beberapa",
|
||||
"saat",
|
||||
"mengapa",
|
||||
"tempat",
|
||||
"memiliki",
|
||||
"besar",
|
||||
"mati",
|
||||
"maaf",
|
||||
"baru",
|
||||
"masih",
|
||||
"katakan",
|
||||
"ketika",
|
||||
"sendiri",
|
||||
"kenapa",
|
||||
"sama",
|
||||
"pikir",
|
||||
"sampai",
|
||||
"bilang",
|
||||
"hidup",
|
||||
"mengatakan",
|
||||
"baiklah",
|
||||
"sedang",
|
||||
"tunggu",
|
||||
"kalau",
|
||||
"dua",
|
||||
"sekali",
|
||||
"tuhan",
|
||||
"lalu",
|
||||
"salah",
|
||||
"perlu",
|
||||
"mendapatkan",
|
||||
"rumah",
|
||||
"ayah",
|
||||
"cepat",
|
||||
"masuk",
|
||||
"selamat",
|
||||
"mari",
|
||||
"dengar",
|
||||
"suka",
|
||||
"sedikit",
|
||||
"semuanya",
|
||||
"jalan",
|
||||
"tentu",
|
||||
"disini",
|
||||
"padaku",
|
||||
"atas",
|
||||
"tinggal",
|
||||
"masalah",
|
||||
"boleh",
|
||||
"cukup",
|
||||
"setiap",
|
||||
"selalu",
|
||||
"berada",
|
||||
"kecil",
|
||||
"sebagai",
|
||||
"makan",
|
||||
"berpikir",
|
||||
"oleh",
|
||||
"mengambil",
|
||||
"yah",
|
||||
"belum",
|
||||
"kepada",
|
||||
"percaya",
|
||||
"the",
|
||||
"seseorang",
|
||||
"teman",
|
||||
"bahkan",
|
||||
"sayang",
|
||||
"dimana",
|
||||
"ok",
|
||||
"pertama",
|
||||
"menemukan",
|
||||
"bicara",
|
||||
"melakukannya",
|
||||
"lama",
|
||||
"mengerti",
|
||||
"bekerja",
|
||||
"dunia",
|
||||
"hey",
|
||||
"diri",
|
||||
"terlalu",
|
||||
"kali",
|
||||
"kemudian",
|
||||
"berhenti",
|
||||
"luar",
|
||||
"pasti",
|
||||
"tolong",
|
||||
"cara",
|
||||
"kan",
|
||||
"mulai",
|
||||
"setelah",
|
||||
"wanita",
|
||||
"ku",
|
||||
"ayolah",
|
||||
"it",
|
||||
"bertemu",
|
||||
"senang",
|
||||
"tetap",
|
||||
"selama",
|
||||
"pak",
|
||||
"tetapi",
|
||||
"ibu",
|
||||
"gadis",
|
||||
"yakin",
|
||||
"sebelum",
|
||||
"i",
|
||||
"merasa",
|
||||
"membawa",
|
||||
"tuan",
|
||||
"bersama",
|
||||
"pria",
|
||||
"berbicara",
|
||||
"jam",
|
||||
"pun",
|
||||
"uang",
|
||||
"ingat",
|
||||
"membunuh",
|
||||
"biarkan",
|
||||
"siap",
|
||||
"a",
|
||||
"mencoba",
|
||||
"tidur",
|
||||
"buruk",
|
||||
"padamu",
|
||||
"berapa",
|
||||
"nya",
|
||||
"mencari",
|
||||
"tanpa",
|
||||
"tiga",
|
||||
"sial",
|
||||
"nama",
|
||||
"bawah",
|
||||
"sialan",
|
||||
"terus",
|
||||
"apapun",
|
||||
"hati",
|
||||
"maksudku",
|
||||
"halo",
|
||||
"gila"
|
||||
]
|
||||
}
|
2345
static/languages/polish_2k.json
Normal file
2345
static/languages/polish_2k.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -792,7 +792,6 @@
|
|||
"rummet",
|
||||
"lyssnar",
|
||||
"menade",
|
||||
"pâ",
|
||||
"vinner",
|
||||
"kläder",
|
||||
"fantastiskt",
|
||||
|
|
17
static/quotes/code_c++.json
Normal file
17
static/quotes/code_c++.json
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"language": "code_c++",
|
||||
"groups": [
|
||||
[0, 100],
|
||||
[101, 300],
|
||||
[301, 600],
|
||||
[601, 9999]
|
||||
],
|
||||
"quotes": [
|
||||
{
|
||||
"text": "#include <bits/stdc++.h>\\nusing namespace std;\\nint main(){\\n\\tint len;\\n\\tcin >> len;\\n\\tvector <int> array(len);\\n\\tint sum = 0;\\n\\tfor(int i = 0; i < len; i++){\\n\\t\\tcin >> array[i];\\n\\t\\tsum += array[i];\\n\\t}\\n\\tcout << sum;\\n\\treturn 0;\\n}\\n",
|
||||
"source": "Sum of array in C++",
|
||||
"length": 246,
|
||||
"id": 1
|
||||
}
|
||||
]
|
||||
}
|
17
static/quotes/code_c.json
Normal file
17
static/quotes/code_c.json
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"language": "code_c",
|
||||
"groups": [
|
||||
[0, 100],
|
||||
[101, 300],
|
||||
[301, 600],
|
||||
[601, 9999]
|
||||
],
|
||||
"quotes": [
|
||||
{
|
||||
"text": "asmlinkage __visible void __init __no_sanitize_address start_kernel(void)",
|
||||
"source": "Linux Kernel Source Code",
|
||||
"length": 73,
|
||||
"id": 1
|
||||
}
|
||||
]
|
||||
}
|
35
static/quotes/code_javascript.json
Normal file
35
static/quotes/code_javascript.json
Normal file
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"language": "code_javascript",
|
||||
"groups": [
|
||||
[0, 100],
|
||||
[101, 300],
|
||||
[301, 600],
|
||||
[601, 9999]
|
||||
],
|
||||
"quotes": [
|
||||
{
|
||||
"text": "//a function that generates random gibberish at random length\n\nexport function getGibberish() {\n\tlet randLen = Math.floor(Math.random() * 7) + 1;\n\tlet ret = \"\";\n\tfor (let i = 0; i < randLen; i++) {\n\t\tret += String.fromCharCode(97 + Math.floor(Math.random() * 26));\n\t}\n\treturn ret;\n}",
|
||||
"source": "Monkeytype Sourcecode",
|
||||
"id": 1,
|
||||
"length": 64
|
||||
},
|
||||
{
|
||||
"text": "export function capitalizeFirstLetter(str) {\\n\\treturn str.charAt(0).toUpperCase() + str.slice(1);\\n}",
|
||||
"source": "Monkeytype Sourcecode",
|
||||
"length": 101,
|
||||
"id": 2
|
||||
},
|
||||
{
|
||||
"text": "export function roundTo2(num) {\\n\\treturn Math.round((num + Number.EPSILON) * 100) / 100;\\n}",
|
||||
"source": "Monkeytype Sourcecode",
|
||||
"length": 92,
|
||||
"id": 3
|
||||
},
|
||||
{
|
||||
"text": "export default function App(props) {\\n\\treturn (\\n\\t\\t<div {...props}>\\n\\t\\t\\tHello World!\\n\\t\\t</div>\\n\\t);\\n}",
|
||||
"source": "Basic React.js Example",
|
||||
"length": 111,
|
||||
"id": 4
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"language": "english",
|
||||
"groups": [
|
||||
[0, 100],
|
||||
[101, 300],
|
||||
|
@ -29693,6 +29694,852 @@
|
|||
"source": "Helplessly Hoping",
|
||||
"id": 5000,
|
||||
"length": 180
|
||||
},
|
||||
{
|
||||
"text": "There's no such thing as a painlessness lesson, they just don't exist. Sacrifices are necessary. You can't gain anything without losing something first. Although... if you can endure that pain and walk away from it, you'll find that you now have a heart strong enough to overcome any obstacle. Yeah... a heart made fullmetal.",
|
||||
"source": "Edward Elric - Fullmetal Alchemist Brotherhood",
|
||||
"id": 5001,
|
||||
"length": 325
|
||||
},
|
||||
{
|
||||
"text": "Nothing comes from nothing, Thieflet; no story comes from nowhere; new stories are born from old--it is the new combinations that make them new.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5002,
|
||||
"length": 144
|
||||
},
|
||||
{
|
||||
"text": "He knew what he knew: that the real world was full of magic, so magical worlds could easily be real.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5003,
|
||||
"length": 100
|
||||
},
|
||||
{
|
||||
"text": "Happy endings must come at the end of something, the Walrus pointed out. If they happen in the middle of a story, or an adventure, or the like, all they do is cheer things up for a while.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5004,
|
||||
"length": 187
|
||||
},
|
||||
{
|
||||
"text": "Any story worth its salt can handle a little shaking up.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5005,
|
||||
"length": 56
|
||||
},
|
||||
{
|
||||
"text": "What's the use of stories that aren't even true?",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5006,
|
||||
"length": 48
|
||||
},
|
||||
{
|
||||
"text": "It is all for love. Which is a wonderful and dashing matter. But which can also be a very foolish thing.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5007,
|
||||
"length": 104
|
||||
},
|
||||
{
|
||||
"text": "I always thought storytelling was like juggling. You keep a lot of different tales in the air, and juggle them up and down, and if you're good you don't drop any.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5008,
|
||||
"length": 167
|
||||
},
|
||||
{
|
||||
"text": "Iff replied that the Plentimaw Fishes were what he called 'hunger artists' - Because when they are hungry they swallow stories through every mouth, and in their innards miracles occur; a little bit of one story joins on to an idea from another, and hey presto, when they spew the stories out they are not the old tales but new ones. Nothing comes from nothing, Thieflet; no story comes from nowhere; new stories are born from old - it is the new combinations that make them new.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5009,
|
||||
"length": 479
|
||||
},
|
||||
{
|
||||
"text": "Africa, have you seen it? No? Then is it truly there? And the past, did it happen? And the future, will it come? Believe in your own eyes and you'll get into a lot of trouble.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5010,
|
||||
"length": 179
|
||||
},
|
||||
{
|
||||
"text": "But it's not as simple as that, he told himself, because the dance of the Shadow Warrior showed him that silence had its own grace and beauty (just as speech could be graceless and ugly); and that action could be as noble as words; and that creatures of darkness could be as lovely as the children of the light. If Guppees and Chupwalas didn't hate each other so, he thought, they might actually find each other pretty interesting. Opposites attract, as they say.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5011,
|
||||
"length": 467
|
||||
},
|
||||
{
|
||||
"text": "The Pages of Gup, now that they had talked through everything so fully, fought hard, remained united, support each other when required to do so, and in general looked like a force with a common purpose. All those arguments and debates, all that openness, had created powerful bonds of friendship between them.",
|
||||
"source": "Haroun and the Sea of Stories",
|
||||
"id": 5012,
|
||||
"length": 309
|
||||
},
|
||||
{
|
||||
"text": "All depression has its roots in self-pity, and all self-pity is rooted in people taking themselves too seriously. At the time Switters had disputed her assertion. Even at seventeen, he was aware that depression could have chemical causes. The key word here is roots, Maestra had countered. The roots of depression. For most people, self-awareness and self-pity blossom simultaneously in early adolescence. It's about that time that we start viewing the world as something other than a whoop-de-doo playground, we start to experience personally how threatening it can be, how cruel and unjust. At the very moment when we become, for the first time, both introspective and socially conscientious, we receive the bad news that the world, by and large, doesn't give a rat's ass. Even an old tomato like me can recall how painful, scary, and disillusioning that realization was. So, there's a tendency, then, to slip into rage and self-pity, which if indulged, can fester into bouts of depression. Yeah but Maestra-. Don't interrupt. Now, unless someone stronger and wiser - a friend, a parent, a novelist, filmmaker, teacher, or musician - can josh us out of it, can elevate us and show us how petty and pompous and monumentally useless it is to take ourselves so seriously, then depression can become a habit, which, in tern, can produce a neurological imprint. Are you with me? Gradually, our brain chemistry becomes conditioned to react to negative stimuli in a particular, predictable way. One thing'll go wrong and it'll automatically switch on its blender and mix us that black cocktail, the ol' doomsday daiquiri, and before we know it, we're soused to the gills from the inside out. Once depression has become electrochemically integrated, it can be extremely difficult to philosophically or psychologically override it; by then it's playing by physical rules, a whole different ball game. That's why, Switters my dearest, every time you've shown signs of feeling sorry for yourself, I've played my blues records really loud or read to you from The Horse's Mouth. And that's why when you've exhibited the slightest tendency toward self-importance, I've reminded you that you and me - you and I: excuse me - may be every bit as important as the President or the pope or the biggest prime-time icon in Hollywood, but none of us is much more than a pimple on the ass-end of creation, so let's not get carried away with ourselves. Preventive medicine, boy. It's preventive medicine. But what about self-esteem? Heh! Self-esteem is for sissies. Accept that you're a pimple and try to keep a lively sense of humor about it. That way lies grace-and maybe even glory.",
|
||||
"source": "Fierce Invalids Home from Hot Climates",
|
||||
"id": 5013,
|
||||
"length": 2663
|
||||
},
|
||||
{
|
||||
"text": "I hope you're pleased with yourselves. We could all have been killed - or worse, expelled. Now if you don't mind, I'm going to bed.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5014,
|
||||
"length": 131
|
||||
},
|
||||
{
|
||||
"text": "It does not do well to dwell on dreams and forget to live.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5015,
|
||||
"length": 58
|
||||
},
|
||||
{
|
||||
"text": "To the well-organized mind, death is but the next great adventure.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5016,
|
||||
"length": 66
|
||||
},
|
||||
{
|
||||
"text": "You're a little scary sometimes, you know that? Brilliant... but scary.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5017,
|
||||
"length": 72
|
||||
},
|
||||
{
|
||||
"text": "There will be no foolish wand-waving or silly incantations in this class. As such, I don't expect many of you to appreciate the subtle science and exact art that is potion-making. However, for those select few who possess the predisposition, I can teach you how to bewitch the mind and ensnare the senses. I can tell you how to bottle fame, brew glory, and even put a stopper in death. Then again, maybe some of you have come to Hogwarts in possession of abilities so formidable that you feel confident enough to not pay attention!",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5018,
|
||||
"length": 531
|
||||
},
|
||||
{
|
||||
"text": "It takes a great deal of bravery to stand up to our enemies, but just as much to stand up to our friends.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5019,
|
||||
"length": 105
|
||||
},
|
||||
{
|
||||
"text": "There are all kinds of courage, said Dumbledore, smiling. It takes a great deal of bravery to stand up to our enemies, but just as much to stand up to our friends.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5020,
|
||||
"length": 167
|
||||
},
|
||||
{
|
||||
"text": "The truth. It is a beautiful and terrible thing, and should therefore be treated with great caution.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5021,
|
||||
"length": 100
|
||||
},
|
||||
{
|
||||
"text": "There are some things you can't share without ending up liking each other, and knocking out a twelve-foot mountain troll is one of them.",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5022,
|
||||
"length": 136
|
||||
},
|
||||
{
|
||||
"text": "Ah, music, he said, wiping his eyes. A magic beyond all we do here!",
|
||||
"source": "Harry Potter and the Philosopher's Stone",
|
||||
"id": 5023,
|
||||
"length": 71
|
||||
},
|
||||
{
|
||||
"text": "I solemnly swear I am up to no good.",
|
||||
"source": "Harry Potter and the Prisoner of Azkaban",
|
||||
"id": 5024,
|
||||
"length": 36
|
||||
},
|
||||
{
|
||||
"text": "Honestly, am I the only person who's ever bothered to read 'Hogwarts: A History?'",
|
||||
"source": "Harry Potter and the Prisoner of Azkaban",
|
||||
"id": 5025,
|
||||
"length": 81
|
||||
},
|
||||
{
|
||||
"text": "If you want to know what a man's like, take a good look at how he treats his inferiors, not his equals.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5026,
|
||||
"length": 103
|
||||
},
|
||||
{
|
||||
"text": "I am what I am, an' I'm not ashamed. 'Never be ashamed,' my ol' dad used ter say, 'there's some who'll hold it against you, but they're not worth botherin' with.'",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5027,
|
||||
"length": 162
|
||||
},
|
||||
{
|
||||
"text": "It matters not what someone is born, but what they grow to be.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5028,
|
||||
"length": 62
|
||||
},
|
||||
{
|
||||
"text": "We are only as strong as we are united, as weak as we are divided.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5029,
|
||||
"length": 66
|
||||
},
|
||||
{
|
||||
"text": "Your devotion is nothing more than cowardice. You would not be here if you had anywhere else to go.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5030,
|
||||
"length": 99
|
||||
},
|
||||
{
|
||||
"text": "Numbing the pain for a while will make it worse when you finally feel it.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5031,
|
||||
"length": 73
|
||||
},
|
||||
{
|
||||
"text": "Anyone can speak Troll. All you have to do is point and grunt.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5032,
|
||||
"length": 62
|
||||
},
|
||||
{
|
||||
"text": "Curiosity is not a sin... But we should exercise caution with our curiosity... yes, indeed.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5033,
|
||||
"length": 88
|
||||
},
|
||||
{
|
||||
"text": "Just because it's taken you three years to notice, Ron, doesn't mean no one else has spotted I'm a girl!",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5034,
|
||||
"length": 104
|
||||
},
|
||||
{
|
||||
"text": "Differences of habit and language are nothing at all if our aims are identical and our hearts are open.",
|
||||
"source": "Harry Potter and the Goblet of Fire",
|
||||
"id": 5035,
|
||||
"length": 103
|
||||
},
|
||||
{
|
||||
"text": "I think we've outgrown full-time education... Time to test our talents in the real world, d'you reckon?",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5036,
|
||||
"length": 104
|
||||
},
|
||||
{
|
||||
"text": "Harry witnessed Professor McGonagall walking right past Peeves who was determinedly loosening a crystal chandelier and could have sworn he heard her tell the poltergeist out of the corner of her mouth, 'It unscrews the other way.'",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5037,
|
||||
"length": 230
|
||||
},
|
||||
{
|
||||
"text": "I think I'll just go down and have some pudding and wait for it all to turn up - it always does in the end.",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5038,
|
||||
"length": 107
|
||||
},
|
||||
{
|
||||
"text": "Just because you have the emotional range of a teaspoon doesn't mean we all have.",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5039,
|
||||
"length": 81
|
||||
},
|
||||
{
|
||||
"text": "You can laugh, but people used to believe there were no such things as the Blibbering Humdinger or the Crumple-Horned Snorkack!",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5040,
|
||||
"length": 127
|
||||
},
|
||||
{
|
||||
"text": "I mean, it's sort of exciting, isn't it, breaking the rules?",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5041,
|
||||
"length": 60
|
||||
},
|
||||
{
|
||||
"text": "Indifference and neglect often do much more damage than outright dislike.",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5042,
|
||||
"length": 73
|
||||
},
|
||||
{
|
||||
"text": "Youth can not know how age thinks and feels. But old men are guilty if they forget what it was to be young.",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5043,
|
||||
"length": 107
|
||||
},
|
||||
{
|
||||
"text": "Things we lose have a way of coming back to us in the end, if not always in the way we expect.",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5044,
|
||||
"length": 94
|
||||
},
|
||||
{
|
||||
"text": "Wit beyond measure is man's greatest treasure.",
|
||||
"source": "Harry Potter and the Order of the Phoenix",
|
||||
"id": 5045,
|
||||
"length": 46
|
||||
},
|
||||
{
|
||||
"text": "The thing about growing up with Fred and George is that you sort of start thinking anything's possible if you've got enough nerve.",
|
||||
"source": "Harry Potter and the Half-Blood Prince",
|
||||
"id": 5046,
|
||||
"length": 130
|
||||
},
|
||||
{
|
||||
"text": "And now, Harry, let us step out into the night and pursue that flighty temptress, adventure.",
|
||||
"source": "Harry Potter and the Half-Blood Prince",
|
||||
"id": 5047,
|
||||
"length": 92
|
||||
},
|
||||
{
|
||||
"text": "Dumbledore says people find it far easier to forgive others for being wrong than being right.",
|
||||
"source": "Harry Potter and the Half-Blood Prince",
|
||||
"id": 5048,
|
||||
"length": 93
|
||||
},
|
||||
{
|
||||
"text": "Age is foolish and forgetful when it underestimates youth.",
|
||||
"source": "Harry Potter and the Half-Blood Prince",
|
||||
"id": 5049,
|
||||
"length": 58
|
||||
},
|
||||
{
|
||||
"text": "Once again, you show all the sensitivity of a blunt axe.",
|
||||
"source": "Harry Potter and the Half-Blood Prince",
|
||||
"id": 5050,
|
||||
"length": 56
|
||||
},
|
||||
{
|
||||
"text": "It is the unknown we fear when we look upon death and darkness, nothing more.",
|
||||
"source": "Harry Potter and the Half-Blood Prince",
|
||||
"id": 5051,
|
||||
"length": 77
|
||||
},
|
||||
{
|
||||
"text": "'No, Harry, you listen,' said Hermione. 'We're coming with you. That was decided months ago - years, really.'",
|
||||
"source": "Harry Potter and the Deathly Hallows",
|
||||
"id": 5052,
|
||||
"length": 109
|
||||
},
|
||||
{
|
||||
"text": "Harry was left to ponder in silence the depths to which girls would sink to get revenge.",
|
||||
"source": "Harry Potter and the Deathly Hallows",
|
||||
"id": 5053,
|
||||
"length": 88
|
||||
},
|
||||
{
|
||||
"text": "'That wand's more trouble than it's worth,' said Harry. 'And quite honestly,' he turned away from the painted portraits, thinking now only of the four-poster bed lying waiting for him in Gryffindor Tower, and wondering whether Kreacher might bring him a sandwich there, 'I've had enough trouble for a lifetime.'",
|
||||
"source": "Harry Potter and the Deathly Hallows",
|
||||
"id": 5054,
|
||||
"length": 311
|
||||
},
|
||||
{
|
||||
"text": "Every human life is worth the same, and worth saving.",
|
||||
"source": "Harry Potter and the Deathly Hallows",
|
||||
"id": 5055,
|
||||
"length": 53
|
||||
},
|
||||
{
|
||||
"text": "Words are, in my not-so-humble opinion, our most inexhaustible source of magic. Capable of both inflicting injury, and remedying it.",
|
||||
"source": "Harry Potter and the Deathly Hallows",
|
||||
"id": 5056,
|
||||
"length": 132
|
||||
},
|
||||
{
|
||||
"text": "Of course it is happening inside your head, Harry, but why on earth should that mean that it is not real?",
|
||||
"source": "Harry Potter and the Deathly Hallows",
|
||||
"id": 5057,
|
||||
"length": 105
|
||||
},
|
||||
{
|
||||
"text": "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5058,
|
||||
"length": 139
|
||||
},
|
||||
{
|
||||
"text": "Nothing travels faster than the speed of light, with the possible exception of bad news, which obeys its own special laws.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5059,
|
||||
"length": 122
|
||||
},
|
||||
{
|
||||
"text": "It can be very dangerous to see things from somebody else's point of view without the proper training.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5060,
|
||||
"length": 102
|
||||
},
|
||||
{
|
||||
"text": "Protect me from knowing what I don't need to know. Protect me from even knowing that there are things to know that I don't know. Protect me from knowing that I decided not to know about the things that I decided not to know about. Amen. Lord, lord, lord. Protect me from the consequences of the above prayer.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5061,
|
||||
"length": 308
|
||||
},
|
||||
{
|
||||
"text": "In astrology the rules happen to be about stars and planets, but they could be about ducks and drakes for all the difference it would make. It's just a way of thinking a problem Which lets the shape Of that problem begin to emerge. The more rules, the tinier the rules, the more arbitrary they are, the better. It's like throwing a handful of fine graphite dust on a piece of paper to see where the hidden dentations are. It lets you see the words that were written on the piece of paper above it that's now been taken away and hidden, The graphite's not important. It's just the means Of revealing the indentations. so you see, astrology's nothing to do with astronomy. It's just to do with people thinking about people.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5062,
|
||||
"length": 721
|
||||
},
|
||||
{
|
||||
"text": "He had got himself a life. Now he had to find a purpose in it.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5063,
|
||||
"length": 62
|
||||
},
|
||||
{
|
||||
"text": "You see, the quality of any advice anybody has to offer has to be judged against the quality Of life they actually lead.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5064,
|
||||
"length": 120
|
||||
},
|
||||
{
|
||||
"text": "We also live in strange places; each in a universe of our own. The people With whom we populate our universes are the shadows of whole other universes intersecting with our own.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5065,
|
||||
"length": 177
|
||||
},
|
||||
{
|
||||
"text": "One of the extraordinary things about life is the sort of places it's prepared to put up with living.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5066,
|
||||
"length": 101
|
||||
},
|
||||
{
|
||||
"text": "'You know,' he said, sitting back, reflectively, 'it's at times like this that you kind of wonder if it's worth worrying about the fabric of space-time and the causal integrity Of the multidimensional probability matrix and the potential collapse of all waveforms in the Whole Sort of General Mish Mash and all that sort of stuff that's been bugging me.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5067,
|
||||
"length": 353
|
||||
},
|
||||
{
|
||||
"text": "NO ADMITTANCE. NOT EVEN TO AUTHORIZED PERSONNEL. YOU ARE WASTING YOUR TIME HERE. GO AWAY.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5068,
|
||||
"length": 89
|
||||
},
|
||||
{
|
||||
"text": "He had a nasty feeling that that might be an idiotic thing to do, but he did it anyway, and sure enough it had turned out to be an idiotic thing to do. You live and learn. At any rate, you live.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5069,
|
||||
"length": 194
|
||||
},
|
||||
{
|
||||
"text": "Fall, though, is the worst. Few things are worse than fall in New York, Some of the things that live in the lower intestines of rats would disagree, but most of the things that live in the lower intestines of rats are highly disagreeable anyways, so their opinion can and should be discounted.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5070,
|
||||
"length": 293
|
||||
},
|
||||
{
|
||||
"text": "Every single decision we make, every breath we draw, opens some doors and closes many others. Most of them we don't nonce, Some we do.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5071,
|
||||
"length": 134
|
||||
},
|
||||
{
|
||||
"text": "At every level, vital instructions were missing, and the instructions about what to do in the event of discovering that vital instructions were missing, were also missing.",
|
||||
"source": "Mostly Harmless",
|
||||
"id": 5072,
|
||||
"length": 171
|
||||
},
|
||||
{
|
||||
"text": "If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success.",
|
||||
"source": "James Cameron",
|
||||
"length": 104,
|
||||
"id": 5073
|
||||
},
|
||||
{
|
||||
"text": "Life is what happens when you're busy making other plans.",
|
||||
"source": "John Lennon",
|
||||
"length": 57,
|
||||
"id": 5074
|
||||
},
|
||||
{
|
||||
"text": "There comes a time when the world gets quiet and the only thing left is your own heart. So you'd better learn the sound of it. Otherwise you'll never understand what it's saying.",
|
||||
"source": "Sarah Dessen, Just Listen",
|
||||
"length": 178,
|
||||
"id": 5075
|
||||
},
|
||||
{
|
||||
"text": "This is the warship Rocinante. You're aware of our capabilities more than anyone. We're escorting a vessel of refugees away from your AO. Any ship that opens fire on us, will feel the sum total of our state-of-the-art Martian arsenal, rammed up its ass. We'll all die together. This is our only and final warning, stay clear.",
|
||||
"source": "The Expanse",
|
||||
"length": 325,
|
||||
"id": 5076
|
||||
},
|
||||
{
|
||||
"text": "Don't be pushed around by the fears in your mind. Be led by the dreams in your heart.",
|
||||
"source": "Roy T. Bennett, The Light in the Heart",
|
||||
"length": 85,
|
||||
"id": 5077
|
||||
},
|
||||
{
|
||||
"text": "The damn bastard ruined it... Don't you see? He walked all over it with his dirty boots! Over the crisp white sheets of my bed that I had just made!",
|
||||
"source": "Captain Torres, Ace Combat 7: Skies Unknown",
|
||||
"length": 148,
|
||||
"id": 5078
|
||||
},
|
||||
{
|
||||
"text": "I know you're out there. I can feel you now. I know that you're afraid... you're afraid of us. You're afraid of change. I don't know the future. I didn't come here to tell you how this is going to end. I came here to tell you how it's going to begin. I'm going to hang up this phone, and then I'm going to show these people what you don't want them to see. I'm going to show them a world without you. A world without rules and controls, without borders or boundaries. A world where anything is possible. Where we go from there is a choice I leave to you...",
|
||||
"source": "Neo, The Matrix",
|
||||
"length": 556,
|
||||
"id": 5079
|
||||
},
|
||||
{
|
||||
"text": "In one life you're Thomas A. Anderson, program writer for a respectable software company. You have a social security number; you pay your taxes; and you (dramatic pause) help your landlady carry out her garbage.",
|
||||
"source": "Agent Smith, The Matrix",
|
||||
"length": 211,
|
||||
"id": 5080
|
||||
},
|
||||
{
|
||||
"text": "You know, I know this steak doesn't exist. I know that when I put it in my mouth, the Matrix is telling my brain that it is juicy and delicious. After nine years, you know what I realize? Ignorance is bliss.",
|
||||
"source": "Cypher, The Matrix",
|
||||
"length": 207,
|
||||
"id": 5081
|
||||
},
|
||||
{
|
||||
"text": "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony.",
|
||||
"source": "Morpheus, The Matrix",
|
||||
"length": 121,
|
||||
"id": 5082
|
||||
},
|
||||
{
|
||||
"text": "What are you waiting for? You're faster than this. Don't think you are, know you are. Come on. Stop trying to hit me and hit me.",
|
||||
"source": "Morpheus, The Matrix",
|
||||
"length": 128,
|
||||
"id": 5083
|
||||
},
|
||||
{
|
||||
"text": "If real is what you can feel, smell, taste and see, then 'real' is simply electrical signals interpreted by your brain.",
|
||||
"source": "Morpheus, The Matrix",
|
||||
"length": 119,
|
||||
"id": 5084
|
||||
},
|
||||
{
|
||||
"text": "Were you listening to me Neo? Or were you looking at the woman in the red dress?",
|
||||
"source": "Morpheus, The Matrix",
|
||||
"length": 80,
|
||||
"id": 5085
|
||||
},
|
||||
{
|
||||
"text": "The Matrix is a system, Neo. That system is our enemy. But when you're inside, you look around, what do you see? Businessmen, teachers, lawyers, carpenters. The very minds of the people we are trying to save. But until we do, these people are still a part of that system and that makes them our enemy. You have to understand, most of these people are not ready to be unplugged. And many of them are so inured, so hopelessly dependent on the system, that they will fight to protect it.",
|
||||
"source": "Morpheus, The Matrix",
|
||||
"length": 484,
|
||||
"id": 5086
|
||||
},
|
||||
{
|
||||
"text": "No survivors? Then where do the stories come from, I wonder.",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 60,
|
||||
"id": 5087
|
||||
},
|
||||
{
|
||||
"text": "Please remove any metallic items you're carrying, keys, loose change... Holy shit!",
|
||||
"source": "Security Personnel, The Matrix",
|
||||
"length": 82,
|
||||
"id": 5088
|
||||
},
|
||||
{
|
||||
"text": "I'm disinclined to acquiesce to your request... Means no.",
|
||||
"source": "Barbossa, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 57,
|
||||
"id": 5089
|
||||
},
|
||||
{
|
||||
"text": "One word, love: curiosity. You long for freedom. You long to do what you want to do because you want it. To act on selfish impulse. You want to see what it's like. One day... you won't be able to resist.",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: Dead Man's Chest",
|
||||
"length": 203,
|
||||
"id": 5090
|
||||
},
|
||||
{
|
||||
"text": "We pillage, we plunder, we rifle and loot. Drink up me 'earties yo ho! We kidnap and ravage and don't give a hoot. Drink up me 'earties yo ho! Yo ho, yo ho a pirate's life for me. We extort, we pilfer, we filch and sack...",
|
||||
"source": "Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 222,
|
||||
"id": 5091
|
||||
},
|
||||
{
|
||||
"text": "Think again, Miss Swann. Vile and dissolute creatures, the lot of them. I intend to see to it that any man who sails under a pirate flag or wears a pirate brand gets what he deserves. A short drop and a sudden stop.",
|
||||
"source": "Norrington, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 215,
|
||||
"id": 5092
|
||||
},
|
||||
{
|
||||
"text": "Hello. My name is Inigo Montoya. You killed my father. Prepare to die.",
|
||||
"source": "Inigo Montoya, The Princess Bride",
|
||||
"length": 70,
|
||||
"id": 5093
|
||||
},
|
||||
{
|
||||
"text": "Sticks and stones, love. I saved your life, you save mine, we're square. Gentlemen, m'lady, you will always remember this as the day that you almost caught Captain Jack Sparrow!",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 177,
|
||||
"id": 5094
|
||||
},
|
||||
{
|
||||
"text": "You seem somewhat familiar. Have I threatened you before?",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 57,
|
||||
"id": 5095
|
||||
},
|
||||
{
|
||||
"text": "You need to find yourself a girl, mate! Or perhaps the reason you practice three hours a day is that you already found one and are otherwise incapable of wooing said strumpet. You're not a eunuch, are you?",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 205,
|
||||
"id": 5096
|
||||
},
|
||||
{
|
||||
"text": "Stop blowing holes in my ship!",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 30,
|
||||
"id": 5097
|
||||
},
|
||||
{
|
||||
"text": "Welcome to the Caribbean, love.",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 31,
|
||||
"id": 5098
|
||||
},
|
||||
{
|
||||
"text": "For eternally and always there is only now, one and the same now; the present is the only thing that has no end.",
|
||||
"source": "Alan Watts, The Book on the Taboo Against Knowing Who You Are",
|
||||
"length": 112,
|
||||
"id": 5099
|
||||
},
|
||||
{
|
||||
"text": "Not just the Spanish Main, love. The entire ocean. The entire world. Wherever we want to go, we'll go. That's what a ship is, you know. It's not just a keel and a hull and a deck and sails. That's what a ship needs, but what a ship is? What the Black Pearl really is, is freedom.",
|
||||
"source": "Captain Jack Sparrow, Pirates of the Caribbean: The Curse of the Black Pearl",
|
||||
"length": 279,
|
||||
"id": 5100
|
||||
},
|
||||
{
|
||||
"text": "We have been to the moon, we have charted the depths of the ocean and the heart of the atom, but we have a fear of looking inward to ourselves because we sense that is where all the contradictions flow together.",
|
||||
"source": "Terence McKenna",
|
||||
"length": 211,
|
||||
"id": 5101
|
||||
},
|
||||
{
|
||||
"text": "There he goes. One of God's own prototypes. A high-powered mutant of some kind never even considered for mass production. Too weird to live, and too rare to die.",
|
||||
"source": "Hunter S. Thompson, Fear and Loathing in Las Vegas",
|
||||
"length": 161,
|
||||
"id": 5102
|
||||
},
|
||||
{
|
||||
"text": "I'll try to be around and about. But if I'm not, then you know that I'm behind your eyelids, and I'll meet you there",
|
||||
"source": "Terence Mckenna",
|
||||
"length": 116,
|
||||
"id": 5103
|
||||
},
|
||||
{
|
||||
"text": "You know what you are? You're a beard with an idiot hanging off it.",
|
||||
"source": "Dylan Moran - Black Books TV series",
|
||||
"length": 67,
|
||||
"id": 5104
|
||||
},
|
||||
{
|
||||
"text": "There are some people out there... And it doesn't happen a lot. It's rare. But they refuse to let you hate them. In fact, they care about you in spite of it. And the really special ones, they're relentless at it. Doesn't matter what you do to them. They take it and care about you anyway. They don't abandon you, no matter how many reasons you give them. No matter how much you're practically begging them to leave. And you wanna know why? Because they feel something for me that I can't... They love me.",
|
||||
"source": "Mr. Robot TV series",
|
||||
"length": 504,
|
||||
"id": 5105
|
||||
},
|
||||
{
|
||||
"text": "Oh, hello there. I will stay behind, to gaze at the sun. The sun is a wondrous body. Like a magnificent father! If only I could be so grossly incandescent!",
|
||||
"source": "Solaire of Astora - Dark Souls",
|
||||
"length": 155,
|
||||
"id": 5106
|
||||
},
|
||||
{
|
||||
"text": "There are always a few such people who demand the utmost of life and yet cannot come to terms with its stupidity and crudeness.",
|
||||
"source": "Hermann Hesse, Steppenwolf",
|
||||
"length": 127,
|
||||
"id": 5107
|
||||
},
|
||||
{
|
||||
"text": "Start by being fully aware of what you think you are. It'll help you to become aware of what you are in fact.",
|
||||
"source": "Aldous Huxley, Island",
|
||||
"length": 109,
|
||||
"id": 5108
|
||||
},
|
||||
{
|
||||
"text": "They were all dead. The final gunshot was an exclamation mark to everything that had led to this point. I released my finger from the trigger. And then it was over.",
|
||||
"source": "Max Payne",
|
||||
"length": 164,
|
||||
"id": 5109
|
||||
},
|
||||
{
|
||||
"text": "My comfort zone is like a little bubble around me, and I've pushed it in different directions and made it bigger and bigger until these objectives that seemed totally crazy eventually fall within the realm of the possible.",
|
||||
"source": "Alex Honnold",
|
||||
"length": 222,
|
||||
"id": 5110
|
||||
},
|
||||
{
|
||||
"text": "In the end, all men die. How you lived will be far more important to the Almighty than what you accomplished.",
|
||||
"source": "The Way of Kings",
|
||||
"length": 109,
|
||||
"id": 5111
|
||||
},
|
||||
{
|
||||
"text": "A bug is never just a mistake. It represents something bigger. An error of thinking that makes you who you are.",
|
||||
"source": "Mr. Robot TV series",
|
||||
"length": 111,
|
||||
"id": 5112
|
||||
},
|
||||
{
|
||||
"text": "I have tried to travel! But the sensation of forlornness that came over me in strange places deterred me. I felt so isolated and small on this immense earth that I hastened to return home.",
|
||||
"source": "Guy De Maupassant, Suicides",
|
||||
"length": 188,
|
||||
"id": 5113
|
||||
},
|
||||
{
|
||||
"text": "We are nothing but the eternal toys of illusions, as foolish as they are charming, which re-blossom as soon as they fade.",
|
||||
"source": "Guy De Maupassant, Suicides",
|
||||
"length": 121,
|
||||
"id": 5114
|
||||
},
|
||||
{
|
||||
"text": "I was brought up by parents who believed in everything, and so I, too, believed. My dream lasted a long time. But now its last illusions have fled.",
|
||||
"source": "Guy De Maupassant, Suicides",
|
||||
"length": 147,
|
||||
"id": 5115
|
||||
},
|
||||
{
|
||||
"text": "The first letters I picked out did not interest me. They were from men I meet once once in a while and for whom I feel no great interest. But all at once an envelop attracted my eyes. It bore my name written in a broad, firm hand; tears filled my eyes. Here was a letter from my dearest friend, the one in whom I used to confide in my youth and who knew my hopes; he arose before me so clearly with his outstretched hand and good-natured smile that a shudder ran through my frame. Yes, the dead come back, for I saw him! Our memory is a world far more perfect that the real universe, for it brings to life those who have gone forever.",
|
||||
"source": "Guy De Maupassant, Suicides",
|
||||
"length": 634,
|
||||
"id": 5116
|
||||
},
|
||||
{
|
||||
"text": "My romances, whose heroines, if still living, must have white hair, arose before me with all the bitterness of loved things forever gone. Oh, the young brows shaded by golden hair, the clasped hands, the speaking glances, the throbbing hearts, the smile that promises the lips and the lips that promise all-then the first kiss-long, unending, with no thought but of the immense ecstasy to come!",
|
||||
"source": "Guy De Maupassant, Suicides",
|
||||
"length": 394,
|
||||
"id": 5117
|
||||
},
|
||||
{
|
||||
"text": "My Dear Mamma: I am seven years old today. As it is the age of reason, I want to thank you for having brought me into this world.",
|
||||
"source": "Guy De Maupassant, Suicides",
|
||||
"length": 129,
|
||||
"id": 5118
|
||||
},
|
||||
{
|
||||
"text": "There was a lot of time, but there was no money and no place to go.There were big hopes, but living every day was full of worry and when she walked down the streets everyone else looked like they were full of confidence and she looked really small.",
|
||||
"source": "Reiko Saibara, Mainichi Kāsan",
|
||||
"length": 248,
|
||||
"id": 5119
|
||||
},
|
||||
{
|
||||
"text": "Dear Auggie, I want to apologise for the stuff I did last year. I've been thinking about it a lot. You didn't deserve it. I wish I could have a do-over. I would be nicer. I hope you don't remember how mean I was when you're eighty years old. Have a nice life.",
|
||||
"source": "R J Palacio, Wonder",
|
||||
"length": 259,
|
||||
"id": 5120
|
||||
},
|
||||
{
|
||||
"text": "Precocious high school student Jimmy Kudo uses his keen powers of observation and astute intuition to solve mysteries that have left law enforcement officials baffled. Hot on the trail of a suspect, Jimmy is accosted from behind and fed a strange chemical which physically transforms him into a grade schooler! Taking on the pseudonym Conan Edogawa, he attempts to track down the people who did this to him. But until he finds a cure for his bizarre condition, Jimmy continues to help the police solve their toughest cases.",
|
||||
"source": "Gosho Aoyama, Detective Conan",
|
||||
"length": 524,
|
||||
"id": 5121
|
||||
},
|
||||
{
|
||||
"text": "In late June 1945, working at Los Alamos, Von Neumann completed a 101-page document titled \"First Draft of a Report on the EDVAC\". In his clear and penetrating way, he set forth an overview of the design of a digital computer that would feature stored-program operation. Von Neumann boldly drew comparisons between his electronic circuits and the brain's neurons, emphasizing that just as the brain relies on its memory, so the computer would depend on its programs. Goldstine soon was distributing copies to interested scientists. In time the \"First Draft\" would become one of the most influential papers in computer science.",
|
||||
"source": "Maurice V. Wilkes, Computers Then And Now",
|
||||
"length": 626,
|
||||
"id": 5122
|
||||
},
|
||||
{
|
||||
"text": "I don't know how much longer I can keep going without a friend. I used to be able to do it very easily, but that was before I knew what having a friend was like. It's much easier not to know things sometimes.",
|
||||
"source": "Stephen Chbosky - The Perks of Being a Wallflower",
|
||||
"length": 208,
|
||||
"id": 5123
|
||||
},
|
||||
{
|
||||
"text": "He walked out in the gray light and stood and he saw for a brief moment the absolute truth of the world. The cold relentless circling of the intestate earth. Darkness implacable. The blind dogs of the sun in their running. The crushing black vacuum of the universe. And somewhere two hunted animals trembling like ground-foxes in their cover. Borrowed time and borrowed world and borrowed eyes with which to sorrow it.",
|
||||
"source": "Cormac McCarthy - The Road",
|
||||
"length": 419,
|
||||
"id": 5124
|
||||
},
|
||||
{
|
||||
"text": "He'd had this feeling before, beyond the numbness and the dull despair. The world shrinking down about a raw core of parsible entities. The names of things slowly following those things into oblivion. Colors. The names of birds. Things to eat. Finally the names of things one believed to be true. More fragile than he would have thought. How much was gone already? The sacred idiom shorn of its referents and so of its reality.",
|
||||
"source": "Cormac McCarthy - The Road",
|
||||
"length": 428,
|
||||
"id": 5125
|
||||
},
|
||||
{
|
||||
"text": "Alone now, I leaned over the edge of my boat and looked down to the bottom of the sea. The volcano was gone. The water's calm surface reflected the blue of the sky. Little waves--like silk pajamas fluttering in a breeze--lapped against the side of the boat. There was nothing else. I stretched out in the bottom of the boat and closed my eyes, waiting for the rising tide to carry me where I belonged.",
|
||||
"source": "Haruki Murakami - The Second Bakery Attack",
|
||||
"length": 402,
|
||||
"id": 5126
|
||||
},
|
||||
{
|
||||
"text": "I'm gonna tell you a story. You go to a party and you walk up to the guys and you're like, \"I just bought a two thousand dollar big screen TV, and surround sound.\" Or you walk up to the wife and you're like, \"What do you think of my new fifteen hundred dollar earrings I bought for you.\" And nobody bats an eye. But you mention once that you're thinking about spending seventeen hundred dollars on a set of headphones, and everybody loses their mind! And I don't understand why.",
|
||||
"source": "Z Reviews - Auduze LCD-X",
|
||||
"length": 478,
|
||||
"id": 5127
|
||||
},
|
||||
{
|
||||
"text": "The man squatted and looked at him. I'm scared, he said. Do you understand? I'm scared. The boy didn't answer. He just sat there with his head bowed, sobbing. You're not the one who has to worry about everything. The boy said something but he couldn't understand him. What? he said. He looked up, his wet and grimy face. Yes I am, he said. I am the one.",
|
||||
"source": "Cormac McCarthy - The Road",
|
||||
"length": 353,
|
||||
"id": 5128
|
||||
},
|
||||
{
|
||||
"text": "The interconnected internet platforms have become more substantial than any country or corporation. Humans have redefined the \"net\" and how we interact with it. As technology develops, the virtual world is now capable of replacing the real one. Using a device installed behind the ear, humans can now easily sync to the virtual world. Thus, life is now completely different than the past centuries. The center of this change is the virtual internet space - cyTus, the world's largest virtual city.",
|
||||
"source": "Cytus II",
|
||||
"length": 498,
|
||||
"id": 5129
|
||||
},
|
||||
{
|
||||
"text": "I love you too, but I'm gonna mace you in the face!",
|
||||
"source": "The Darjeeling Limited, Wes Anderson",
|
||||
"length": 51,
|
||||
"id": 5130
|
||||
},
|
||||
{
|
||||
"text": "Computation is essential, powerful, beautiful, challenging, ever-expanding and so is its theory.",
|
||||
"source": "Elements of the Theory of Computation",
|
||||
"length": 96,
|
||||
"id": 5131
|
||||
},
|
||||
{
|
||||
"text": "Atmospheric air is only about 20 percent oxygen, but that oxygen is a key component of the chemical reactions that keep the body alive, including the reactions that produce ATP. Brain cells are especially sensitive to lack of oxygen because of their requirement for a high-and-steady production of ATP. Brain damage is likely within five minutes without oxygen, and death is likely within ten minutes.",
|
||||
"source": "Anatomy and Physiology, OpenStax",
|
||||
"length": 401,
|
||||
"id": 5132
|
||||
},
|
||||
{
|
||||
"text": "Whoever you may be, governor, prince or anyone else, whom the gods may choose to exercise kingship, I have made you a tablet-box and written a stone tablet. I have deposited them for you in Cutha, in the cella of Nergal in the temple E-meslam. Behold this stone tablet, give ear to what this stone tablet says!",
|
||||
"source": "Andrew George, The Epic of Gilgamesh",
|
||||
"length": 310,
|
||||
"id": 5133
|
||||
},
|
||||
{
|
||||
"text": "Anyways, let's talk about WAFFLES! I like waffles. Waffles are cool. Waffles is a funny word. There's a Teen Titans Go episode called \"Waffles\" where the word \"Waffles\" is said a hundred-something times. It's pretty annoying.",
|
||||
"source": "The Longest Text Ever",
|
||||
"length": 225,
|
||||
"id": 5134
|
||||
},
|
||||
{
|
||||
"text": "It's crazy to think that everything we could ever possibly say or write is massively outweighed by meaningless strings of letters and punctuation.",
|
||||
"source": "The Longest Text Ever",
|
||||
"length": 146,
|
||||
"id": 5135
|
||||
},
|
||||
{
|
||||
"text": "This one time, me and my mom were going to go to a furry Christmas party, but we didn't end up going because of the fact that there was alcohol on the premises, and that she didn't wanna have to be a mom dragging her son through a crowd of furries. Both of those reasons were understandable. Okay, hopefully I won't have to talk about furries anymore.",
|
||||
"source": "The Longest Text Ever",
|
||||
"length": 351,
|
||||
"id": 5136
|
||||
},
|
||||
{
|
||||
"text": "Hello, I'm back once again. Happy Pi Day! I memorized a bunch of digits of Pi once, not sure how many I still remember... I have literally nothing to write about now.",
|
||||
"source": "The Longest Text Ever",
|
||||
"length": 166,
|
||||
"id": 5137
|
||||
},
|
||||
{
|
||||
"text": "All I hear right now is Baby Shark being blasted upstairs.",
|
||||
"source": "The Longest Text Ever",
|
||||
"length": 58,
|
||||
"id": 5138
|
||||
},
|
||||
{
|
||||
"text": "All the world's a stage, And all the men and women merely players.",
|
||||
"source": "William Shakespeare, As You Like It",
|
||||
"length": 66,
|
||||
"id": 5139
|
||||
},
|
||||
{
|
||||
"text": "'But does it not show great weakness?' pursued she. 'I'm not envious: I never feel hurt at the brightness of Isabella's yellow hair and the whiteness of her skin, at her dainty elegance, and the fondness all the family exhibit for her. Even you, Nelly, if we have a dispute sometimes, you back Isabella at once; and I yield like a foolish mother: I call her a darling, and flatter her into a good temper. It pleases her brother to see us cordial, and that pleases me. But they are very much alike: they are spoiled children, and fancy the world was made for their accommodation; and though I humour both, I think a smart chastisement might improve them all the same.'",
|
||||
"source": "Emily Bronte, Wuthering Heights",
|
||||
"length": 667,
|
||||
"id": 5140
|
||||
},
|
||||
{
|
||||
"text": "Come, fill the Cup, and in the fire of Spring your winter-garment of Repentance fling: The Bird of Time has but a little way to flutter - and the Bird is on the Wing.",
|
||||
"source": "Rubaiyat of Omar Khayyam, stanza 7",
|
||||
"length": 166,
|
||||
"id": 5141
|
||||
}
|
||||
]
|
||||
}
|
23
static/quotes/german.json
Normal file
23
static/quotes/german.json
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"language": "german",
|
||||
"groups": [
|
||||
[0, 100],
|
||||
[101, 300],
|
||||
[301, 600],
|
||||
[601, 9999]
|
||||
],
|
||||
"quotes": [
|
||||
{
|
||||
"text": "\"Das Internet der Dinge\", sagte Ogarew, \"ist ein Thema, das uns hier ganz besonders beschäftigt. Denn mit dem Web 4.0 kommt das Internet überallhin. Von Autos über TV bis hin zu Kinderspielzeug. Heute schon gibt es fünfzehn Milliarden vernetzte Geräte. 2020 wird es fünfzig Milliarden geben. Da muss alles von vornherein sicher sein. So wie Microsoft das früher gemacht hat, geht es heute nicht mehr. Erst mal auf den Markt bringen und dann nachträglich das Feuer Löschen.\" Er lächelte durch seinen grauen Bart hindurch. \"Gott durfte das noch. Er sah, dass es gut war. Und als es doch nicht gut war, kam die Sintflut. So eine Art Neustart. Aber eine Sintflut kann sich das Internet der Dinge nicht erlauben.\"",
|
||||
"source": "Dark Web: Thriller, Veit Etzold",
|
||||
"length": 708,
|
||||
"id": 1
|
||||
},
|
||||
{
|
||||
"text": "Es ist dem Feind gelungen, die Front in breiter Formation zu durchbrechen. Im Süden hat der Gegner Zossen genommen und stößt auf Stahnsdorf vor. Der Feind operiert jetzt am nördlichen Stadtrand zwischen Frohnau und Pankow und im Osten ist der Feind bis zur Linie Lichtenberg, Mahlsdorf und Kahrlshorst gelangt. Mit dem Angriff Steiners wird das alles in Ordnung kommen. Mein Führer... Steiner... Steiner konnte nicht genügend Kräfte für einen Angriff massieren. Der Angriff Steiners ist nicht erfolgt. Es bleiben im Raum: Keitel, Jodl, Krebs und Burgdorf. Das war ein Befehl! Der Angriff Steiners war ein Befehl! Wer sind Sie, dass Sie es wagen, sich meinem Befehl zu widersetzen? So weit ist es also gekommen? Das Militär hat mich belogen! Jeder hat mich belogen, sogar die SS! Die gesamte Generalität ist nichts als ein Haufen niederträchtiger, treuloser Feiglinge!",
|
||||
"source": "Der Untergang/Downfall",
|
||||
"length": 867,
|
||||
"id": 2
|
||||
}
|
||||
]
|
||||
}
|
17
static/quotes/spanish.json
Normal file
17
static/quotes/spanish.json
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"language": "spanish",
|
||||
"groups": [
|
||||
[0, 100],
|
||||
[101, 300],
|
||||
[301, 600],
|
||||
[601, 9999]
|
||||
],
|
||||
"quotes": [
|
||||
{
|
||||
"text": "La muerte no existe, la gente solo muere cuando la olvidan; si puedes recordarme siempre estaré contigo.",
|
||||
"source": "Isabel Allende, Eva Luna",
|
||||
"length": 104,
|
||||
"id": 1
|
||||
}
|
||||
]
|
||||
}
|
17
static/quotes/turkish.json
Normal file
17
static/quotes/turkish.json
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"language": "turkish",
|
||||
"groups": [
|
||||
[0, 100],
|
||||
[101, 300],
|
||||
[301, 600],
|
||||
[601, 9999]
|
||||
],
|
||||
"quotes": [
|
||||
{
|
||||
"text": "Kimse görmek istemeyenler kadar kör değildir.",
|
||||
"source": "Jonathan Swift",
|
||||
"length": 45,
|
||||
"id": 1
|
||||
}
|
||||
]
|
||||
}
|
|
@ -473,5 +473,10 @@
|
|||
"name": "rudy",
|
||||
"bgColor": "#1a2b3e",
|
||||
"textColor": "#af8f5c"
|
||||
},
|
||||
{
|
||||
"name": "stealth",
|
||||
"bgColor": "#010203",
|
||||
"textColor": "#383e42"
|
||||
}
|
||||
]
|
|
@ -5,7 +5,7 @@
|
|||
--sub-color: #616161;
|
||||
--text-color: #f5e6c8;
|
||||
--error-color: #e72d2d;
|
||||
--colorful-error-color: #b62828;
|
||||
--colorful-error-color: #a5e72d;
|
||||
--colorful-error-extra-color: #74a120;
|
||||
--error-extra-color: #7e2a33;
|
||||
--colorful-error-color: #e72d2d;
|
||||
--colorful-error-extra-color: #7e2a33;
|
||||
}
|
||||
|
|
17
static/themes/stealth.css
Normal file
17
static/themes/stealth.css
Normal file
|
@ -0,0 +1,17 @@
|
|||
:root {
|
||||
--bg-color: #010203;
|
||||
--main-color: #383e42;
|
||||
--caret-color: #e25303;
|
||||
--sub-color: #5e676e;
|
||||
--text-color: #383e42;
|
||||
--error-color: #e25303;
|
||||
--error-extra-color: #73280c;
|
||||
--colorful-error-color: #e25303;
|
||||
--colorful-error-extra-color: #73280c;
|
||||
}
|
||||
#menu .icon-button:nth-child(4) {
|
||||
color: #e25303;
|
||||
}
|
||||
#timerNumber {
|
||||
color: #5e676e;
|
||||
}
|
Loading…
Reference in a new issue