Compare commits
242 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 51b3b0c4c7 | |||
| 174a4e69f9 | |||
| 1ce060eac6 | |||
| 4fe8b63748 | |||
| b5c64185f0 | |||
| 894558f2df | |||
| f1381878e7 | |||
| 9bd039b17b | |||
| 90b34c4dac | |||
| 96a919ed4b | |||
| e56b672226 | |||
| 91cbf7a2a9 | |||
| 04e2a39a9f | |||
| bdd926e110 | |||
| a8e9c9bc70 | |||
| 497073a714 | |||
| f1fa6a8456 | |||
| 3f690c24da | |||
| f24d81d895 | |||
| 82c5e40b92 | |||
| 6b27e18699 | |||
| 4f70a6fbf4 | |||
| 300c2bb0a8 | |||
| 4b4f073089 | |||
| 1d8e3d45a1 | |||
| 116068effa | |||
| f2aaee15f3 | |||
| 06a8d2bbd7 | |||
| 15353eba8a | |||
| febffb3f07 | |||
| 25c7d52d6a | |||
| 837c1c20a3 | |||
| 02b11a61bc | |||
| a0e28f7db4 | |||
| fdfa2d6df4 | |||
| 4fd2011be5 | |||
| 259131ee3f | |||
| 1a5cba57b7 | |||
| 5e05190f22 | |||
| 81540ef399 | |||
| 2bbff36cc8 | |||
| 9f52e47011 | |||
| 4dca69f14b | |||
| 1378b1e1ad | |||
| 734a611a5c | |||
| dbd485cb96 | |||
| 4c62a48f5d | |||
| 11496f3e0c | |||
| 9a3e3aaf42 | |||
| d9250fd780 | |||
| 70a5124815 | |||
| 532fa2816b | |||
| d22f191f83 | |||
| 2b49a800a5 | |||
| 0db927c726 | |||
| 6ee06f76e4 | |||
| 978e8c4320 | |||
| 5c7d537c61 | |||
| 0e6ece95a4 | |||
| b08ed8b0fb | |||
| fafaa29d72 | |||
| 3a088de7e8 | |||
| 835da85119 | |||
| f6e5360bdd | |||
| eee8ad2029 | |||
| c7e73f9b85 | |||
| 9b1a726875 | |||
| accf7e2897 | |||
| 9e98e56e9b | |||
| 6c85b1e047 | |||
| 7c553e535c | |||
| c16207c9ba | |||
| 27440772f0 | |||
| aea0be3245 | |||
| a2d5211b00 | |||
| 53fb28cc48 | |||
| 1c0710b45b | |||
| 3bc82a6692 | |||
| 2add227b97 | |||
| 4cc1f902c8 | |||
| 1b52529822 | |||
| e39a5a0628 | |||
| 575aea2605 | |||
| 222ba544d7 | |||
| 2372efa22e | |||
| b5c950ac96 | |||
| 18ec3eb355 | |||
| 62b4315b3d | |||
| 56805e6c90 | |||
| 0c6070dd9a | |||
| 19c26c01e3 | |||
| 0f3bc980d9 | |||
| 7f87120d34 | |||
| f7a03d2eb5 | |||
| 90250d1a25 | |||
| 22a0c72f6e | |||
| a4326498d1 | |||
| 8f26a22bd4 | |||
| 0b2cf5bceb | |||
| f43a0d8289 | |||
| 39be8db4f9 | |||
| f0a1f11a16 | |||
| 84c4b3536c | |||
| cf834f57d7 | |||
| 97be341ff6 | |||
| 15c68abafa | |||
| 21a1b9449b | |||
| 0ec7784fb1 | |||
| 9ddd0f29d0 | |||
| 37791dfe8d | |||
| 0322b657b8 | |||
| cc39f6e4e9 | |||
| 452b516c67 | |||
| 235eae32b0 | |||
| de9f1be7b9 | |||
| e75610447f | |||
| bd4c65cd3e | |||
| baf60dc951 | |||
| 70e88d601c | |||
| 104ec60adb | |||
| e97454e0e7 | |||
| 144baa98b1 | |||
| 02e33853b1 | |||
| 8c0d41d084 | |||
| 9d4f70371d | |||
| 57a090eea1 | |||
| 18534a21ff | |||
| ed0a36a287 | |||
| e50f240366 | |||
| 4d1bbdd8d0 | |||
| d1928c9181 | |||
| 137f7d53dc | |||
| 3f9d55254e | |||
| b60a76d7dd | |||
| a5575b3593 | |||
| ace964f2b3 | |||
| 12b045093a | |||
| 8cd9536bdc | |||
| 08f0374b46 | |||
| 3582e233be | |||
| 3974adcb65 | |||
| 57d3fea523 | |||
| 173d7a178c | |||
| 7db093d2bb | |||
| 06d2ffb37d | |||
| 40997854dd | |||
| 4c4d0be31f | |||
| b8cf1b895f | |||
| a08ecbe044 | |||
| f3771f4869 | |||
| e0eed8238e | |||
| 6baf08d461 | |||
| 535fddf92d | |||
| ef97f301d9 | |||
| eea79ce1b6 | |||
| 191fee524c | |||
| 098f53bfa9 | |||
| e9ee2d3fdd | |||
| 4c988691cf | |||
| 3c8be16135 | |||
| 9890e0079a | |||
| 1530ab44e9 | |||
| 586897fbfc | |||
| f75a6eb11d | |||
| 155d6d5af6 | |||
| 004f1ee2dc | |||
| c61bdaf563 | |||
| 85e14bb100 | |||
| 8e9b469d8d | |||
| 6e5cac88fc | |||
| 80acb70718 | |||
| 24430861ce | |||
| e60285e7d9 | |||
| f030135c82 | |||
| 2c29310466 | |||
| 13eef6e4cf | |||
| 13c0d12045 | |||
| 6456984f57 | |||
| cfc1a12930 | |||
| 9ba4687478 | |||
| 6d987a9579 | |||
| 4702479156 | |||
| b384cd4eb8 | |||
| d2bd7dc325 | |||
| 719fab8d4b | |||
| 24841346dc | |||
| 4c34c68d78 | |||
| 9a8d1854b9 | |||
| 10f5011781 | |||
| 9a896470d5 | |||
| 6b0b393e32 | |||
| 014a4b653a | |||
| 37e5d6b40a | |||
| fb780c9a2d | |||
| 5f440f1bfa | |||
| 203d97423a | |||
| 1a86943711 | |||
| 21185b689c | |||
| 5a85e0730c | |||
| 771558e1fd | |||
| e6f903fd2e | |||
| 5c13bf1980 | |||
| 36a4ec69d5 | |||
| c6ba1d8402 | |||
| 0081bad831 | |||
| abdb6244d3 | |||
| 90f1977a49 | |||
| bc33e4349d | |||
| 61f3d8d61c | |||
| 796d752974 | |||
| 008314676d | |||
| f364b3c06f | |||
| ae23ac12ff | |||
| e2bb7fda60 | |||
| 09d6dae75c | |||
| bc5813fd10 | |||
| 4464464c51 | |||
| a3e6aff330 | |||
| a523d0b894 | |||
| 8a809c3828 | |||
| 40f433b099 | |||
| 9a1266677a | |||
| d70dd2e6dd | |||
| f078d19e4b | |||
| e08d0f4016 | |||
| 0435e3537a | |||
| 0aadee550e | |||
| f487837b4b | |||
| b593db2150 | |||
| a07c2e6268 | |||
| e3c552dd54 | |||
| 8d1f7e77ed | |||
| cfd601e7bf | |||
| 5d81c63897 | |||
| cff6c5674f | |||
| edcb3f4289 | |||
| bd28a282df | |||
| 999071a15c | |||
| 9bee9d0a06 | |||
| f5b632e3e5 | |||
| 8ecd152b41 | |||
| ba22c18cd9 |
@@ -2,6 +2,9 @@ name: Test
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
version: "3"
|
||||
services:
|
||||
client:
|
||||
build:
|
||||
@@ -9,7 +8,6 @@ services:
|
||||
- server
|
||||
environment:
|
||||
- BASE_URL=http://server:3000
|
||||
image: habitica
|
||||
networks:
|
||||
- habitica
|
||||
ports:
|
||||
@@ -27,7 +25,6 @@ services:
|
||||
- mongo
|
||||
environment:
|
||||
- NODE_DB_URI=mongodb://mongo/habitrpg
|
||||
image: habitica
|
||||
networks:
|
||||
- habitica
|
||||
ports:
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
/* eslint-disable no-console */
|
||||
import { model as UserModel } from '../../../website/server/models/user';
|
||||
import { TransactionModel } from '../../../website/server/models/transaction';
|
||||
|
||||
const MIGRATION_NAME = '20220915_transactions_user_name';
|
||||
|
||||
/* transaction config */
|
||||
const transactionPerRun = 500;
|
||||
const progressCount = 1000;
|
||||
const transactionQuery = {
|
||||
migration: { $ne: MIGRATION_NAME }, // skip already migrated entries
|
||||
'transactionType': { $in: ['gift_send', 'gift_receive'] },
|
||||
};
|
||||
|
||||
let count = 0;
|
||||
async function updateTransaction (transaction, userNameMap) {
|
||||
count++;
|
||||
|
||||
const set = {
|
||||
migration: MIGRATION_NAME,
|
||||
};
|
||||
|
||||
if (userNameMap.has(transaction.reference)) {
|
||||
set['referenceText'] = userNameMap.get(transaction.reference);
|
||||
} else {
|
||||
set['referenceText'] = 'Account not found';
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) {
|
||||
console.warn(`${count} ${transaction._id}`);
|
||||
}
|
||||
|
||||
return TransactionModel.updateOne({
|
||||
_id: transaction._id
|
||||
}, { $set: set }).exec();
|
||||
}
|
||||
|
||||
export default async function processTransactions () {
|
||||
const fields = {
|
||||
_id: 1,
|
||||
reference: 1,
|
||||
referenceText: 1,
|
||||
};
|
||||
|
||||
const userNameMap = new Map();
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const foundTransactions = await TransactionModel // eslint-disable-line no-await-in-loop
|
||||
.find(transactionQuery)
|
||||
.limit(transactionPerRun)
|
||||
.sort({reference: 1})
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
if (foundTransactions.length === 0) {
|
||||
console.warn('All appropriate transactions found and modified.');
|
||||
console.warn(`\n${count} transactions processed\n`);
|
||||
break;
|
||||
}
|
||||
|
||||
// check for unknown users and load the names
|
||||
const userIdsToLoad = [];
|
||||
for (const foundTransaction of foundTransactions) {
|
||||
const userId = foundTransaction.reference;
|
||||
if (userNameMap.has(userId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
userIdsToLoad.push(userId);
|
||||
}
|
||||
|
||||
const users = await UserModel // eslint-disable-line no-await-in-loop
|
||||
.find({
|
||||
_id: { $in: userIdsToLoad }
|
||||
})
|
||||
.select({
|
||||
_id: 1,
|
||||
'auth.local.username': 1,
|
||||
})
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
for (const user of users) {
|
||||
const localUserName = user.auth?.local?.username;
|
||||
|
||||
if (!localUserName) {
|
||||
console.warn(`\nNo Username found for ID: ${user._id}\n`);
|
||||
continue;
|
||||
}
|
||||
|
||||
userNameMap.set(user._id, localUserName)
|
||||
}
|
||||
|
||||
await Promise.all(foundTransactions.map(t => updateTransaction(t, userNameMap))); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Award Habitoween ladder items to participants in this month's Habitoween festivities
|
||||
*/
|
||||
/* eslint-disable no-console */
|
||||
|
||||
const MIGRATION_NAME = '20221031_habitoween_ladder'; // Update when running in future years
|
||||
|
||||
import { model as User } from '../../../website/server/models/user';
|
||||
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count++;
|
||||
|
||||
const set = {};
|
||||
const inc = {
|
||||
'items.food.Candy_Skeleton': 1,
|
||||
'items.food.Candy_Base': 1,
|
||||
'items.food.Candy_CottonCandyBlue': 1,
|
||||
'items.food.Candy_CottonCandyPink': 1,
|
||||
'items.food.Candy_Shade': 1,
|
||||
'items.food.Candy_White': 1,
|
||||
'items.food.Candy_Golden': 1,
|
||||
'items.food.Candy_Zombie': 1,
|
||||
'items.food.Candy_Desert': 1,
|
||||
'items.food.Candy_Red': 1,
|
||||
};
|
||||
|
||||
set.migration = MIGRATION_NAME;
|
||||
|
||||
if (user && user.items && user.items.pets && user.items.pets['JackOLantern-RoyalPurple']) {
|
||||
set['items.mounts.JackOLantern-RoyalPurple'] = true;
|
||||
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Glow']) {
|
||||
set['items.pets.JackOLantern-RoyalPurple'] = 5;
|
||||
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Glow']) {
|
||||
set['items.mounts.JackOLantern-Glow'] = true;
|
||||
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Ghost']) {
|
||||
set['items.pets.JackOLantern-Glow'] = 5;
|
||||
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Ghost']) {
|
||||
set['items.mounts.JackOLantern-Ghost'] = true;
|
||||
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Base']) {
|
||||
set['items.pets.JackOLantern-Ghost'] = 5;
|
||||
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Base']) {
|
||||
set['items.mounts.JackOLantern-Base'] = true;
|
||||
} else {
|
||||
set['items.pets.JackOLantern-Base'] = 5;
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
return await User.update({_id: user._id}, {$inc: inc, $set: set}).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
let query = {
|
||||
migration: {$ne: MIGRATION_NAME},
|
||||
'auth.timestamps.loggedin': {$gt: new Date('2022-10-01')},
|
||||
};
|
||||
|
||||
const fields = {
|
||||
_id: 1,
|
||||
items: 1,
|
||||
};
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({_id: 1})
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
if (users.length === 0) {
|
||||
console.warn('All appropriate users found and modified.');
|
||||
console.warn(`\n${count} users processed\n`);
|
||||
break;
|
||||
} else {
|
||||
query._id = {
|
||||
$gt: users[users.length - 1],
|
||||
};
|
||||
}
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,119 @@
|
||||
/* eslint-disable no-console */
|
||||
const MIGRATION_NAME = '20221031_pet_set_group_achievements';
|
||||
import { model as User } from '../../../website/server/models/user';
|
||||
|
||||
const progressCount = 1000;
|
||||
let count = 0;
|
||||
|
||||
async function updateUser (user) {
|
||||
count++;
|
||||
|
||||
const set = {
|
||||
migration: MIGRATION_NAME,
|
||||
};
|
||||
|
||||
if (user && user.items && user.items.pets) {
|
||||
const pets = user.items.pets;
|
||||
if (pets['Wolf-Skeleton']
|
||||
&& pets['TigerCub-Skeleton']
|
||||
&& pets['PandaCub-Skeleton']
|
||||
&& pets['LionCub-Skeleton']
|
||||
&& pets['Fox-Skeleton']
|
||||
&& pets['FlyingPig-Skeleton']
|
||||
&& pets['Dragon-Skeleton']
|
||||
&& pets['Cactus-Skeleton']
|
||||
&& pets['BearCub-Skeleton']
|
||||
&& pets['Gryphon-Skeleton']
|
||||
&& pets['Hedgehog-Skeleton']
|
||||
&& pets['Deer-Skeleton']
|
||||
&& pets['Egg-Skeleton']
|
||||
&& pets['Rat-Skeleton']
|
||||
&& pets['Octopus-Skeleton']
|
||||
&& pets['Seahorse-Skeleton']
|
||||
&& pets['Parrot-Skeleton']
|
||||
&& pets['Rooster-Skeleton']
|
||||
&& pets['Spider-Skeleton']
|
||||
&& pets['Owl-Skeleton']
|
||||
&& pets['Penguin-Skeleton']
|
||||
&& pets['TRex-Skeleton']
|
||||
&& pets['Rock-Skeleton']
|
||||
&& pets['Bunny-Skeleton']
|
||||
&& pets['Slime-Skeleton']
|
||||
&& pets['Sheep-Skeleton']
|
||||
&& pets['Cuttlefish-Skeleton']
|
||||
&& pets['Whale-Skeleton']
|
||||
&& pets['Cheetah-Skeleton']
|
||||
&& pets['Horse-Skeleton']
|
||||
&& pets['Frog-Skeleton']
|
||||
&& pets['Snake-Skeleton']
|
||||
&& pets['Unicorn-Skeleton']
|
||||
&& pets['Sabretooth-Skeleton']
|
||||
&& pets['Monkey-Skeleton']
|
||||
&& pets['Snail-Skeleton']
|
||||
&& pets['Falcon-Skeleton']
|
||||
&& pets['Treeling-Skeleton']
|
||||
&& pets['Axolotl-Skeleton']
|
||||
&& pets['Turtle-Skeleton']
|
||||
&& pets['Armadillo-Skeleton']
|
||||
&& pets['Cow-Skeleton']
|
||||
&& pets['Beetle-Skeleton']
|
||||
&& pets['Ferret-Skeleton']
|
||||
&& pets['Sloth-Skeleton']
|
||||
&& pets['Triceratops-Skeleton']
|
||||
&& pets['GuineaPig-Skeleton']
|
||||
&& pets['Peacock-Skeleton']
|
||||
&& pets['Butterfly-Skeleton']
|
||||
&& pets['Nudibranch-Skeleton']
|
||||
&& pets['Hippo-Skeleton']
|
||||
&& pets['Yarn-Skeleton']
|
||||
&& pets['Pterodactyl-Skeleton']
|
||||
&& pets['Badger-Skeleton']
|
||||
&& pets['Squirrel-Skeleton']
|
||||
&& pets['SeaSerpent-Skeleton']
|
||||
&& pets['Kangaroo-Skeleton']
|
||||
&& pets['Alligator-Skeleton']
|
||||
&& pets['Velociraptor-Skeleton']
|
||||
&& pets['Dolphin-Skeleton']
|
||||
&& pets['Robot-Skeleton']) {
|
||||
set['achievements.boneToPick'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
||||
|
||||
return await User.update({ _id: user._id }, { $set: set }).exec();
|
||||
}
|
||||
|
||||
export default async function processUsers () {
|
||||
let query = {
|
||||
// migration: { $ne: MIGRATION_NAME },
|
||||
'auth.timestamps.loggedin': { $gt: new Date('2022-01-01') },
|
||||
};
|
||||
|
||||
const fields = {
|
||||
_id: 1,
|
||||
items: 1,
|
||||
};
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const users = await User // eslint-disable-line no-await-in-loop
|
||||
.find(query)
|
||||
.limit(250)
|
||||
.sort({_id: 1})
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
if (users.length === 0) {
|
||||
console.warn('All appropriate users found and modified.');
|
||||
console.warn(`\n${count} users processed\n`);
|
||||
break;
|
||||
} else {
|
||||
query._id = {
|
||||
$gt: users[users.length - 1]._id,
|
||||
};
|
||||
}
|
||||
|
||||
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.243.1",
|
||||
"version": "4.251.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.18.13",
|
||||
"@babel/preset-env": "^7.18.10",
|
||||
"@babel/core": "^7.19.6",
|
||||
"@babel/preset-env": "^7.20.2",
|
||||
"@babel/register": "^7.18.9",
|
||||
"@google-cloud/trace-agent": "^5.1.6",
|
||||
"@google-cloud/trace-agent": "^7.1.2",
|
||||
"@parse/node-apn": "^5.1.3",
|
||||
"@slack/webhook": "^6.1.0",
|
||||
"accepts": "^1.3.8",
|
||||
"amazon-payments": "^0.2.9",
|
||||
"amplitude": "^6.0.0",
|
||||
"apidoc": "^0.52.0",
|
||||
"apidoc": "^0.53.1",
|
||||
"apple-auth": "^1.0.7",
|
||||
"bcrypt": "^5.0.1",
|
||||
"body-parser": "^1.20.0",
|
||||
"bcrypt": "^5.1.0",
|
||||
"body-parser": "^1.20.1",
|
||||
"bootstrap": "^4.6.0",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-session": "^2.0.0",
|
||||
@@ -27,7 +27,7 @@
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.0.0",
|
||||
"express": "^4.18.1",
|
||||
"express": "^4.18.2",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-validator": "^5.2.0",
|
||||
"glob": "^8.0.3",
|
||||
@@ -41,9 +41,9 @@
|
||||
"helmet": "^4.6.0",
|
||||
"image-size": "^1.0.2",
|
||||
"in-app-purchase": "^1.11.3",
|
||||
"js2xmlparser": "^4.0.2",
|
||||
"js2xmlparser": "^5.0.0",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"jwks-rsa": "^2.1.4",
|
||||
"jwks-rsa": "^2.1.5",
|
||||
"lodash": "^4.17.21",
|
||||
"merge-stream": "^2.0.0",
|
||||
"method-override": "^3.0.0",
|
||||
@@ -61,20 +61,20 @@
|
||||
"paypal-rest-sdk": "^1.8.1",
|
||||
"pp-ipn": "^1.1.0",
|
||||
"ps-tree": "^1.0.0",
|
||||
"rate-limiter-flexible": "^2.3.7",
|
||||
"rate-limiter-flexible": "^2.4.0",
|
||||
"redis": "^3.1.2",
|
||||
"regenerator-runtime": "^0.13.9",
|
||||
"remove-markdown": "^0.5.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"short-uuid": "^4.2.0",
|
||||
"stripe": "^8.222.0",
|
||||
"superagent": "^7.1.6",
|
||||
"short-uuid": "^4.2.2",
|
||||
"stripe": "^10.13.0",
|
||||
"superagent": "^8.0.3",
|
||||
"universal-analytics": "^0.5.3",
|
||||
"useragent": "^2.1.9",
|
||||
"uuid": "^8.3.2",
|
||||
"validator": "^13.7.0",
|
||||
"vinyl-buffer": "^1.0.1",
|
||||
"winston": "^3.8.1",
|
||||
"winston": "^3.8.2",
|
||||
"winston-loggly-bulk": "^3.2.1",
|
||||
"xml2js": "^0.4.23"
|
||||
},
|
||||
@@ -111,10 +111,10 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^0.27.2",
|
||||
"chai": "^4.3.6",
|
||||
"chai": "^4.3.7",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-moment": "^0.1.0",
|
||||
"chalk": "^4.1.2",
|
||||
"chalk": "^5.1.2",
|
||||
"cross-spawn": "^7.0.3",
|
||||
"expect.js": "^0.3.1",
|
||||
"istanbul": "^1.1.0-alpha.1",
|
||||
@@ -122,7 +122,7 @@
|
||||
"monk": "^7.3.4",
|
||||
"require-again": "^2.0.0",
|
||||
"run-rs": "^0.7.7",
|
||||
"sinon": "^13.0.2",
|
||||
"sinon": "^14.0.2",
|
||||
"sinon-chai": "^3.7.0",
|
||||
"sinon-stub-promise": "^4.0.0"
|
||||
},
|
||||
|
||||
@@ -13,11 +13,6 @@ function getUser () {
|
||||
username: 'username',
|
||||
email: 'email@email',
|
||||
},
|
||||
facebook: {
|
||||
emails: [{
|
||||
value: 'email@facebook',
|
||||
}],
|
||||
},
|
||||
google: {
|
||||
emails: [{
|
||||
value: 'email@google',
|
||||
@@ -62,30 +57,12 @@ describe('emails', () => {
|
||||
expect(data).to.have.property('canSend', true);
|
||||
});
|
||||
|
||||
it('returns correct user data [facebook users]', () => {
|
||||
const attachEmail = requireAgain(pathToEmailLib);
|
||||
const { getUserInfo } = attachEmail;
|
||||
const user = getUser();
|
||||
delete user.profile.name;
|
||||
delete user.auth.local.email;
|
||||
delete user.auth.google.emails;
|
||||
delete user.auth.apple.emails;
|
||||
|
||||
const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']);
|
||||
|
||||
expect(data).to.have.property('name', user.auth.local.username);
|
||||
expect(data).to.have.property('email', user.auth.facebook.emails[0].value);
|
||||
expect(data).to.have.property('_id', user._id);
|
||||
expect(data).to.have.property('canSend', true);
|
||||
});
|
||||
|
||||
it('returns correct user data [google users]', () => {
|
||||
const attachEmail = requireAgain(pathToEmailLib);
|
||||
const { getUserInfo } = attachEmail;
|
||||
const user = getUser();
|
||||
delete user.profile.name;
|
||||
delete user.auth.local.email;
|
||||
delete user.auth.facebook.emails;
|
||||
delete user.auth.apple.emails;
|
||||
|
||||
const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']);
|
||||
@@ -103,7 +80,6 @@ describe('emails', () => {
|
||||
delete user.profile.name;
|
||||
delete user.auth.local.email;
|
||||
delete user.auth.google.emails;
|
||||
delete user.auth.facebook.emails;
|
||||
|
||||
const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']);
|
||||
|
||||
@@ -118,7 +94,6 @@ describe('emails', () => {
|
||||
const { getUserInfo } = attachEmail;
|
||||
const user = getUser();
|
||||
delete user.auth.local.email;
|
||||
delete user.auth.facebook;
|
||||
delete user.auth.google;
|
||||
delete user.auth.apple;
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ describe('Password Utilities', () => {
|
||||
it('returns false if the user has no local auth', async () => {
|
||||
const user = await generateUser({
|
||||
auth: {
|
||||
facebook: {},
|
||||
google: {},
|
||||
},
|
||||
});
|
||||
const res = await validatePasswordResetCodeAndFindUser(encrypt(JSON.stringify({
|
||||
|
||||
@@ -326,6 +326,7 @@ describe('Apple Payments', () => {
|
||||
it('errors when a user is already subscribed', async () => {
|
||||
payments.createSubscription.restore();
|
||||
user = new User();
|
||||
await user.save();
|
||||
|
||||
await applePayments.subscribe(sku, user, receipt, headers, nextPaymentProcessing);
|
||||
|
||||
|
||||
@@ -11,10 +11,13 @@ import {
|
||||
generateGroup,
|
||||
} from '../../../../helpers/api-unit.helper';
|
||||
import * as worldState from '../../../../../website/server/libs/worldState';
|
||||
import { TransactionModel } from '../../../../../website/server/models/transaction';
|
||||
|
||||
describe('payments/index', () => {
|
||||
let user; let group; let data; let
|
||||
plan;
|
||||
let user;
|
||||
let group;
|
||||
let data;
|
||||
let plan;
|
||||
|
||||
beforeEach(async () => {
|
||||
user = new User();
|
||||
@@ -104,6 +107,23 @@ describe('payments/index', () => {
|
||||
expect(recipient.purchased.plan.extraMonths).to.eql(3);
|
||||
});
|
||||
|
||||
it('add a transaction entry to the recipient', async () => {
|
||||
recipient.purchased.plan = plan;
|
||||
|
||||
expect(recipient.purchased.plan.extraMonths).to.eql(0);
|
||||
|
||||
await api.createSubscription(data);
|
||||
|
||||
expect(recipient.purchased.plan.extraMonths).to.eql(3);
|
||||
|
||||
const transactions = await TransactionModel
|
||||
.find({ userId: recipient._id })
|
||||
.sort({ createdAt: -1 })
|
||||
.exec();
|
||||
|
||||
expect(transactions).to.have.lengthOf(1);
|
||||
});
|
||||
|
||||
it('does not set negative extraMonths if plan has past dateTerminated date', async () => {
|
||||
const dateTerminated = moment().subtract(2, 'months').toDate();
|
||||
recipient.purchased.plan.dateTerminated = dateTerminated;
|
||||
@@ -672,10 +692,12 @@ describe('payments/index', () => {
|
||||
context('No Active Promotion', () => {
|
||||
beforeEach(() => {
|
||||
sinon.stub(worldState, 'getCurrentEvent').returns(null);
|
||||
sinon.stub(worldState, 'getCurrentEventList').returns([]);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
worldState.getCurrentEvent.restore();
|
||||
worldState.getCurrentEventList.restore();
|
||||
});
|
||||
|
||||
it('does not apply a discount', async () => {
|
||||
@@ -692,14 +714,14 @@ describe('payments/index', () => {
|
||||
|
||||
context('Active Promotion', () => {
|
||||
beforeEach(() => {
|
||||
sinon.stub(worldState, 'getCurrentEvent').returns({
|
||||
sinon.stub(worldState, 'getCurrentEventList').returns([{
|
||||
...common.content.events.fall2020,
|
||||
event: 'fall2020',
|
||||
});
|
||||
}]);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
worldState.getCurrentEvent.restore();
|
||||
worldState.getCurrentEventList.restore();
|
||||
});
|
||||
|
||||
it('applies a discount', async () => {
|
||||
|
||||
@@ -11,6 +11,12 @@ describe('PUT /group', () => {
|
||||
const groupName = 'Test Public Guild';
|
||||
const groupType = 'guild';
|
||||
const groupUpdatedName = 'Test Public Guild Updated';
|
||||
const groupCategories = [
|
||||
{
|
||||
slug: 'initialCat',
|
||||
name: 'Initial Category',
|
||||
},
|
||||
];
|
||||
|
||||
beforeEach(async () => {
|
||||
const { group, groupLeader, members } = await createAndPopulateGroup({
|
||||
@@ -18,6 +24,7 @@ describe('PUT /group', () => {
|
||||
name: groupName,
|
||||
type: groupType,
|
||||
privacy: 'public',
|
||||
categories: groupCategories,
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
@@ -61,6 +68,35 @@ describe('PUT /group', () => {
|
||||
expect(updatedGroup.categories[0].name).to.eql(categories[0].name);
|
||||
});
|
||||
|
||||
it('removes the initial group category', async () => {
|
||||
const categories = [];
|
||||
|
||||
const updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, {
|
||||
categories,
|
||||
});
|
||||
|
||||
expect(updatedGroup.categories.length).to.equal(0);
|
||||
});
|
||||
|
||||
it('removes duplicate group categories', async () => {
|
||||
const categories = [
|
||||
{
|
||||
slug: 'newCat',
|
||||
name: 'New Category',
|
||||
},
|
||||
{
|
||||
slug: 'newCat',
|
||||
name: 'New Category',
|
||||
},
|
||||
];
|
||||
|
||||
const updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, {
|
||||
categories,
|
||||
});
|
||||
|
||||
expect(updatedGroup.categories.length).to.equal(1);
|
||||
});
|
||||
|
||||
it('allows an admin to update a guild', async () => {
|
||||
const updatedGroup = await adminUser.put(`/groups/${groupToUpdate._id}`, {
|
||||
name: groupUpdatedName,
|
||||
|
||||
@@ -289,45 +289,6 @@ describe('DELETE /user', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('user with Facebook auth', async () => {
|
||||
beforeEach(async () => {
|
||||
user = await generateUser({
|
||||
auth: {
|
||||
facebook: {
|
||||
id: 'facebook-id',
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an error if confirmation phrase is wrong', async () => {
|
||||
await expect(user.del('/user', {
|
||||
password: 'just-do-it',
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('incorrectDeletePhrase', { magicWord: 'DELETE' }),
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an error if confirmation phrase is not supplied', async () => {
|
||||
await expect(user.del('/user', {
|
||||
password: '',
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('missingPassword'),
|
||||
});
|
||||
});
|
||||
|
||||
it('deletes a Facebook user', async () => {
|
||||
await user.del('/user', {
|
||||
password: DELETE_CONFIRMATION,
|
||||
});
|
||||
await expect(checkExistence('users', user._id)).to.eventually.eql(false);
|
||||
});
|
||||
});
|
||||
|
||||
context('user with Google auth', async () => {
|
||||
beforeEach(async () => {
|
||||
user = await generateUser({
|
||||
|
||||
@@ -20,44 +20,6 @@ describe('DELETE social registration', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('Facebook', () => {
|
||||
it('fails if user does not have an alternative registration method', async () => {
|
||||
await user.update({
|
||||
'auth.facebook.id': 'some-fb-id',
|
||||
'auth.local': { ok: true },
|
||||
});
|
||||
await expect(user.del('/user/auth/social/facebook')).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('cantDetachSocial'),
|
||||
});
|
||||
});
|
||||
|
||||
it('succeeds if user has a local registration', async () => {
|
||||
await user.update({
|
||||
'auth.facebook.id': 'some-fb-id',
|
||||
});
|
||||
|
||||
const response = await user.del('/user/auth/social/facebook');
|
||||
expect(response).to.eql({});
|
||||
await user.sync();
|
||||
expect(user.auth.facebook).to.be.undefined;
|
||||
});
|
||||
|
||||
it('succeeds if user has a google registration', async () => {
|
||||
await user.update({
|
||||
'auth.facebook.id': 'some-fb-id',
|
||||
'auth.google.id': 'some-google-id',
|
||||
'auth.local': { ok: true },
|
||||
});
|
||||
|
||||
const response = await user.del('/user/auth/social/facebook');
|
||||
expect(response).to.eql({});
|
||||
await user.sync();
|
||||
expect(user.auth.facebook).to.be.undefined;
|
||||
});
|
||||
});
|
||||
|
||||
context('Google', () => {
|
||||
it('fails if user does not have an alternative registration method', async () => {
|
||||
await user.update({
|
||||
@@ -81,19 +43,6 @@ describe('DELETE social registration', () => {
|
||||
await user.sync();
|
||||
expect(user.auth.google).to.be.undefined;
|
||||
});
|
||||
|
||||
it('succeeds if user has a facebook registration', async () => {
|
||||
await user.update({
|
||||
'auth.google.id': 'some-google-id',
|
||||
'auth.facebook.id': 'some-facebook-id',
|
||||
'auth.local': { ok: true },
|
||||
});
|
||||
|
||||
const response = await user.del('/user/auth/social/google');
|
||||
expect(response).to.eql({});
|
||||
await user.sync();
|
||||
expect(user.auth.goodl).to.be.undefined;
|
||||
});
|
||||
});
|
||||
|
||||
context('Apple', () => {
|
||||
@@ -119,18 +68,5 @@ describe('DELETE social registration', () => {
|
||||
await user.sync();
|
||||
expect(user.auth.apple).to.be.undefined;
|
||||
});
|
||||
|
||||
it('succeeds if user has a facebook registration', async () => {
|
||||
await user.update({
|
||||
'auth.apple.id': 'some-apple-id',
|
||||
'auth.facebook.id': 'some-facebook-id',
|
||||
'auth.local': { ok: true },
|
||||
});
|
||||
|
||||
const response = await user.del('/user/auth/social/apple');
|
||||
expect(response).to.eql({});
|
||||
await user.sync();
|
||||
expect(user.auth.goodl).to.be.undefined;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -344,6 +344,24 @@ describe('POST /user/auth/local/register', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('enforces maximum length for the password', async () => {
|
||||
const username = generateRandomUserName();
|
||||
const email = `${username}@example.com`;
|
||||
const password = '12345678910111213141516171819202122232425262728293031323334353637383940';
|
||||
const confirmPassword = '12345678910111213141516171819202122232425262728293031323334353637383940';
|
||||
|
||||
await expect(api.post('/user/auth/local/register', {
|
||||
username,
|
||||
email,
|
||||
password,
|
||||
confirmPassword,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('invalidReqParams'),
|
||||
});
|
||||
});
|
||||
|
||||
it('requires a username', async () => {
|
||||
const email = `${generateRandomUserName()}@example.com`;
|
||||
const password = 'password';
|
||||
|
||||
@@ -12,7 +12,6 @@ describe('POST /user/auth/social', () => {
|
||||
let user;
|
||||
const endpoint = '/user/auth/social';
|
||||
let randomAccessToken = '123456';
|
||||
let randomFacebookId = 'facebookId';
|
||||
let randomGoogleId = 'googleId';
|
||||
let network = 'NoNetwork';
|
||||
|
||||
@@ -33,146 +32,6 @@ describe('POST /user/auth/social', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('facebook', () => {
|
||||
beforeEach(async () => {
|
||||
randomFacebookId = generateUUID();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: `${user.auth.local.username}+facebook@example.com` },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
network = 'facebook';
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.newUser).to.be.true;
|
||||
expect(response.username).to.exist;
|
||||
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a facebook user');
|
||||
await expect(getProperty('users', response.id, 'auth.local.lowerCaseUsername')).to.exist;
|
||||
await expect(getProperty('users', response.id, 'auth.local.email')).to.eventually.equal(`${user.auth.local.username}+facebook@example.com`);
|
||||
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(randomFacebookId);
|
||||
});
|
||||
|
||||
it('logs an existing user in', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.newUser).to.be.false;
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
});
|
||||
|
||||
it('logs an existing user in if they have local auth with matching email', async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('logs an existing user into their social account if they have local auth with matching email', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
// This is important for existing accounts before the new social handling
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.apiToken).not.to.eql(user.apiToken);
|
||||
expect(response.id).not.to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('add social auth to an existing user', async () => {
|
||||
const response = await user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('does not log into other account if social auth already exists', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
|
||||
await expect(user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('socialAlreadyExists'),
|
||||
});
|
||||
});
|
||||
|
||||
xit('enrolls a new user in an A/B test', async () => {
|
||||
await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
await expect(getProperty('users', user._id, '_ABtests')).to.eventually.be.a('object');
|
||||
});
|
||||
});
|
||||
|
||||
describe('google', () => {
|
||||
beforeEach(async () => {
|
||||
randomGoogleId = generateUUID();
|
||||
|
||||
@@ -25,6 +25,19 @@ describe('POST /user/reset-password', async () => {
|
||||
expect(user.auth.local.hashed_password).to.not.eql(previousPassword);
|
||||
});
|
||||
|
||||
it('resets password for social users', async () => {
|
||||
const email = `${user.auth.local.username}+google@example.com`;
|
||||
await user.update({ 'auth.google.emails': [{ value: email }] });
|
||||
await user.sync();
|
||||
const previousPassword = user.auth.local.passwordResetCode;
|
||||
const response = await user.post(endpoint, {
|
||||
email,
|
||||
});
|
||||
expect(response).to.eql({ data: {}, message: t('passwordReset') });
|
||||
await user.sync();
|
||||
expect(user.auth.local.passwordResetCode).to.not.eql(previousPassword);
|
||||
});
|
||||
|
||||
it('same message on error as on success', async () => {
|
||||
const response = await user.post(endpoint, {
|
||||
email: 'nonExistent@email.com',
|
||||
|
||||
@@ -213,7 +213,7 @@ describe('cron utility functions', () => {
|
||||
};
|
||||
}
|
||||
|
||||
it('offset 0, next date in 3 months', () => {
|
||||
it('monthly plan, next date in 3 months', () => {
|
||||
const user = baseUserData(60, 0, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
@@ -222,8 +222,8 @@ describe('cron utility functions', () => {
|
||||
.to.be.sameMoment('2022-08-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 1, next date in 1 months', () => {
|
||||
const user = baseUserData(60, 1, 'group_plan_auto');
|
||||
it('monthly plan, next date in 1 month', () => {
|
||||
const user = baseUserData(62, 0, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
@@ -231,8 +231,17 @@ describe('cron utility functions', () => {
|
||||
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 2, next date in 2 months - with any plan', () => {
|
||||
const user = baseUserData(60, 2, 'basic_3mo');
|
||||
it('multi-month plan, no offset', () => {
|
||||
const user = baseUserData(60, 0, 'basic_3mo');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('multi-month plan with offset', () => {
|
||||
const user = baseUserData(60, 1, 'basic_3mo');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
|
||||
@@ -22,17 +22,17 @@
|
||||
}
|
||||
},
|
||||
"@amplitude/analytics-connector": {
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.4.tgz",
|
||||
"integrity": "sha512-6JcE1nxrprJt6pHqqDQb7FXRqJmFHG7KJPe0jNZaAvfll4mWKVqZu8W9IV3XiN1P+xgHIV1NN+i3PLOAZWEhXg==",
|
||||
"version": "1.4.5",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.5.tgz",
|
||||
"integrity": "sha512-ELAP6ivg+13uSk+TOirGZE/92M+tTbeiQ/i7eXgDO4Hiy00Abf/UxO/rp9WovtxCyeFYTILrujEYxPv5cRQmFw==",
|
||||
"requires": {
|
||||
"@amplitude/ua-parser-js": "0.7.31"
|
||||
}
|
||||
},
|
||||
"@amplitude/types": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.10.0.tgz",
|
||||
"integrity": "sha512-xN0gnhutztv6kqHaZ2bre18anQV5GDmMXOeipTvI670g2VjNbPfOzMwu1LN4p1NadYq+GqYI223UcZrXR+R4Pw=="
|
||||
"version": "1.10.2",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.10.2.tgz",
|
||||
"integrity": "sha512-I8qenRI7uU6wKNb9LiZrAosSHVoNHziXouKY81CrqxH9xhVTEIJFXeuCV0hbtBr0Al/8ejnGjQRx+S2SvU/pPg=="
|
||||
},
|
||||
"@amplitude/ua-parser-js": {
|
||||
"version": "0.7.31",
|
||||
@@ -40,12 +40,19 @@
|
||||
"integrity": "sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg=="
|
||||
},
|
||||
"@amplitude/utils": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.10.0.tgz",
|
||||
"integrity": "sha512-/R8j8IzFH0GYfA6ehQDm5IEzt71gIeMdiYYFIzZp6grERQlgJcwNJMAiza0o2JwwTDIruzqdB3c/vLVjuakp+w==",
|
||||
"version": "1.10.2",
|
||||
"resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.10.2.tgz",
|
||||
"integrity": "sha512-tVsHXu61jITEtRjB7NugQ5cVDd4QDzne8T3ifmZye7TiJeUfVRvqe44gDtf55A+7VqhDhyEIIXTA1iVcDGqlEw==",
|
||||
"requires": {
|
||||
"@amplitude/types": "^1.10.0",
|
||||
"tslib": "^1.9.3"
|
||||
"@amplitude/types": "^1.10.2",
|
||||
"tslib": "^2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
|
||||
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@babel/code-frame": {
|
||||
@@ -4349,9 +4356,9 @@
|
||||
"integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA=="
|
||||
},
|
||||
"@hapi/hoek": {
|
||||
"version": "8.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.3.1.tgz",
|
||||
"integrity": "sha512-75ocgnI7HG/I01iGA3/rs0y6PXydUA/kxhFZM0HoT8NLSTnt/J8Gq03iKl4a4B/2A3iMG0ctXtxr5Hg9SGr1gw=="
|
||||
"version": "8.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
|
||||
"integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow=="
|
||||
},
|
||||
"@hapi/joi": {
|
||||
"version": "15.1.1",
|
||||
@@ -4811,6 +4818,31 @@
|
||||
"warning": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"@sideway/address": {
|
||||
"version": "4.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
|
||||
"integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
|
||||
"requires": {
|
||||
"@hapi/hoek": "^9.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hapi/hoek": {
|
||||
"version": "9.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
|
||||
"integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@sideway/formula": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
|
||||
"integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg=="
|
||||
},
|
||||
"@sideway/pinpoint": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
|
||||
"integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
|
||||
},
|
||||
"@soda/friendly-errors-webpack-plugin": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz",
|
||||
@@ -12357,29 +12389,39 @@
|
||||
}
|
||||
},
|
||||
"@vue/cli-plugin-router": {
|
||||
"version": "4.5.15",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz",
|
||||
"integrity": "sha512-q7Y6kP9b3k55Ca2j59xJ7XPA6x+iSRB+N4ac0ZbcL1TbInVQ4j5wCzyE+uqid40hLy4fUdlpl4X9fHJEwuVxPA==",
|
||||
"version": "5.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz",
|
||||
"integrity": "sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg==",
|
||||
"requires": {
|
||||
"@vue/cli-shared-utils": "^4.5.15"
|
||||
"@vue/cli-shared-utils": "^5.0.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vue/cli-shared-utils": {
|
||||
"version": "4.5.15",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz",
|
||||
"integrity": "sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q==",
|
||||
"@achrinza/node-ipc": {
|
||||
"version": "9.2.5",
|
||||
"resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.5.tgz",
|
||||
"integrity": "sha512-kBX7Ay911iXZ3VZ1pYltj3Rfu7Ow9H7sK4H4RSfWIfWR2JKNB40K808wppoRIEzE2j2hXLU+r6TJgCAliCGhyQ==",
|
||||
"requires": {
|
||||
"@hapi/joi": "^15.0.1",
|
||||
"chalk": "^2.4.2",
|
||||
"@node-ipc/js-queue": "2.0.3",
|
||||
"event-pubsub": "4.3.0",
|
||||
"js-message": "1.0.7"
|
||||
}
|
||||
},
|
||||
"@vue/cli-shared-utils": {
|
||||
"version": "5.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz",
|
||||
"integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==",
|
||||
"requires": {
|
||||
"@achrinza/node-ipc": "^9.2.5",
|
||||
"chalk": "^4.1.2",
|
||||
"execa": "^1.0.0",
|
||||
"joi": "^17.4.0",
|
||||
"launch-editor": "^2.2.1",
|
||||
"lru-cache": "^5.1.1",
|
||||
"node-ipc": "^9.1.1",
|
||||
"open": "^6.3.0",
|
||||
"ora": "^3.4.0",
|
||||
"lru-cache": "^6.0.0",
|
||||
"node-fetch": "^2.6.7",
|
||||
"open": "^8.0.2",
|
||||
"ora": "^5.3.0",
|
||||
"read-pkg": "^5.1.1",
|
||||
"request": "^2.88.2",
|
||||
"semver": "^6.1.0",
|
||||
"semver": "^7.3.4",
|
||||
"strip-ansi": "^6.0.0"
|
||||
}
|
||||
},
|
||||
@@ -12388,10 +12430,152 @@
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
|
||||
},
|
||||
"ansi-styles": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||
"requires": {
|
||||
"color-convert": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"chalk": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||
"requires": {
|
||||
"ansi-styles": "^4.1.0",
|
||||
"supports-color": "^7.1.0"
|
||||
}
|
||||
},
|
||||
"cli-cursor": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
|
||||
"integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
|
||||
"requires": {
|
||||
"restore-cursor": "^3.1.0"
|
||||
}
|
||||
},
|
||||
"cli-spinners": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
|
||||
"integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g=="
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"requires": {
|
||||
"color-name": "~1.1.4"
|
||||
}
|
||||
},
|
||||
"color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
|
||||
},
|
||||
"is-docker": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
|
||||
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
|
||||
},
|
||||
"is-wsl": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
|
||||
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
|
||||
"requires": {
|
||||
"is-docker": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"js-message": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz",
|
||||
"integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA=="
|
||||
},
|
||||
"log-symbols": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
|
||||
"integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
|
||||
"requires": {
|
||||
"chalk": "^4.1.0",
|
||||
"is-unicode-supported": "^0.1.0"
|
||||
}
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||
"requires": {
|
||||
"yallist": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"mimic-fn": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
|
||||
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.6.7",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
|
||||
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
|
||||
"requires": {
|
||||
"whatwg-url": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"onetime": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
|
||||
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
|
||||
"requires": {
|
||||
"mimic-fn": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"open": {
|
||||
"version": "8.4.0",
|
||||
"resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
|
||||
"integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
|
||||
"requires": {
|
||||
"define-lazy-prop": "^2.0.0",
|
||||
"is-docker": "^2.1.1",
|
||||
"is-wsl": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"ora": {
|
||||
"version": "5.4.1",
|
||||
"resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
|
||||
"integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
|
||||
"requires": {
|
||||
"bl": "^4.1.0",
|
||||
"chalk": "^4.1.0",
|
||||
"cli-cursor": "^3.1.0",
|
||||
"cli-spinners": "^2.5.0",
|
||||
"is-interactive": "^1.0.0",
|
||||
"is-unicode-supported": "^0.1.0",
|
||||
"log-symbols": "^4.1.0",
|
||||
"strip-ansi": "^6.0.0",
|
||||
"wcwidth": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"restore-cursor": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
|
||||
"integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
|
||||
"requires": {
|
||||
"onetime": "^5.1.0",
|
||||
"signal-exit": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"semver": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
|
||||
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
|
||||
"version": "7.3.7",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
|
||||
"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
|
||||
"requires": {
|
||||
"lru-cache": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "6.0.1",
|
||||
@@ -12400,6 +12584,38 @@
|
||||
"requires": {
|
||||
"ansi-regex": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"requires": {
|
||||
"has-flag": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"tr46": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
||||
},
|
||||
"webidl-conversions": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
||||
},
|
||||
"whatwg-url": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||
"requires": {
|
||||
"tr46": "~0.0.3",
|
||||
"webidl-conversions": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -12605,11 +12821,6 @@
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
},
|
||||
"semver": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
|
||||
@@ -13127,13 +13338,13 @@
|
||||
"integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
|
||||
},
|
||||
"amplitude-js": {
|
||||
"version": "8.18.5",
|
||||
"resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.18.5.tgz",
|
||||
"integrity": "sha512-s43q4qKd7kvhYESQhYvyKDKUM1PpyAyoOFFlyMuFfQHRxyeDmZRhcfzrKnOhbrLhFxSWtPc0VEeh9tajJRNe5Q==",
|
||||
"version": "8.21.1",
|
||||
"resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.21.1.tgz",
|
||||
"integrity": "sha512-02S0EWLTkCYurpKx6o6K7+BbtVHzhCTHDM+jgvCAV5VbbsXdhLqVY7Q6NtAF+Wb8phb9K0GSW1SuDKPy4TY9OA==",
|
||||
"requires": {
|
||||
"@amplitude/analytics-connector": "1.4.4",
|
||||
"@amplitude/analytics-connector": "^1.4.5",
|
||||
"@amplitude/ua-parser-js": "0.7.31",
|
||||
"@amplitude/utils": "^1.0.5",
|
||||
"@amplitude/utils": "^1.10.1",
|
||||
"@babel/runtime": "^7.3.4",
|
||||
"blueimp-md5": "^2.10.0",
|
||||
"query-string": "5"
|
||||
@@ -13214,11 +13425,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ansi-html": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
|
||||
"integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
|
||||
},
|
||||
"ansi-html-community": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
|
||||
@@ -13831,11 +14037,29 @@
|
||||
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.25.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
|
||||
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
|
||||
"integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.14.7"
|
||||
"follow-redirects": "^1.14.9",
|
||||
"form-data": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"follow-redirects": {
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
||||
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
|
||||
},
|
||||
"form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"axios-progress-bar": {
|
||||
@@ -14477,6 +14701,37 @@
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
|
||||
"integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
|
||||
},
|
||||
"bl": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
|
||||
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
|
||||
"requires": {
|
||||
"buffer": "^5.5.0",
|
||||
"inherits": "^2.0.4",
|
||||
"readable-stream": "^3.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"buffer": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
|
||||
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
|
||||
"requires": {
|
||||
"base64-js": "^1.3.1",
|
||||
"ieee754": "^1.1.13"
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"requires": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"bluebird": {
|
||||
"version": "3.7.0",
|
||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz",
|
||||
@@ -15880,9 +16135,9 @@
|
||||
}
|
||||
},
|
||||
"core-js": {
|
||||
"version": "3.24.1",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz",
|
||||
"integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg=="
|
||||
"version": "3.26.0",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz",
|
||||
"integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw=="
|
||||
},
|
||||
"core-js-compat": {
|
||||
"version": "3.11.0",
|
||||
@@ -16334,7 +16589,7 @@
|
||||
"de-indent": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
|
||||
"integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="
|
||||
"integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0="
|
||||
},
|
||||
"debug": {
|
||||
"version": "4.1.1",
|
||||
@@ -16500,6 +16755,11 @@
|
||||
"clone": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"define-lazy-prop": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
|
||||
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="
|
||||
},
|
||||
"define-properties": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
|
||||
@@ -16812,9 +17072,9 @@
|
||||
}
|
||||
},
|
||||
"dompurify": {
|
||||
"version": "2.3.10",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.10.tgz",
|
||||
"integrity": "sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g=="
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz",
|
||||
"integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA=="
|
||||
},
|
||||
"domutils": {
|
||||
"version": "1.7.0",
|
||||
@@ -18455,11 +18715,6 @@
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"bundled": true,
|
||||
"optional": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "2.3.5",
|
||||
"bundled": true,
|
||||
@@ -18477,14 +18732,6 @@
|
||||
"minipass": "^2.2.1"
|
||||
}
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"bundled": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"bundled": true,
|
||||
@@ -18607,13 +18854,6 @@
|
||||
"ini": "~1.3.0",
|
||||
"minimist": "^1.2.0",
|
||||
"strip-json-comments": "~2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "1.2.0",
|
||||
"bundled": true,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
@@ -20147,9 +20387,9 @@
|
||||
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
|
||||
},
|
||||
"intro.js": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/intro.js/-/intro.js-5.1.0.tgz",
|
||||
"integrity": "sha512-zwWl/duTh00eeNcZRU4o4/xxloNYPFKs4n4lMRDNx59jZr+qRI0jSOnzqYMOuVftD4beGrmxBHz4k8qp9/dCMA=="
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/intro.js/-/intro.js-6.0.0.tgz",
|
||||
"integrity": "sha512-ZUiR6BoLSvPSlLG0boewnWVgji1fE1gBvP/pyw5pgCKXEDQz1mMeUxarggClPNs71UTq364LwSk9zxz17A9gaQ=="
|
||||
},
|
||||
"invariant": {
|
||||
"version": "2.2.4",
|
||||
@@ -20411,6 +20651,11 @@
|
||||
"resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz",
|
||||
"integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA=="
|
||||
},
|
||||
"is-interactive": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
|
||||
"integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
|
||||
},
|
||||
"is-map": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
|
||||
@@ -20550,6 +20795,11 @@
|
||||
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
|
||||
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
|
||||
},
|
||||
"is-unicode-supported": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
|
||||
"integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="
|
||||
},
|
||||
"is-weakref": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
|
||||
@@ -20566,7 +20816,7 @@
|
||||
"is-window": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz",
|
||||
"integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg=="
|
||||
"integrity": "sha1-LIlspT25feRdPDMTOmXYyfVjSA0="
|
||||
},
|
||||
"is-windows": {
|
||||
"version": "1.0.2",
|
||||
@@ -20667,10 +20917,37 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"joi": {
|
||||
"version": "17.6.0",
|
||||
"resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
|
||||
"integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
|
||||
"requires": {
|
||||
"@hapi/hoek": "^9.0.0",
|
||||
"@hapi/topo": "^5.0.0",
|
||||
"@sideway/address": "^4.1.3",
|
||||
"@sideway/formula": "^3.0.0",
|
||||
"@sideway/pinpoint": "^2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hapi/hoek": {
|
||||
"version": "9.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
|
||||
"integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="
|
||||
},
|
||||
"@hapi/topo": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
|
||||
"integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
|
||||
"requires": {
|
||||
"@hapi/hoek": "^9.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"jquery": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
|
||||
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz",
|
||||
"integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw=="
|
||||
},
|
||||
"js-message": {
|
||||
"version": "1.0.5",
|
||||
@@ -20860,13 +21137,6 @@
|
||||
"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"jsonfile": {
|
||||
@@ -21529,9 +21799,9 @@
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
|
||||
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
|
||||
},
|
||||
"minipass": {
|
||||
"version": "3.1.1",
|
||||
@@ -21625,18 +21895,11 @@
|
||||
}
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"version": "0.5.6",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
|
||||
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
|
||||
}
|
||||
"minimist": "^1.2.6"
|
||||
}
|
||||
},
|
||||
"mocha": {
|
||||
@@ -21707,11 +21970,6 @@
|
||||
"path-exists": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.4",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
|
||||
@@ -23175,19 +23433,6 @@
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.5",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
|
||||
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -26120,9 +26365,9 @@
|
||||
}
|
||||
},
|
||||
"smartbanner.js": {
|
||||
"version": "1.19.0",
|
||||
"resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.19.0.tgz",
|
||||
"integrity": "sha512-F9vR7AIbyg2myhP9DrNYsKlKNqLuen+FFAu5R7SAF9IyCxNQkjpGUmiHbEaEVFTLw8J9hPmVC2lyGEJlOXTXKQ=="
|
||||
"version": "1.19.1",
|
||||
"resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.19.1.tgz",
|
||||
"integrity": "sha512-x3alFTlk6pLuqrm9PrYQv1E+86CrEIgPf/KJ+nP5342BmOWstbdR8OwD3TPmM56zHQm4MEr/eoqbEcfTKdvdKw=="
|
||||
},
|
||||
"snapdragon": {
|
||||
"version": "0.8.2",
|
||||
@@ -28222,7 +28467,7 @@
|
||||
"uuid-browser": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz",
|
||||
"integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg=="
|
||||
"integrity": "sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA="
|
||||
},
|
||||
"v8-compile-cache": {
|
||||
"version": "2.1.0",
|
||||
@@ -28306,23 +28551,23 @@
|
||||
"integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk="
|
||||
},
|
||||
"vue": {
|
||||
"version": "2.7.8",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.8.tgz",
|
||||
"integrity": "sha512-ncwlZx5qOcn754bCu5/tS/IWPhXHopfit79cx+uIlLMyt3vCMGcXai5yCG5y+I6cDmEj4ukRYyZail9FTQh7lQ==",
|
||||
"version": "2.7.10",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.10.tgz",
|
||||
"integrity": "sha512-HmFC70qarSHPXcKtW8U8fgIkF6JGvjEmDiVInTkKZP0gIlEPhlVlcJJLkdGIDiNkIeA2zJPQTWJUI4iWe+AVfg==",
|
||||
"requires": {
|
||||
"@vue/compiler-sfc": "2.7.8",
|
||||
"@vue/compiler-sfc": "2.7.10",
|
||||
"csstype": "^3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/parser": {
|
||||
"version": "7.18.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz",
|
||||
"integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg=="
|
||||
"version": "7.18.13",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
|
||||
"integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg=="
|
||||
},
|
||||
"@vue/compiler-sfc": {
|
||||
"version": "2.7.8",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.8.tgz",
|
||||
"integrity": "sha512-2DK4YWKfgLnW9VDR9gnju1gcYRk3flKj8UNsms7fsRmFcg35slVTZEkqwBtX+wJBXaamFfn6NxSsZh3h12Ix/Q==",
|
||||
"version": "2.7.10",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.10.tgz",
|
||||
"integrity": "sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q==",
|
||||
"requires": {
|
||||
"@babel/parser": "^7.18.4",
|
||||
"postcss": "^8.4.14",
|
||||
@@ -28340,9 +28585,9 @@
|
||||
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
|
||||
},
|
||||
"postcss": {
|
||||
"version": "8.4.14",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
|
||||
"integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
|
||||
"version": "8.4.16",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
|
||||
"integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
|
||||
"requires": {
|
||||
"nanoid": "^3.3.4",
|
||||
"picocolors": "^1.0.0",
|
||||
@@ -28626,9 +28871,9 @@
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
|
||||
},
|
||||
"loader-utils": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
|
||||
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
|
||||
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
|
||||
"requires": {
|
||||
"big.js": "^5.2.2",
|
||||
"emojis-list": "^3.0.0",
|
||||
@@ -28655,9 +28900,9 @@
|
||||
}
|
||||
},
|
||||
"vue-router": {
|
||||
"version": "3.5.4",
|
||||
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.4.tgz",
|
||||
"integrity": "sha512-x+/DLAJZv2mcQ7glH2oV9ze8uPwcI+H+GgTgTmb5I55bCgY3+vXWIsqbYUzbBSZnwFHEJku4eoaH/x98veyymQ=="
|
||||
"version": "3.6.5",
|
||||
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz",
|
||||
"integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ=="
|
||||
},
|
||||
"vue-style-loader": {
|
||||
"version": "4.1.3",
|
||||
@@ -28676,9 +28921,9 @@
|
||||
}
|
||||
},
|
||||
"vue-template-compiler": {
|
||||
"version": "2.7.8",
|
||||
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.8.tgz",
|
||||
"integrity": "sha512-eQqdcUpJKJpBRPDdxCNsqUoT0edNvdt1jFjtVnVS/LPPmr0BU2jWzXlrf6BVMeODtdLewB3j8j3WjNiB+V+giw==",
|
||||
"version": "2.7.10",
|
||||
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.10.tgz",
|
||||
"integrity": "sha512-QO+8R9YRq1Gudm8ZMdo/lImZLJVUIAM8c07Vp84ojdDAf8HmPJc7XB556PcXV218k2AkKznsRz6xB5uOjAC4EQ==",
|
||||
"requires": {
|
||||
"de-indent": "^1.0.2",
|
||||
"he": "^1.2.0"
|
||||
@@ -28903,19 +29148,6 @@
|
||||
"webpack-sources": "^1.4.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.5",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
|
||||
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.5"
|
||||
}
|
||||
},
|
||||
"serialize-javascript": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
|
||||
@@ -29009,11 +29241,11 @@
|
||||
}
|
||||
},
|
||||
"webpack-dev-server": {
|
||||
"version": "3.11.2",
|
||||
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz",
|
||||
"integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==",
|
||||
"version": "3.11.3",
|
||||
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz",
|
||||
"integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==",
|
||||
"requires": {
|
||||
"ansi-html": "0.0.7",
|
||||
"ansi-html-community": "0.0.8",
|
||||
"bonjour": "^3.5.0",
|
||||
"chokidar": "^2.1.8",
|
||||
"compression": "^1.7.4",
|
||||
@@ -29051,7 +29283,7 @@
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
|
||||
"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
|
||||
},
|
||||
"http-proxy-middleware": {
|
||||
"version": "0.19.1",
|
||||
@@ -29077,7 +29309,7 @@
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
|
||||
@@ -21,19 +21,19 @@
|
||||
"@storybook/vue": "6.3.13",
|
||||
"@vue/cli-plugin-babel": "^4.5.15",
|
||||
"@vue/cli-plugin-eslint": "^4.5.19",
|
||||
"@vue/cli-plugin-router": "^4.5.15",
|
||||
"@vue/cli-plugin-router": "^5.0.8",
|
||||
"@vue/cli-plugin-unit-mocha": "^4.5.15",
|
||||
"@vue/cli-service": "^4.5.15",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"amplitude-js": "^8.18.5",
|
||||
"axios": "^0.25.0",
|
||||
"amplitude-js": "^8.21.1",
|
||||
"axios": "^0.27.2",
|
||||
"axios-progress-bar": "^1.2.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"bootstrap": "^4.6.0",
|
||||
"bootstrap-vue": "^2.22.0",
|
||||
"chai": "^4.3.6",
|
||||
"core-js": "^3.24.1",
|
||||
"dompurify": "^2.3.10",
|
||||
"core-js": "^3.26.0",
|
||||
"dompurify": "^2.4.1",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
@@ -41,25 +41,26 @@
|
||||
"habitica-markdown": "^3.0.0",
|
||||
"hellojs": "^1.19.5",
|
||||
"inspectpack": "^4.7.1",
|
||||
"intro.js": "^5.1.0",
|
||||
"jquery": "^3.6.0",
|
||||
"intro.js": "^6.0.0",
|
||||
"jquery": "^3.6.1",
|
||||
"lodash": "^4.17.21",
|
||||
"moment": "^2.29.4",
|
||||
"nconf": "^0.12.0",
|
||||
"sass": "^1.34.0",
|
||||
"sass-loader": "^8.0.2",
|
||||
"smartbanner.js": "^1.19.0",
|
||||
"smartbanner.js": "^1.19.1",
|
||||
"stopword": "^2.0.5",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
"svg-url-loader": "^7.1.1",
|
||||
"svgo": "^1.3.2",
|
||||
"svgo-loader": "^2.2.1",
|
||||
"uuid": "^8.3.2",
|
||||
"validator": "^13.7.0",
|
||||
"vue": "^2.7.8",
|
||||
"vue": "^2.7.10",
|
||||
"vue-cli-plugin-storybook": "2.1.0",
|
||||
"vue-mugen-scroll": "^0.2.6",
|
||||
"vue-router": "^3.5.4",
|
||||
"vue-template-compiler": "^2.7.8",
|
||||
"vue-router": "^3.6.5",
|
||||
"vue-template-compiler": "^2.7.10",
|
||||
"vuedraggable": "^2.24.3",
|
||||
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#153d339e4dbebb73733658aeda1d5b7fcc55b0a0",
|
||||
"webpack": "^4.46.0"
|
||||
|
||||
@@ -63,6 +63,11 @@
|
||||
width: 48px;
|
||||
height: 56px;
|
||||
}
|
||||
.achievement-boneToPick2x {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-boneToPick2x.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.achievement-boot2x {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-boot2x.png');
|
||||
width: 48px;
|
||||
@@ -509,6 +514,11 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.background_among_giant_mushrooms {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_among_giant_mushrooms.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_animal_clouds {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_animal_clouds.png');
|
||||
width: 141px;
|
||||
@@ -549,6 +559,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_autumn_bridge {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_autumn_bridge.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_autumn_flower_garden {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_autumn_flower_garden.png');
|
||||
width: 141px;
|
||||
@@ -675,6 +690,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_branches_of_a_holiday_tree {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_branches_of_a_holiday_tree.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_brick_wall_with_ivy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_brick_wall_with_ivy.png');
|
||||
width: 141px;
|
||||
@@ -715,6 +735,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_cemetery_gate {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_cemetery_gate.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_champions_colosseum {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_champions_colosseum.png');
|
||||
width: 141px;
|
||||
@@ -1289,6 +1314,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_inside_a_crystal {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_inside_a_crystal.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_inside_a_potion_bottle {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_inside_a_potion_bottle.png');
|
||||
width: 141px;
|
||||
@@ -1359,6 +1389,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mask_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_mask_makers_workshop.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_meandering_cave {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_meandering_cave.png');
|
||||
width: 141px;
|
||||
@@ -1404,6 +1439,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_misty_autumn_forest {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_misty_autumn_forest.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_monster_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_monster_makers_workshop.png');
|
||||
width: 141px;
|
||||
@@ -1684,6 +1724,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_snowy_village {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_snowy_village.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_south_pole {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_south_pole.png');
|
||||
width: 141px;
|
||||
@@ -1714,6 +1759,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spooky_ruins {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_spooky_ruins.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spooky_scarecrow_field {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_spooky_scarecrow_field.png');
|
||||
width: 141px;
|
||||
@@ -2080,6 +2130,11 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.icon_background_among_giant_mushrooms {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_among_giant_mushrooms.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_animal_clouds {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_animal_clouds.png');
|
||||
width: 68px;
|
||||
@@ -2120,6 +2175,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_autumn_bridge {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_autumn_bridge.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_autumn_flower_garden {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_autumn_flower_garden.png');
|
||||
width: 68px;
|
||||
@@ -2246,6 +2306,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_branches_of_a_holiday_tree {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_branches_of_a_holiday_tree.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_brick_wall_with_ivy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_brick_wall_with_ivy.png');
|
||||
width: 68px;
|
||||
@@ -2286,6 +2351,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_cemetery_gate {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_cemetery_gate.png');
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.icon_background_champions_colosseum {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_champions_colosseum.png');
|
||||
width: 68px;
|
||||
@@ -2865,6 +2935,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_inside_a_crystal {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_inside_a_crystal.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_inside_a_potion_bottle {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_inside_a_potion_bottle.png');
|
||||
width: 68px;
|
||||
@@ -2935,6 +3010,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_mask_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_mask_makers_workshop.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_meandering_cave {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_meandering_cave.png');
|
||||
width: 68px;
|
||||
@@ -2980,6 +3060,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_misty_autumn_forest {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_misty_autumn_forest.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_monster_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_monster_makers_workshop.png');
|
||||
width: 68px;
|
||||
@@ -3260,6 +3345,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_snowy_village {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_snowy_village.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_south_pole {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_south_pole.png');
|
||||
width: 68px;
|
||||
@@ -3290,6 +3380,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_spooky_ruins {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_spooky_ruins.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_spooky_scarecrow_field {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_spooky_scarecrow_field.png');
|
||||
width: 68px;
|
||||
@@ -18340,6 +18435,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_jewelersApron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_jewelersApron.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_lamplightersGreatcoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_lamplightersGreatcoat.png');
|
||||
width: 114px;
|
||||
@@ -18450,6 +18550,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_sheetGhostCostume {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_sheetGhostCostume.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_shepherdRobes {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_shepherdRobes.png');
|
||||
width: 90px;
|
||||
@@ -18550,6 +18655,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.eyewear_armoire_jewelersEyeLoupe {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_armoire_jewelersEyeLoupe.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.eyewear_armoire_plagueDoctorMask {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_armoire_plagueDoctorMask.png');
|
||||
width: 90px;
|
||||
@@ -19025,6 +19135,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_bubblingCauldron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_bubblingCauldron.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_chocolateFood {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_chocolateFood.png');
|
||||
width: 90px;
|
||||
@@ -19125,6 +19240,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_jewelersPliers {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_jewelersPliers.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_lifeBuoy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_lifeBuoy.png');
|
||||
width: 114px;
|
||||
@@ -19550,6 +19670,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_jewelersApron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_jewelersApron.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_lamplightersGreatcoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_lamplightersGreatcoat.png');
|
||||
width: 68px;
|
||||
@@ -19660,6 +19785,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_sheetGhostCostume {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_sheetGhostCostume.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_shepherdRobes {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_shepherdRobes.png');
|
||||
width: 68px;
|
||||
@@ -19775,6 +19905,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_eyewear_armoire_jewelersEyeLoupe {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_armoire_jewelersEyeLoupe.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_eyewear_armoire_plagueDoctorMask {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_armoire_plagueDoctorMask.png');
|
||||
width: 68px;
|
||||
@@ -20250,6 +20385,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_bubblingCauldron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_bubblingCauldron.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_chocolateFood {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_chocolateFood.png');
|
||||
width: 68px;
|
||||
@@ -20350,6 +20490,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_jewelersPliers {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_jewelersPliers.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_lifeBuoy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_lifeBuoy.png');
|
||||
width: 68px;
|
||||
@@ -20675,6 +20820,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_finelyCutGem {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_finelyCutGem.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_floridFan {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_floridFan.png');
|
||||
width: 68px;
|
||||
@@ -20790,6 +20940,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_magicSpatula {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_magicSpatula.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_magnifyingGlass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_magnifyingGlass.png');
|
||||
width: 68px;
|
||||
@@ -21225,6 +21380,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_jewelersApron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_jewelersApron.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_lamplightersGreatcoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_lamplightersGreatcoat.png');
|
||||
width: 114px;
|
||||
@@ -21335,6 +21495,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_sheetGhostCostume {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_sheetGhostCostume.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_shepherdRobes {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_shepherdRobes.png');
|
||||
width: 90px;
|
||||
@@ -21550,6 +21715,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_finelyCutGem {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_finelyCutGem.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_floridFan {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_floridFan.png');
|
||||
width: 114px;
|
||||
@@ -21665,6 +21835,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_magicSpatula {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_magicSpatula.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_magnifyingGlass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_magnifyingGlass.png');
|
||||
width: 114px;
|
||||
@@ -22875,6 +23050,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2022Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_fall2022Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2022Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2022Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2022Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fallHealer.png');
|
||||
width: 90px;
|
||||
@@ -23045,6 +23240,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2022Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_fall2022Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2022Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2022Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2022Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fallHealer.png');
|
||||
width: 90px;
|
||||
@@ -23170,6 +23385,21 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fall2022Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fall2022Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fall2022Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fallHealer.png');
|
||||
width: 90px;
|
||||
@@ -23325,6 +23555,26 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_fall2022Healer.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_special_fall2022Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_fall2022Mage.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_fall2022Rogue.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_fall2022Warrior.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_fallHealer.png');
|
||||
width: 68px;
|
||||
@@ -23495,6 +23745,26 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_fall2022Healer.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_special_fall2022Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_fall2022Mage.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_fall2022Rogue.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_fall2022Warrior.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_fallHealer.png');
|
||||
width: 68px;
|
||||
@@ -23620,6 +23890,21 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_fall2022Healer.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_fall2022Rogue.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_fall2022Warrior.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_fallHealer.png');
|
||||
width: 68px;
|
||||
@@ -23775,6 +24060,26 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_fall2022Healer.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_special_fall2022Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_fall2022Mage.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_fall2022Rogue.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_fall2022Warrior.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_fallHealer.png');
|
||||
width: 68px;
|
||||
@@ -23935,6 +24240,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2022Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_fall2022Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2022Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2022Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2022Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fallHealer.png');
|
||||
width: 90px;
|
||||
@@ -24095,6 +24420,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_fall2022Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2022Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_fall2022Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2022Mage.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_fall2022Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2022Rogue.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_fall2022Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2022Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_fallHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fallHealer.png');
|
||||
width: 90px;
|
||||
@@ -27090,6 +27435,101 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202210.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.head_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202210.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.shop_armor_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_mystery_202210.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202210.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_set_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202210.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.slim_armor_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202210.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.head_mystery_202211 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202211.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shop_head_mystery_202211 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202211.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_set_mystery_202211 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202211.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_mystery_202211 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_mystery_202211.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.weapon_mystery_202211 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202211.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202212.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.headAccessory_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_mystery_202212.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shop_armor_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_headAccessory_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_set_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.slim_armor_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202212.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202212.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_mystery_301404 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
|
||||
width: 90px;
|
||||
|
||||
@@ -180,8 +180,8 @@ input, textarea, input.form-control, textarea.form-control {
|
||||
}
|
||||
|
||||
// used in checkboxes and radios
|
||||
$bg-focused-active-control: #4f2993;
|
||||
$bg-disabled-control: #34303a;
|
||||
$bg-focused-active-control: $purple-200;
|
||||
$bg-disabled-control: $gray-10;
|
||||
|
||||
// custom control
|
||||
.custom-control {
|
||||
@@ -231,17 +231,21 @@ $bg-disabled-control: #34303a;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
&:focus:not(:checked):not(:disabled)~.custom-control-label::before, &:active:not(:checked):not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-focused-active-control, 0.1);
|
||||
&:focus:not(:checked):not(:disabled)~.custom-control-label::before,
|
||||
&:active:not(:checked):not(:disabled)~.custom-control-label::before {
|
||||
border: 2px solid $gray-300;
|
||||
box-shadow: 0 0 0 2px rgba(146, 92, 243, 0.5);
|
||||
}
|
||||
|
||||
&:focus:checked:not(:disabled)~.custom-control-label::before, &:active:checked:not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-focused-active-control, 0.1);
|
||||
border-color: $purple-400;
|
||||
&:focus:checked:not(:disabled)~.custom-control-label::before,
|
||||
&:active:checked:not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 2px rgba(146, 92, 243, 0.5);
|
||||
border-color: 2 px solid $purple-400;
|
||||
background-color: $purple-400;
|
||||
}
|
||||
|
||||
&:focus:disabled~.custom-control-label::before, &:active:disabled~.custom-control-label::before {
|
||||
&:focus:disabled~.custom-control-label::before,
|
||||
&:active:disabled~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-disabled-control, 0.1);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="10" viewBox="0 0 13 10">
|
||||
<path fill-rule="evenodd" d="M4.662 9.832c-.312 0-.61-.123-.831-.344L0 5.657l1.662-1.662 2.934 2.934L10.534 0l1.785 1.529-6.764 7.893a1.182 1.182 0 0 1-.848.409l-.045.001"/>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
|
||||
<path d="M6.54,13c-.3,0-.59-.13-.81-.35l-3.73-3.9,1.62-1.69,2.86,2.98L12.26,3l1.74,1.56L7.41,12.58c-.21,.25-.51,.4-.83,.42-.01,0-.03,0-.04,0Z" fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 236 B |
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="16" viewBox="0 0 8 16">
|
||||
<path fill-rule="evenodd" d="M7.145 8.006H4.903V16H1.58V8.006H0V5.182h1.58V3.354C1.58 2.045 2.202 0 4.933 0l2.461.01v2.742H5.608c-.291 0-.705.145-.705.77v1.66h2.533l-.291 2.824z"/>
|
||||
<svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M20,0H4C1.79,0,0,1.79,0,4V20c0,2.21,1.79,4,4,4H20c2.21,0,4-1.79,4-4V4c0-2.21-1.79-4-4-4Zm-3.72,6.66h-1.26c-1.24,0-1.63,.77-1.63,1.56v1.88h2.78l-.44,2.9h-2.33v7h-3.13v-7h-2.54v-2.9h2.54v-2.21c0-2.51,1.5-3.9,3.78-3.9,1.1,0,2.24,.2,2.24,.2v2.47Z" fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 354 B |
@@ -0,0 +1,10 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#DE3F3F" d="M0 5.667 3.333 1h9.334L16 5.667l-8 8.666z"/>
|
||||
<path fill="#FFF" opacity=".25" d="M4.667 5.533 4 2.333h4zM11.333 5.533l.667-3.2H8z"/>
|
||||
<path fill="#FFF" opacity=".5" d="M4.667 5.533 8 2.333l3.333 3.2zM1.733 5.533 4 2.333l.667 3.2z"/>
|
||||
<path fill="#34313A" opacity=".11" d="M14.267 5.533 12 2.333l-.667 3.2zM1.733 5.533h2.934L8 12.4z"/>
|
||||
<path fill="#FFF" opacity=".5" d="M14.267 5.533h-2.934L8 12.4z"/>
|
||||
<path fill="#FFF" opacity=".25" d="M4.667 5.533h6.666L8 12.4z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 675 B |
@@ -0,0 +1,10 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path d="M3 12.606v1.778c0 .208.093.408.262.53 1.842 1.347 6.923 1.347 8.766 0a.655.655 0 0 0 .26-.53v-1.778c0-1.621-.831-3.177-2.091-4.104a.666.666 0 0 1 0-1.08c1.26-.927 2.092-2.483 2.092-4.105V1.54a.652.652 0 0 0-.261-.53c-1.843-1.346-6.924-1.346-8.766 0A.65.65 0 0 0 3 1.54v1.777c0 1.622.832 3.178 2.092 4.105.368.27.368.81 0 1.08C3.832 9.429 3 10.985 3 12.606" fill="#F19595"/>
|
||||
<path d="M7.644 1.327c1.51 0 2.684.274 3.318.587v1.403c0 1.169-.594 2.332-1.551 3.036a2.006 2.006 0 0 0-.818 1.609c0 .63.305 1.232.817 1.608.958.705 1.552 1.868 1.552 3.036v1.404c-.634.313-1.809.587-3.318.587-1.508 0-2.683-.274-3.317-.587v-1.404c0-1.168.594-2.331 1.551-3.035.513-.377.817-.978.817-1.609 0-.63-.304-1.232-.816-1.609-.958-.704-1.552-1.867-1.552-3.036V1.914c.634-.313 1.809-.587 3.317-.587" fill-opacity=".9" fill="#FFF"/>
|
||||
<path d="M7.797 2.324c-1.132 0-2.331.105-2.343.385-.01.226-.005.664.914 1.13.893.453 1.06 1.282 1.546 1.282.564 0 .596-.477 1.284-.95.71-.488.823-1.148.815-1.408-.011-.363-1.084-.439-2.216-.439" fill="#DE3F3F"/>
|
||||
<path d="M9.198 4.17c.71-.487.823-1.146.815-1.407-.009-.288-.684-.395-1.526-.427.236.12.543.377.467.88-.078.525-.904 1.105-.77 1.568.025.09.069.162.124.221.247-.17.408-.502.89-.835" fill="#B01515"/>
|
||||
<path d="M7.644 9.17c-.344 0-.433.628-.933 1.018-.613.478-1.196 1.067-1.356 1.914-.131.698-.012.785.148.834.16.049 1.386.257 2.588 0 1.203-.258 1.87-.737 1.755-1.227-.111-.466-.448-.865-1.068-1.325-.593-.44-.79-1.214-1.134-1.214" fill="#DE3F3F"/>
|
||||
<path d="M5.503 12.936c.16.05 1.386.257 2.588 0 .956-.205 1.574-.55 1.729-.929a.096.096 0 0 0-.005-.023c-.067-.256-1.073-.41-2.325-.207-1.192.192-2.158.586-2.153 1.03.037.08.097.108.166.129" fill="#B01515"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M8 0c2.173 0 2.445.01 3.298.048.852.04 1.433.174 1.942.372.526.205.973.478 1.418.922.444.445.717.892.922 1.418.198.509.333 1.09.372 1.942C15.99 5.555 16 5.827 16 8s-.01 2.445-.048 3.298c-.04.852-.174 1.433-.372 1.942a3.924 3.924 0 0 1-.922 1.418 3.924 3.924 0 0 1-1.418.922c-.509.198-1.09.333-1.942.372-.853.04-1.125.048-3.298.048s-2.445-.009-3.298-.048c-.852-.04-1.433-.174-1.942-.372a3.924 3.924 0 0 1-1.418-.922A3.924 3.924 0 0 1 .42 13.24c-.198-.509-.333-1.09-.372-1.942C.01 10.445 0 10.173 0 8s.01-2.445.048-3.298C.088 3.85.222 3.269.42 2.76c.205-.526.478-.973.922-1.418A3.924 3.924 0 0 1 2.76.42C3.269.222 3.85.087 4.702.048 5.555.01 5.827 0 8 0zm0 3.892a4.108 4.108 0 1 0 0 8.216 4.108 4.108 0 0 0 0-8.216zm5.23-.162a.96.96 0 1 0-1.92 0 .96.96 0 0 0 1.92 0zM8 10.667a2.666 2.666 0 1 1 0-5.333 2.666 2.666 0 0 1 0 5.333z"/>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M14.67,12A2.67,2.67,0,1,1,12,9.33,2.67,2.67,0,0,1,14.67,12Zm3.89,0c0,1.16.1,3.66-.32,4.71a2.7,2.7,0,0,1-1.52,1.52c-1.06.42-3.55.33-4.72.33s-3.66.09-4.71-.33a2.65,2.65,0,0,1-1.52-1.52c-.42-1.05-.33-3.55-.33-4.71s-.09-3.67.33-4.72A2.65,2.65,0,0,1,7.29,5.76c1-.42,3.55-.32,4.71-.32a18,18,0,0,1,4.72.32,2.7,2.7,0,0,1,1.52,1.52C18.66,8.34,18.56,10.83,18.56,12ZM16.1,12A4.1,4.1,0,1,0,12,16.1,4.09,4.09,0,0,0,16.1,12Zm1.13-4.27a1,1,0,1,0-1,1A1,1,0,0,0,17.23,7.73ZM24,4V20a4,4,0,0,1-4,4H4a4,4,0,0,1-4-4V4A4,4,0,0,1,4,0H20A4,4,0,0,1,24,4ZM19.94,8.7a4.71,4.71,0,0,0-1.29-3.35A4.71,4.71,0,0,0,15.3,4.06C14,4,10,4,8.7,4.06A4.76,4.76,0,0,0,5.35,5.34,4.75,4.75,0,0,0,4.06,8.7C4,10,4,14,4.06,15.3a4.73,4.73,0,0,0,1.29,3.35A4.77,4.77,0,0,0,8.7,19.94c1.32.08,5.28.08,6.6,0a4.71,4.71,0,0,0,3.35-1.29,4.73,4.73,0,0,0,1.29-3.35C20,14,20,10,19.94,8.7Z" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 954 B After Width: | Height: | Size: 914 B |
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M20,0H4A4,4,0,0,0,0,4V20a4,4,0,0,0,4,4H20a4,4,0,0,0,4-4V4A4,4,0,0,0,20,0ZM16.68,19a4.47,4.47,0,0,1-3,1C9.86,20,9,17.22,9,15.61v-4.5H7.56a.31.31,0,0,1-.31-.32V8.67a.52.52,0,0,1,.35-.5,4,4,0,0,0,2.63-3.66c0-.34.21-.51.51-.51H13a.31.31,0,0,1,.32.31v3.6h2.59a.31.31,0,0,1,.31.31v2.55a.31.31,0,0,1-.31.32H13.25v4.16c0,1.07.74,1.67,2.13,1.12a.67.67,0,0,1,.4-.07.36.36,0,0,1,.23.25l.68,2C16.75,18.71,16.8,18.89,16.68,19Z" fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 516 B |
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="13" viewBox="0 0 16 13">
|
||||
<path fill-rule="evenodd" d="M14.362 3.238c.007.141.01.281.01.424 0 4.338-3.302 9.34-9.34 9.34A9.284 9.284 0 0 1 0 11.527c.257.029.518.045.783.045a6.576 6.576 0 0 0 4.076-1.404 3.288 3.288 0 0 1-3.065-2.28 3.312 3.312 0 0 0 1.481-.056A3.288 3.288 0 0 1 .642 4.613v-.041c.444.246.949.393 1.488.41A3.28 3.28 0 0 1 .67 2.25c0-.602.162-1.166.444-1.651a9.315 9.315 0 0 0 6.766 3.43A3.28 3.28 0 0 1 11.078 0c.943 0 1.797.398 2.395 1.035a6.565 6.565 0 0 0 2.085-.797 3.289 3.289 0 0 1-1.443 1.816A6.543 6.543 0 0 0 16 1.539a6.665 6.665 0 0 1-1.638 1.699"/>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M20,0H4A4,4,0,0,0,0,4V20a4,4,0,0,0,4,4H20a4,4,0,0,0,4-4V4A4,4,0,0,0,20,0ZM18.36,8.74c0,.14,0,.29,0,.43A9.34,9.34,0,0,1,4,17a6.85,6.85,0,0,0,.79,0,6.57,6.57,0,0,0,4.07-1.4A3.29,3.29,0,0,1,5.8,13.39a4.1,4.1,0,0,0,.62,0,3.49,3.49,0,0,0,.86-.11,3.28,3.28,0,0,1-2.63-3.22v0a3.35,3.35,0,0,0,1.48.42A3.29,3.29,0,0,1,4.67,7.76,3.22,3.22,0,0,1,5.12,6.1a9.3,9.3,0,0,0,6.76,3.43,3.67,3.67,0,0,1-.08-.75,3.28,3.28,0,0,1,5.67-2.24,6.54,6.54,0,0,0,2.08-.79,3.22,3.22,0,0,1-1.44,1.8A6.67,6.67,0,0,0,20,7.05,7.31,7.31,0,0,1,18.36,8.74Z" fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 645 B After Width: | Height: | Size: 622 B |
@@ -22,11 +22,6 @@
|
||||
Account created:
|
||||
<strong>{{ hero.auth.timestamps.created | formatDate }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Most recent cron:
|
||||
<strong>{{ hero.auth.timestamps.loggedin | formatDate }}</strong>
|
||||
("auth.timestamps.loggedin")
|
||||
</div>
|
||||
<div v-if="cronError">
|
||||
"lastCron" value:
|
||||
<strong>{{ hero.lastCron | formatDate }}</strong>
|
||||
@@ -36,6 +31,19 @@
|
||||
("auth.timestamps.loggedin" and "lastCron" dates are different).
|
||||
</span>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<div>
|
||||
Most recent cron:
|
||||
<strong>{{ hero.auth.timestamps.loggedin | formatDate }}</strong>
|
||||
("auth.timestamps.loggedin")
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-primary ml-2"
|
||||
@click="resetCron()"
|
||||
>
|
||||
Reset Cron to Yesterday
|
||||
</button>
|
||||
</div>
|
||||
<div class="subsection-start">
|
||||
Time zone:
|
||||
<strong>{{ hero.preferences.timezoneOffset | formatTimeZone }}</strong>
|
||||
@@ -218,6 +226,10 @@ export default {
|
||||
await this.saveHero({ hero: this.hero, msg: 'API Token' });
|
||||
this.tokenModified = true;
|
||||
},
|
||||
resetCron () {
|
||||
this.hero.resetCron = true;
|
||||
this.saveHero({ hero: this.hero, msg: 'Last Cron', clearData: true });
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
:reset-counter="resetCounter"
|
||||
/>
|
||||
|
||||
<subscription-and-perks
|
||||
:hero="hero"
|
||||
/>
|
||||
|
||||
<cron-and-auth
|
||||
:hero="hero"
|
||||
:reset-counter="resetCounter"
|
||||
@@ -45,6 +49,7 @@
|
||||
|
||||
<transactions
|
||||
:hero="hero"
|
||||
:reset-counter="resetCounter"
|
||||
/>
|
||||
|
||||
<contributor-details
|
||||
@@ -97,6 +102,7 @@ import AvatarAndDrops from './avatarAndDrops';
|
||||
import PrivilegesAndGems from './privilegesAndGems';
|
||||
import ContributorDetails from './contributorDetails';
|
||||
import Transactions from './transactions';
|
||||
import SubscriptionAndPerks from './subscriptionAndPerks';
|
||||
|
||||
import { userStateMixin } from '../../../mixins/userState';
|
||||
|
||||
@@ -110,6 +116,7 @@ export default {
|
||||
PrivilegesAndGems,
|
||||
ContributorDetails,
|
||||
Transactions,
|
||||
SubscriptionAndPerks,
|
||||
},
|
||||
mixins: [userStateMixin],
|
||||
data () {
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
<template>
|
||||
<div class="accordion-group">
|
||||
<h3
|
||||
class="expand-toggle"
|
||||
:class="{'open': expand}"
|
||||
@click="expand = !expand"
|
||||
>
|
||||
Subscription, Monthly Perks
|
||||
</h3>
|
||||
<div v-if="expand">
|
||||
<form @submit.prevent="saveHero({ hero, msg: 'Subscription Perks' })">
|
||||
<div v-if="hero.purchased.plan.paymentMethod">
|
||||
Payment method:
|
||||
<strong>{{ hero.purchased.plan.paymentMethod }}</strong>
|
||||
</div>
|
||||
<div v-if="hero.purchased.plan.planId">
|
||||
Payment schedule ("basic-earned" is monthly):
|
||||
<strong>{{ hero.purchased.plan.planId }}</strong>
|
||||
</div>
|
||||
<div v-if="hero.purchased.plan.dateCreated">
|
||||
Creation date:
|
||||
<strong>{{ dateFormat(hero.purchased.plan.dateCreated) }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Termination date:
|
||||
<strong
|
||||
v-if="hero.purchased.plan.dateTerminated"
|
||||
>
|
||||
{{ dateFormat(hero.purchased.plan.dateTerminated) }}
|
||||
</strong>
|
||||
<strong v-else> None </strong>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<label>
|
||||
Consecutive months:
|
||||
<input
|
||||
v-model="hero.purchased.plan.consecutive.count"
|
||||
class="form-control"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
Months until renewal:
|
||||
<strong>{{ hero.purchased.plan.consecutive.offset }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Next Mystic Hourglass:
|
||||
<strong>{{ nextHourglassDate }}</strong>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<label>
|
||||
Mystic Hourglasses:
|
||||
<input
|
||||
v-model="hero.purchased.plan.consecutive.trinkets"
|
||||
class="form-control"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
Gem cap:
|
||||
<strong>{{ hero.purchased.plan.consecutive.gemCapExtra + 25 }}</strong>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<label>
|
||||
Gems bought this month:
|
||||
<input
|
||||
v-model="hero.purchased.plan.gemsBought"
|
||||
class="form-control"
|
||||
type="number"
|
||||
min="0"
|
||||
:max="hero.purchased.plan.consecutive.gemCapExtra + 25"
|
||||
step="1"
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div
|
||||
v-if="hero.purchased.plan.extraMonths > 0"
|
||||
>
|
||||
Additional credit (applied upon cancellation):
|
||||
<strong>{{ hero.purchased.plan.extraMonths }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Mystery Items:
|
||||
<span
|
||||
v-if="hero.purchased.plan.mysteryItems.length > 0"
|
||||
>
|
||||
<span
|
||||
v-for="(item, index) in hero.purchased.plan.mysteryItems"
|
||||
:key="index"
|
||||
>
|
||||
<strong v-if="index < hero.purchased.plan.mysteryItems.length - 1">
|
||||
{{ item }},
|
||||
</strong>
|
||||
<strong v-else> {{ item }} </strong>
|
||||
</span>
|
||||
</span>
|
||||
<span v-else>
|
||||
<strong>None</strong>
|
||||
</span>
|
||||
</div>
|
||||
<input
|
||||
type="submit"
|
||||
value="Save"
|
||||
class="btn btn-primary mt-1"
|
||||
>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import saveHero from '../mixins/saveHero';
|
||||
import { getPlanContext } from '@/../../common/script/cron';
|
||||
|
||||
export default {
|
||||
mixins: [saveHero],
|
||||
props: {
|
||||
hero: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
expand: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
nextHourglassDate () {
|
||||
const currentPlanContext = getPlanContext(this.hero, new Date());
|
||||
|
||||
return currentPlanContext.nextHourglassDate.format('MMMM');
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
'hero.purchased.plan.consecutive.count' () { // eslint-disable-line object-shorthand
|
||||
this.hero.purchased.plan.consecutive.gemCapExtra = Math.min(
|
||||
Math.floor(this.hero.purchased.plan.consecutive.count / 3) * 5, 25,
|
||||
);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
dateFormat (date) {
|
||||
return moment(date).format('YYYY/MM/DD');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -30,6 +30,10 @@ export default {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
resetCounter: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
@@ -38,6 +42,14 @@ export default {
|
||||
hourglassTransactions: [],
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
resetCounter () {
|
||||
if (this.expand) {
|
||||
this.expand = !this.expand;
|
||||
this.toggleTransactionsOpen();
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async toggleTransactionsOpen () {
|
||||
this.expand = !this.expand;
|
||||
|
||||
@@ -1,21 +1,5 @@
|
||||
<template>
|
||||
<div class="form">
|
||||
<div class="form-group row text-center">
|
||||
<div class="col-12">
|
||||
<div
|
||||
class="btn btn-secondary social-button"
|
||||
@click="socialAuth('facebook')"
|
||||
>
|
||||
<div
|
||||
class="svg-icon social-icon"
|
||||
v-html="icons.facebookIcon"
|
||||
></div>
|
||||
<span>{{ registering
|
||||
? $t('signUpWithSocial', {social: 'Facebook'})
|
||||
: $t('loginWithSocial', {social: 'Facebook'}) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row text-center">
|
||||
<div class="col-12">
|
||||
<div
|
||||
@@ -243,7 +227,6 @@ import debounce from 'lodash/debounce';
|
||||
import isEmail from 'validator/lib/isEmail';
|
||||
import { setUpAxios, buildAppleAuthUrl } from '@/libs/auth';
|
||||
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
|
||||
import facebookSquareIcon from '@/assets/svg/facebook-square.svg';
|
||||
import googleIcon from '@/assets/svg/google.svg';
|
||||
import appleIcon from '@/assets/svg/apple_black.svg';
|
||||
|
||||
@@ -260,7 +243,6 @@ export default {
|
||||
};
|
||||
|
||||
data.icons = Object.freeze({
|
||||
facebookIcon: facebookSquareIcon,
|
||||
googleIcon,
|
||||
appleIcon,
|
||||
});
|
||||
@@ -308,8 +290,6 @@ export default {
|
||||
},
|
||||
mounted () {
|
||||
hello.init({
|
||||
facebook: process.env.FACEBOOK_KEY, // eslint-disable-line
|
||||
// windows: WINDOWS_CLIENT_ID,
|
||||
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line
|
||||
});
|
||||
},
|
||||
|
||||
@@ -621,7 +621,6 @@ import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
|
||||
import exclamation from '@/assets/svg/exclamation.svg';
|
||||
import gryphon from '@/assets/svg/gryphon.svg';
|
||||
import habiticaIcon from '@/assets/svg/habitica-logo.svg';
|
||||
import facebookSquareIcon from '@/assets/svg/facebook-square.svg';
|
||||
import googleIcon from '@/assets/svg/google.svg';
|
||||
import appleIcon from '@/assets/svg/apple_black.svg';
|
||||
|
||||
@@ -644,7 +643,6 @@ export default {
|
||||
exclamation,
|
||||
gryphon,
|
||||
habiticaIcon,
|
||||
facebookIcon: facebookSquareIcon,
|
||||
googleIcon,
|
||||
appleIcon,
|
||||
});
|
||||
@@ -734,8 +732,6 @@ export default {
|
||||
},
|
||||
mounted () {
|
||||
hello.init({
|
||||
facebook: process.env.FACEBOOK_KEY, // eslint-disable-line
|
||||
// windows: WINDOWS_CLIENT_ID,
|
||||
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line
|
||||
});
|
||||
},
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<customize-options
|
||||
:items="set.options"
|
||||
:current-value="user.preferences.hair.color"
|
||||
:full-set="!hideSet(set) && !userOwnsSet('hair', set.keys, 'color')"
|
||||
:full-set="!hideSet(set.key) && !userOwnsSet('hair', set.keys, 'color')"
|
||||
@unlock="unlock(`hair.color.${set.keys.join(',hair.color.')}`)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<customize-options
|
||||
:items="set.options"
|
||||
:current-value="user.preferences.skin"
|
||||
:full-set="!hideSet(set) && !userOwnsSet('skin', set.keys)"
|
||||
:full-set="!hideSet(set.key) && !userOwnsSet('skin', set.keys)"
|
||||
@unlock="unlock(`skin.${set.keys.join(',skin.')}`)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -280,6 +280,7 @@ import markdownDirective from '@/directives/markdown';
|
||||
import { userStateMixin } from '../../mixins/userState';
|
||||
|
||||
import { TAVERN_ID, MIN_SHORTNAME_SIZE_FOR_CHALLENGES, MAX_SUMMARY_SIZE_FOR_CHALLENGES } from '@/../../common/script/constants';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
export default {
|
||||
directives: {
|
||||
@@ -288,64 +289,7 @@ export default {
|
||||
mixins: [userStateMixin],
|
||||
props: ['groupId'],
|
||||
data () {
|
||||
const categoryOptions = [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'self_improvement',
|
||||
key: 'self_improvement',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
];
|
||||
const categoryOptions = CategoryOptions;
|
||||
const hashedCategories = {};
|
||||
categoryOptions.forEach(category => {
|
||||
hashedCategories[category.key] = category.label;
|
||||
|
||||
@@ -89,70 +89,14 @@
|
||||
import throttle from 'lodash/throttle';
|
||||
import FilterSidebar from '@/components/ui/filterSidebar';
|
||||
import FilterGroup from '@/components/ui/filterGroup';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
export default {
|
||||
components: { FilterGroup, FilterSidebar },
|
||||
data () {
|
||||
return {
|
||||
categoryFilters: [],
|
||||
categoryOptions: [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'self_improvement',
|
||||
key: 'self_improvement',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
],
|
||||
categoryOptions: CategoryOptions,
|
||||
membershipFilters: [],
|
||||
membershipOptions: [
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<!-- THIS IS A VERY OLD FILE DO NOT USE -->
|
||||
<template>
|
||||
<div class="create-group-modal-pages">
|
||||
<div
|
||||
|
||||
@@ -0,0 +1,356 @@
|
||||
<template>
|
||||
<b-modal
|
||||
id="create-group"
|
||||
:title="activePage === PAGES.CREATE_GROUP ? 'Create your Group' : 'Select Payment'"
|
||||
:hide-footer="true"
|
||||
:hide-header="true"
|
||||
size="md"
|
||||
@hide="onHide()"
|
||||
>
|
||||
<div
|
||||
v-if="activePage === PAGES.CREATE_GROUP"
|
||||
class="col-12"
|
||||
>
|
||||
<!-- HEADER -->
|
||||
<div
|
||||
class="modal-close"
|
||||
>
|
||||
<span
|
||||
class="cancel-text"
|
||||
@click="close()"
|
||||
>
|
||||
{{ $t('cancel') }}
|
||||
</span>
|
||||
<button
|
||||
class="btn btn-primary next-button"
|
||||
:value="$t('next')"
|
||||
:disabled="!newGroupIsReady"
|
||||
@click="createGroup()"
|
||||
>
|
||||
{{ $t('next') }}
|
||||
</button>
|
||||
</div>
|
||||
<h2>{{ $t('createGroup') }}</h2>
|
||||
|
||||
<!-- FORM -->
|
||||
<div class="form-group">
|
||||
<lockable-label
|
||||
:text="$t('nameStar')"
|
||||
/>
|
||||
<input
|
||||
id="new-group-name"
|
||||
v-model="newGroup.name"
|
||||
class="form-control input-medium option-content name-input"
|
||||
required="required"
|
||||
type="text"
|
||||
:placeholder="$t('nameStarText')"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<lockable-label
|
||||
for="new-group-description"
|
||||
:text="$t('descriptionOptional')"
|
||||
class="description-label"
|
||||
/>
|
||||
<div class="characters-remaining">
|
||||
{{ $t('charactersRemaining', {characters: charactersRemaining}) }}
|
||||
</div>
|
||||
<textarea
|
||||
id="new-group-description"
|
||||
v-model="newGroup.description"
|
||||
class="form-control option-content description-input"
|
||||
cols="3"
|
||||
:placeholder="$t('descriptionOptionalText')"
|
||||
maxlength="250"
|
||||
></textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input
|
||||
id="create-group-leaderOnlyChallenges-checkbox"
|
||||
v-model="newGroup.leaderOnly.challenges"
|
||||
class="custom-control-input"
|
||||
type="checkbox"
|
||||
>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
for="create-group-leaderOnlyChallenges-checkbox"
|
||||
>{{ $t('leaderOnlyChallenges') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<lockable-label
|
||||
:text="$t('groupUse')"
|
||||
/>
|
||||
<select-translated-array
|
||||
:items="[
|
||||
'groupParentChildren',
|
||||
'groupCouple',
|
||||
'groupFriends',
|
||||
'groupCoworkers',
|
||||
'groupManager',
|
||||
'groupTeacher'
|
||||
]"
|
||||
class="group-input"
|
||||
:placeholder="'groupUseDefault'"
|
||||
:value="newGroup.demographics"
|
||||
@select="newGroup.demographics = $event"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button
|
||||
class="btn btn-primary btn-lg btn-block btn-payment"
|
||||
:disabled="!newGroupIsReady"
|
||||
@click="createGroup()"
|
||||
>
|
||||
{{ $t('nextPaymentMethod') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- PAYMENT -->
|
||||
<!-- @TODO: Separate payment into a separate modal -->
|
||||
<div
|
||||
v-if="activePage === PAGES.PAY"
|
||||
class="col-12 payments"
|
||||
>
|
||||
<div class="text-center">
|
||||
<payments-buttons
|
||||
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
|
||||
:amazon-data="pay(PAYMENTS.AMAZON)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
h2 {
|
||||
color: $purple-300;
|
||||
font-size: 1.25rem;
|
||||
height: 28px;
|
||||
width: 120px;
|
||||
margin-top: 24px;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.cancel-text {
|
||||
color: $blue-10;
|
||||
font-size: 0.875rem;
|
||||
margin-right: 16px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.next-button {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.form-control::placeholder {
|
||||
color: $gray-50;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.description-label {
|
||||
margin-bottom: -24px;
|
||||
}
|
||||
|
||||
.name-input, .description-input, .group-input {
|
||||
margin-top: -4px;
|
||||
}
|
||||
|
||||
.characters-remaining {
|
||||
color: $gray-100;
|
||||
font-size: 0.75rem;
|
||||
line-height: 1.33;
|
||||
text-align: right;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.description-input {
|
||||
height: 56px;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
margin-bottom: 16px !important;
|
||||
}
|
||||
|
||||
.btn-payment {
|
||||
margin: 24px 112px 24px 112px;
|
||||
width: 177px;
|
||||
}
|
||||
|
||||
.payments {
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
.payment-options {
|
||||
margin-bottom: 4em;
|
||||
|
||||
.purple-box {
|
||||
background-color: #4f2a93;
|
||||
color: #fff;
|
||||
padding: .5em;
|
||||
border-radius: 8px;
|
||||
width: 200px;
|
||||
height: 215px;
|
||||
|
||||
.dollar {
|
||||
}
|
||||
|
||||
.number {
|
||||
font-size: 60px;
|
||||
}
|
||||
|
||||
.name {
|
||||
width: 100px;
|
||||
margin-left: .3em;
|
||||
}
|
||||
|
||||
div {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
.box, .purple-box {
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
<style lang="scss">
|
||||
@import '~@/assets/scss/mixins.scss';
|
||||
#create-group {
|
||||
.modal-dialog {
|
||||
max-width: 448px;
|
||||
}
|
||||
.modal-content {
|
||||
width: 448px;
|
||||
max-height: 436px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 14px 28px 0 rgba(26, 24, 29, 0.24), 0 10px 10px 0 rgba(26, 24, 29, 0.28);
|
||||
}
|
||||
.modal-body{
|
||||
padding: 0px;
|
||||
margin-left: 12px;
|
||||
margin-right: 12px;
|
||||
}
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
cursor: pointer;
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import paymentsMixin from '../../mixins/payments';
|
||||
import { mapState } from '@/libs/store';
|
||||
import paymentsButtons from '@/components/payments/buttons/list';
|
||||
import selectTranslatedArray from '@/components/tasks/modal-controls/selectTranslatedArray';
|
||||
import lockableLabel from '@/components/tasks/modal-controls/lockableLabel';
|
||||
import * as Analytics from '@/libs/analytics';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
paymentsButtons,
|
||||
selectTranslatedArray,
|
||||
lockableLabel,
|
||||
},
|
||||
mixins: [paymentsMixin],
|
||||
data () {
|
||||
return {
|
||||
amazonPayments: {},
|
||||
PAGES: {
|
||||
CREATE_GROUP: 'create-group',
|
||||
// UPGRADE_GROUP: 'upgrade-group',
|
||||
PAY: 'pay',
|
||||
},
|
||||
PAYMENTS: {
|
||||
AMAZON: 'amazon',
|
||||
STRIPE: 'stripe',
|
||||
},
|
||||
paymentMethod: '',
|
||||
newGroup: {
|
||||
type: 'guild',
|
||||
privacy: 'private',
|
||||
name: '',
|
||||
description: '',
|
||||
leaderOnly: {
|
||||
challenges: false,
|
||||
},
|
||||
demographics: null,
|
||||
user: '',
|
||||
},
|
||||
activePage: 'create-group',
|
||||
type: 'guild',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data' }),
|
||||
newGroupIsReady () {
|
||||
return Boolean(this.newGroup.name) && Boolean(this.newGroup.demographics);
|
||||
},
|
||||
charactersRemaining () {
|
||||
const currentLength = this.newGroup.description ? this.newGroup.description.length : 0;
|
||||
return 250 - currentLength;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
close () {
|
||||
this.$root.$emit('bv::hide::modal', 'create-group');
|
||||
},
|
||||
changePage (page) {
|
||||
this.activePage = page;
|
||||
},
|
||||
createGroup () {
|
||||
this.changePage(this.PAGES.PAY);
|
||||
},
|
||||
pay (paymentMethod) {
|
||||
const subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
|
||||
const demographicsKey = this.newGroup.demographics;
|
||||
const paymentData = {
|
||||
subscription: subscriptionKey,
|
||||
coupon: null,
|
||||
demographics: demographicsKey,
|
||||
};
|
||||
|
||||
Analytics.track({
|
||||
hitType: 'event',
|
||||
eventName: 'group plan create',
|
||||
eventAction: 'group plan create',
|
||||
eventCategory: 'behavior',
|
||||
demographics: this.newGroup.demographics,
|
||||
type: this.newGroup.type,
|
||||
}, { trackOnClient: true });
|
||||
|
||||
if (this.upgradingGroup && this.upgradingGroup._id) {
|
||||
paymentData.groupId = this.upgradingGroup._id;
|
||||
paymentData.group = this.upgradingGroup;
|
||||
} else {
|
||||
paymentData.groupToCreate = this.newGroup;
|
||||
}
|
||||
|
||||
this.paymentMethod = paymentMethod;
|
||||
|
||||
if (this.paymentMethod === this.PAYMENTS.AMAZON) {
|
||||
paymentData.type = 'subscription';
|
||||
return paymentData;
|
||||
}
|
||||
|
||||
if (this.paymentMethod === this.PAYMENTS.STRIPE) {
|
||||
this.redirectToStripe(paymentData);
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
onHide () {
|
||||
this.sendingInProgress = false;
|
||||
},
|
||||
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -45,7 +45,7 @@
|
||||
v-html="$t('dayStart', { startTime: groupStartTime } )"
|
||||
>
|
||||
</div>
|
||||
<div class="ml-2">
|
||||
<div class="create-task-area ml-2">
|
||||
<button
|
||||
id="create-task-btn"
|
||||
v-if="canCreateTasks"
|
||||
@@ -132,6 +132,14 @@
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.create-task-area {
|
||||
position: inherit;
|
||||
|
||||
.dropdown {
|
||||
right: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
.day-start {
|
||||
height: 2rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
|
||||
@@ -379,6 +379,7 @@ import informationIcon from '@/assets/svg/information.svg';
|
||||
|
||||
import { MAX_SUMMARY_SIZE_FOR_GUILDS } from '@/../../common/script/constants';
|
||||
import { userStateMixin } from '../../mixins/userState';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
// @TODO: Not sure the best way to pass party creating status
|
||||
// Since we need the modal in the header, passing props doesn't work
|
||||
@@ -410,64 +411,7 @@ export default {
|
||||
allowGuildInvitationsFromNonMembers: true,
|
||||
bannedWordsAllowed: null,
|
||||
},
|
||||
categoryOptions: [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'recovery_support_groups',
|
||||
key: 'recovery_support_groups',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
],
|
||||
categoryOptions: CategoryOptions,
|
||||
showCategorySelect: false,
|
||||
members: [],
|
||||
inviteMembers: false,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<!-- @TODO: Move to group plans folder-->
|
||||
<div>
|
||||
<group-plan-creation-modal />
|
||||
<div>
|
||||
<div class="header">
|
||||
<h1 class="text-center">
|
||||
@@ -51,6 +52,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Upgrading an existing group -->
|
||||
<div
|
||||
v-if="upgradingGroup._id"
|
||||
id="upgrading-group"
|
||||
@@ -92,7 +94,6 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="box payment-providers">
|
||||
<h3>Choose your payment method</h3>
|
||||
<payments-buttons
|
||||
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
|
||||
:amazon-data="pay(PAYMENTS.AMAZON)"
|
||||
@@ -101,154 +102,53 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Create a new group -->
|
||||
<div
|
||||
v-if="!upgradingGroup._id"
|
||||
class="container col-6 offset-3 create-option"
|
||||
>
|
||||
<div class="row">
|
||||
<h1 class="col-12 text-center purple-header">
|
||||
Create your Group today!
|
||||
Create Your Group Today!
|
||||
</h1>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 text-center">
|
||||
<button
|
||||
class="btn btn-primary create-group"
|
||||
@click="launchModal('create')"
|
||||
@click="launchModal('create-page')"
|
||||
>
|
||||
Create Your New Group
|
||||
Create Your New Group!
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row pricing">
|
||||
<div class="col-5">
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="number">
|
||||
9
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Group Owner</div>
|
||||
<div>Subscription</div>
|
||||
</div>
|
||||
<div class="row pricing justify-content-center align-items-center">
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="col-1">
|
||||
<div class="plus">
|
||||
+
|
||||
</div>
|
||||
<div class="number">
|
||||
9
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="number">
|
||||
3
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Each Additional</div>
|
||||
<div>Member</div>
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Group Owner</div>
|
||||
<div>Subscription</div>
|
||||
</div>
|
||||
<div class="plus">
|
||||
+
|
||||
</div>
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="number">
|
||||
3
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Each Additional</div>
|
||||
<div>Member</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<b-modal
|
||||
id="group-plan-modal"
|
||||
:title="activePage === PAGES.CREATE_GROUP ? 'Create your Group' : 'Select Payment'"
|
||||
size="md"
|
||||
hide-footer="hide-footer"
|
||||
>
|
||||
<div
|
||||
v-if="activePage === PAGES.CREATE_GROUP"
|
||||
class="col-12"
|
||||
>
|
||||
<div class="form-group">
|
||||
<label
|
||||
class="control-label"
|
||||
for="new-group-name"
|
||||
>Name</label>
|
||||
<input
|
||||
id="new-group-name"
|
||||
v-model="newGroup.name"
|
||||
class="form-control input-medium option-content"
|
||||
required="required"
|
||||
type="text"
|
||||
placeholder="Name"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="new-group-description">{{ $t('description') }}</label>
|
||||
<textarea
|
||||
id="new-group-description"
|
||||
v-model="newGroup.description"
|
||||
class="form-control option-content"
|
||||
cols="3"
|
||||
:placeholder="$t('description')"
|
||||
></textarea>
|
||||
</div>
|
||||
<div
|
||||
v-if="type === 'guild'"
|
||||
class="form-group"
|
||||
>
|
||||
<div class="custom-control custom-radio">
|
||||
<input
|
||||
v-model="newGroup.privacy"
|
||||
class="custom-control-input"
|
||||
type="radio"
|
||||
name="new-group-privacy"
|
||||
value="private"
|
||||
>
|
||||
<label class="custom-control-label">{{ $t('inviteOnly') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input
|
||||
id="create-group-leaderOnlyChallenges-checkbox"
|
||||
v-model="newGroup.leaderOnly.challenges"
|
||||
class="custom-control-input"
|
||||
type="checkbox"
|
||||
>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
for="create-group-leaderOnlyChallenges-checkbox"
|
||||
>{{ $t('leaderOnlyChallenges') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="type === 'party'"
|
||||
class="form-group"
|
||||
>
|
||||
<button
|
||||
class="btn btn-secondary form-control"
|
||||
:value="$t('create')"
|
||||
@click="createGroup()"
|
||||
></button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button
|
||||
class="btn btn-primary btn-lg btn-block"
|
||||
:disabled="!newGroupIsReady"
|
||||
@click="createGroup()"
|
||||
>
|
||||
{{ $t('create') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="activePage === PAGES.PAY"
|
||||
class="col-12"
|
||||
>
|
||||
<div class="text-center">
|
||||
<h3>Choose your payment method</h3>
|
||||
<payments-buttons
|
||||
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
|
||||
:amazon-data="pay(PAYMENTS.AMAZON)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -260,12 +160,17 @@
|
||||
|
||||
.dollar {
|
||||
position: absolute;
|
||||
left: -1em;
|
||||
top: 1em;
|
||||
left: -16px;
|
||||
top: 16px;
|
||||
}
|
||||
|
||||
.purple-box {
|
||||
color: #bda8ff;
|
||||
border-top-right-radius: 0px;
|
||||
border-bottom-right-radius: 0px;
|
||||
border-top-left-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
}
|
||||
|
||||
.number {
|
||||
@@ -279,6 +184,8 @@
|
||||
|
||||
.payment-providers {
|
||||
width: 350px;
|
||||
border-top-right-radius: 8px;
|
||||
border-bottom-right-radius: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,9 +193,9 @@
|
||||
background: #432874;
|
||||
background: linear-gradient(180deg, #4F2A93 0%, #432874 100%);
|
||||
color: #fff;
|
||||
padding: 2em;
|
||||
padding: 32px;
|
||||
height: 340px;
|
||||
margin-bottom: 2em;
|
||||
margin-bottom: 32px;
|
||||
margin-left: -12px;
|
||||
margin-right: -12px;
|
||||
|
||||
@@ -312,6 +219,7 @@
|
||||
|
||||
.box {
|
||||
height: 416px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
@@ -354,17 +262,19 @@
|
||||
button.create-group {
|
||||
width: 330px;
|
||||
height: 96px;
|
||||
border-radius: 8px;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.purple-header {
|
||||
color: #6133b4;
|
||||
font-size: 48px;
|
||||
margin-top: 1em;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.pricing {
|
||||
margin-top: 2em;
|
||||
margin-bottom: 4em;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 64px;
|
||||
|
||||
.dollar, .number, .name {
|
||||
display: inline-block;
|
||||
@@ -373,35 +283,41 @@
|
||||
}
|
||||
|
||||
.plus {
|
||||
font-size: 34px;
|
||||
font-size: 2.125rem;
|
||||
color: #a5a1ac;
|
||||
margin-left: 16px;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
.dollar {
|
||||
margin-bottom: 1.5em;
|
||||
font-size: 32px;
|
||||
margin-bottom: 24px;
|
||||
font-size: 2rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.name {
|
||||
font-size: 24px;
|
||||
margin-bottom: .8em;
|
||||
margin-left: .5em;
|
||||
font-size: 1.5rem;
|
||||
margin-left: 8px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.number {
|
||||
font-size: 72px;
|
||||
font-size: 4.5rem;
|
||||
font-weight: bolder;
|
||||
}
|
||||
}
|
||||
|
||||
.payment-options {
|
||||
margin-bottom: 4em;
|
||||
margin-bottom: 64px;
|
||||
|
||||
h4 {
|
||||
color: #34313a;
|
||||
}
|
||||
|
||||
.purple-box {
|
||||
background-color: #4f2a93;
|
||||
color: #fff;
|
||||
padding: .5em;
|
||||
padding: 8px;
|
||||
border-radius: 8px;
|
||||
width: 200px;
|
||||
height: 215px;
|
||||
@@ -415,7 +331,7 @@
|
||||
|
||||
.name {
|
||||
width: 100px;
|
||||
margin-left: .3em;
|
||||
margin-left: 4.8px;
|
||||
}
|
||||
|
||||
.plus {
|
||||
@@ -440,10 +356,12 @@ import paymentsMixin from '../../mixins/payments';
|
||||
import { mapState } from '@/libs/store';
|
||||
import positiveIcon from '@/assets/svg/positive.svg';
|
||||
import paymentsButtons from '@/components/payments/buttons/list';
|
||||
import groupPlanCreationModal from '../group-plans/groupPlanCreationModal';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
paymentsButtons,
|
||||
groupPlanCreationModal,
|
||||
},
|
||||
mixins: [paymentsMixin],
|
||||
data () {
|
||||
@@ -492,12 +410,7 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
launchModal () {
|
||||
this.changePage(this.PAGES.CREATE_GROUP);
|
||||
this.$root.$emit('bv::show::modal', 'group-plan-modal');
|
||||
},
|
||||
changePage (page) {
|
||||
this.activePage = page;
|
||||
window.scrollTo(0, 0);
|
||||
this.$root.$emit('bv::show::modal', 'create-group');
|
||||
},
|
||||
createGroup () {
|
||||
this.changePage(this.PAGES.PAY);
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
import throttle from 'lodash/throttle';
|
||||
import FilterSidebar from '@/components/ui/filterSidebar';
|
||||
import FilterGroup from '@/components/ui/filterGroup';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
// TODO use checkbox-component to add/remove entries to *Filters, but without the v-model binding
|
||||
|
||||
@@ -94,64 +95,7 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
categoryFilters: [],
|
||||
categoryOptions: [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'recovery_support_groups',
|
||||
key: 'recovery_support_groups',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
],
|
||||
categoryOptions: CategoryOptions,
|
||||
roleFilters: [],
|
||||
roleOptions: [
|
||||
{
|
||||
|
||||
@@ -267,7 +267,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-4">
|
||||
<sidebar-section :title="$t('staffAndModerators')">
|
||||
<sidebar-section :title="$t('staff')">
|
||||
<div class="row">
|
||||
<div
|
||||
v-for="user in staff"
|
||||
@@ -289,19 +289,6 @@
|
||||
class="svg-icon staff-icon"
|
||||
v-html="icons.tierStaff"
|
||||
></div>
|
||||
<div
|
||||
v-if="user.type === 'Moderator' && user.name !== 'It\'s Bailey'"
|
||||
class="svg-icon mod-icon"
|
||||
v-html="icons.tierMod"
|
||||
></div>
|
||||
<div
|
||||
v-if="user.name === 'It\'s Bailey'"
|
||||
class="svg-icon npc-icon"
|
||||
v-html="icons.tierNPC"
|
||||
></div>
|
||||
</div>
|
||||
<div class="type">
|
||||
{{ user.type }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -787,18 +787,15 @@ export default {
|
||||
if (sortBy === 'sortByColor') {
|
||||
groupKey = 'potionKey';
|
||||
} else if (sortBy === 'AZ') {
|
||||
groupKey = '';
|
||||
groupKey = i => i.eggName[0];
|
||||
} else if (sortBy === 'sortByHatchable') {
|
||||
groupKey = i => (i.isHatchable() ? 0 : 1);
|
||||
}
|
||||
const groupedPets = groupBy(pets, groupKey);
|
||||
|
||||
// Pets are rendered as grouped "rows". Count helps decide if show more button is necessary.
|
||||
if (sortBy === 'AZ') {
|
||||
this.petRowCount[animalGroup.key] = 1;
|
||||
} else {
|
||||
this.petRowCount[animalGroup.key] = Object.keys(groupedPets).length;
|
||||
}
|
||||
this.petRowCount[animalGroup.key] = Object.keys(groupedPets).length;
|
||||
|
||||
return groupedPets;
|
||||
},
|
||||
mounts (animalGroup, hideMissing, sortBy, searchText) {
|
||||
@@ -814,14 +811,12 @@ export default {
|
||||
if (sortBy === 'sortByColor') {
|
||||
groupKey = 'potionKey';
|
||||
} else if (sortBy === 'AZ') {
|
||||
groupKey = '';
|
||||
groupKey = i => i.eggName[0];
|
||||
}
|
||||
const groupedMounts = groupBy(mounts, groupKey);
|
||||
if (sortBy === 'AZ') {
|
||||
this.mountRowCount[animalGroup.key] = 1;
|
||||
} else {
|
||||
this.mountRowCount[animalGroup.key] = Object.keys(groupedMounts).length;
|
||||
}
|
||||
|
||||
this.mountRowCount[animalGroup.key] = Object.keys(groupedMounts).length;
|
||||
|
||||
return groupedMounts;
|
||||
},
|
||||
// Actions
|
||||
|
||||
@@ -241,6 +241,14 @@ const NOTIFICATIONS = {
|
||||
achievement: 'mountColorAchievs',
|
||||
},
|
||||
},
|
||||
ACHIEVEMENT_PET_SET_COMPLETE: {
|
||||
achievement: true,
|
||||
label: $t => `${$t('achievement')}: ${$t('achievementPetSetComplete')}`,
|
||||
modalId: 'generic-achievement',
|
||||
data: {
|
||||
achievement: 'petSetCompleteAchievs',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default {
|
||||
@@ -313,6 +321,7 @@ export default {
|
||||
'ACHIEVEMENT_ANIMAL_SET',
|
||||
'ACHIEVEMENT_PET_COLOR',
|
||||
'ACHIEVEMENT_MOUNT_COLOR',
|
||||
'ACHIEVEMENT_PET_SET_COMPLETE',
|
||||
].forEach(type => {
|
||||
handledNotifications[type] = true;
|
||||
});
|
||||
@@ -772,6 +781,15 @@ export default {
|
||||
Vue.set(this.user.achievements, achievement, true);
|
||||
break;
|
||||
}
|
||||
case 'ACHIEVEMENT_PET_SET_COMPLETE': {
|
||||
const { achievement } = notification.data;
|
||||
const upperCaseAchievement = achievement.charAt(0).toUpperCase() + achievement.slice(1);
|
||||
const achievementTitleKey = `achievement${upperCaseAchievement}`;
|
||||
NOTIFICATIONS.ACHIEVEMENT_PET_SET_COMPLETE.label = $t => `${$t('achievement')}: ${$t(achievementTitleKey)}`;
|
||||
this.showNotificationWithModal(notification);
|
||||
Vue.set(this.user.achievements, achievement, true);
|
||||
break;
|
||||
}
|
||||
case 'ACHIEVEMENT': { // generic achievement
|
||||
const { achievement } = notification.data;
|
||||
const upperCaseAchievement = achievement.charAt(0).toUpperCase() + achievement.slice(1);
|
||||
|
||||
@@ -196,7 +196,7 @@ export default {
|
||||
appState.group = pick(this.amazonPayments.groupToCreate, ['_id', 'memberCount', 'name']);
|
||||
} else {
|
||||
appState.newGroup = false;
|
||||
appState.group = pick(this.amazonPayments.group, ['_id', 'memberCount', 'name']);
|
||||
appState.group = pick(this.amazonPayments.group, ['_id', 'memberCount', 'name', 'type']);
|
||||
}
|
||||
} else if (paymentType && paymentType.indexOf('gift-') === 0) {
|
||||
appState.gift = this.amazonPayments.gift;
|
||||
|
||||
@@ -153,14 +153,6 @@
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row text-center">
|
||||
<h4
|
||||
v-once
|
||||
class="col-12 text-payment mb-3"
|
||||
>
|
||||
{{ $t('choosePaymentMethod') }}
|
||||
</h4>
|
||||
</div>
|
||||
<payments-buttons
|
||||
:disabled="!selectedGemsBlock"
|
||||
:stripe-fn="() => redirectToStripe({ gemsBlock: selectedGemsBlock })"
|
||||
@@ -169,6 +161,19 @@
|
||||
})"
|
||||
:amazon-data="{type: 'single', gemsBlock: selectedGemsBlock}"
|
||||
/>
|
||||
<div
|
||||
v-if="eventName === 'fall_extra_gems' || eventName === 'spooky_extra_gems'"
|
||||
class="d-flex flex-column justify-content-center"
|
||||
>
|
||||
<h4 class="mt-3 mx-auto"> {{ $t('howItWorks') }}</h4>
|
||||
<small class="text-center">
|
||||
{{ $t('gemSaleHow', { eventStartMonth, eventStartOrdinal, eventEndOrdinal }) }}
|
||||
</small>
|
||||
<h4 class="mt-3 mx-auto"> {{ $t('limitations') }}</h4>
|
||||
<small class="text-center">
|
||||
{{ $t('gemSaleLimitations', { eventStartMonth, eventStartOrdinal, eventEndOrdinal }) }}
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</div>
|
||||
@@ -178,6 +183,13 @@
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
#buy-gems {
|
||||
small {
|
||||
color: $gray-100;
|
||||
font-size: 12px;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.close-icon svg path {
|
||||
stroke: $purple-400;
|
||||
}
|
||||
@@ -347,8 +359,8 @@
|
||||
|
||||
.svg-icon.check {
|
||||
color: $purple-400;
|
||||
width: 0.77rem;
|
||||
height: 0.615rem;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.text-leadin {
|
||||
@@ -423,6 +435,15 @@ export default {
|
||||
}
|
||||
return '';
|
||||
},
|
||||
eventStartMonth () {
|
||||
return moment(this.currentEvent.start).format('MMMM');
|
||||
},
|
||||
eventStartOrdinal () {
|
||||
return moment(this.currentEvent.start).format('Do');
|
||||
},
|
||||
eventEndOrdinal () {
|
||||
return moment(this.currentEvent.end).format('Do');
|
||||
},
|
||||
isGemsPromoActive () {
|
||||
const currEvt = this.currentEvent;
|
||||
if (currEvt && currEvt.gemsPromo && moment().isBefore(currEvt.end)) {
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
v-show="selectedPage === 'subscription'"
|
||||
class="subscribe-option"
|
||||
:userReceivingGift="userReceivingGift"
|
||||
:receiverName="receiverName"
|
||||
/>
|
||||
|
||||
<!-- gem block -->
|
||||
@@ -648,6 +649,7 @@ export default {
|
||||
},
|
||||
},
|
||||
giftReceiver: this.receiverName,
|
||||
toUserId: this.userReceivingGift._id,
|
||||
});
|
||||
}, 500);
|
||||
},
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
<template>
|
||||
<b-modal
|
||||
id="payments-success-modal"
|
||||
:title="$t('accountSuspendedTitle')"
|
||||
:hide-footer="isFromBalance"
|
||||
:modal-class="isFromBalance ? ['modal-hidden-footer'] : []"
|
||||
:hide-footer="isNewGroup || isGems || isSubscription"
|
||||
:modal-class="isNewGroup || isGems || isSubscription
|
||||
? ['modal-hidden-footer'] : []"
|
||||
>
|
||||
<!-- HEADER -->
|
||||
<div slot="modal-header">
|
||||
<div
|
||||
class="modal-close"
|
||||
@click="close()"
|
||||
>
|
||||
<div
|
||||
class="icon-close"
|
||||
v-html="icons.close"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="check-container d-flex align-items-center justify-content-center">
|
||||
<div
|
||||
v-once
|
||||
@@ -13,19 +24,13 @@
|
||||
v-html="icons.check"
|
||||
></div>
|
||||
</div>
|
||||
<h2>{{ $t(isFromBalance ? 'success' : 'paymentSuccessful') }}</h2>
|
||||
</div>
|
||||
<div slot="modal-footer">
|
||||
<div
|
||||
v-once
|
||||
class="small-text"
|
||||
>
|
||||
{{ $t('giftSubscriptionText4') }}
|
||||
</div>
|
||||
<h2>{{ $t(isGemsBalance ? 'success' : 'paymentSuccessful') }}</h2>
|
||||
</div>
|
||||
<!-- BODY -->
|
||||
<div class="row">
|
||||
<div class="col-12 modal-body-col">
|
||||
<template v-if="paymentData.paymentType === 'gems'">
|
||||
<!-- buy gems for self -->
|
||||
<template v-if="isGems">
|
||||
<strong v-once>{{ $t('paymentYouReceived') }}</strong>
|
||||
<div class="details-block gems">
|
||||
<div
|
||||
@@ -36,9 +41,9 @@
|
||||
<span>{{ paymentData.gemsBlock.gems }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- buy gems to someone else OR send gems from balance-->
|
||||
<template
|
||||
v-if="paymentData.paymentType === 'gift-gems'
|
||||
|| paymentData.paymentType === 'gift-gems-balance'"
|
||||
v-if="isGiftGems || isGemsBalance"
|
||||
>
|
||||
<span v-html="$t('paymentYouSentGems', {name: paymentData.giftReceiver})"></span>
|
||||
<div class="details-block gems">
|
||||
@@ -50,13 +55,17 @@
|
||||
<span>{{ paymentData.gift.gems.amount }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- give gift subscription (non-recurring)-->
|
||||
<template v-if="paymentData.paymentType === 'gift-subscription'">
|
||||
<span
|
||||
v-html="$t('paymentYouSentSubscription', {
|
||||
name: paymentData.giftReceiver, months: paymentData.subscription.months})"
|
||||
></span>
|
||||
<div>
|
||||
<span
|
||||
v-html="$t('paymentYouSentSubscription', {
|
||||
name: paymentData.giftReceiver, months: paymentData.subscription.months})"
|
||||
></span>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="paymentData.paymentType === 'subscription'">
|
||||
<!-- buy self subscription (recurring) -->
|
||||
<template v-if="isSubscription">
|
||||
<strong v-once>{{ $t('nowSubscribed') }}</strong>
|
||||
<div class="details-block">
|
||||
<span
|
||||
@@ -65,48 +74,238 @@
|
||||
></span>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="paymentData.paymentType === 'groupPlan'">
|
||||
<!-- group plan new or upgraded -->
|
||||
<template v-if="isGroupPlan">
|
||||
<span
|
||||
v-html="$t(paymentData.newGroup
|
||||
v-html="$t(isNewGroup
|
||||
? 'groupPlanCreated' : 'groupPlanUpgraded', {groupName: paymentData.group.name})"
|
||||
></span>
|
||||
<div class="details-block">
|
||||
<span
|
||||
v-html="$t('paymentSubBilling', {
|
||||
amount: groupPlanCost, months: paymentData.subscription.months})"
|
||||
></span>
|
||||
<div
|
||||
v-if="isGroupPlan"
|
||||
class=""
|
||||
>
|
||||
<div class="details-block group-billing-date">
|
||||
<span
|
||||
v-html="$t('groupsPaymentSubBilling', { renewalDate })"
|
||||
>
|
||||
</span>
|
||||
</div>
|
||||
<div class="small-text group-auto-renew">
|
||||
<span
|
||||
v-once
|
||||
>{{ $t('groupsPaymentAutoRenew') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<!-- buy self subscription auto renew -->
|
||||
<template
|
||||
v-if="paymentData.paymentType === 'groupPlan'
|
||||
|| paymentData.paymentType === 'subscription'"
|
||||
v-if="isSubscription"
|
||||
>
|
||||
<span
|
||||
v-once
|
||||
class="small-text auto-renew"
|
||||
>{{ $t('paymentAutoRenew') }}</span>
|
||||
</template>
|
||||
<!-- buttons for subscriptions / new Group / buy Gems for self -->
|
||||
<button
|
||||
v-if="isNewGroup || isGems || isSubscription"
|
||||
v-once
|
||||
class="btn btn-primary"
|
||||
@click="close()"
|
||||
@click="submit()"
|
||||
>
|
||||
{{ $t('onwards') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- FOOTER -->
|
||||
<div slot="modal-footer">
|
||||
<!-- gift gems balance & buy, gift subscription -->
|
||||
<div
|
||||
v-if="isGemsBalance || isGiftGems || isGiftSubscription"
|
||||
class="message mx-auto"
|
||||
>
|
||||
<lockable-label
|
||||
:text="$t('sendGiftLabel')"
|
||||
class="mx-auto label-text"
|
||||
/>
|
||||
<textarea
|
||||
v-model="gift.message"
|
||||
class="form-control mx-auto"
|
||||
:placeholder="$t('sendGiftMessagePlaceholder')"
|
||||
></textarea>
|
||||
<button
|
||||
:disabled="!gift.message || sendingInProgress"
|
||||
class="btn btn-primary mx-auto"
|
||||
@click="sendMessage()"
|
||||
>
|
||||
{{ $t('sendMessage') }}
|
||||
</button>
|
||||
</div>
|
||||
<!-- upgradedGroup -->
|
||||
<div
|
||||
v-else-if="isUpgradedGroup"
|
||||
class="demographics d-flex flex-column justify-content-center"
|
||||
>
|
||||
<lockable-label
|
||||
:text="$t('groupUse')"
|
||||
class="mx-auto label-text"
|
||||
/>
|
||||
<select-translated-array
|
||||
:items="[
|
||||
'groupParentChildren',
|
||||
'groupCouple',
|
||||
'groupFriends',
|
||||
'groupCoworkers',
|
||||
'groupManager',
|
||||
'groupTeacher'
|
||||
]"
|
||||
class="group-input"
|
||||
:placeholder="'groupUseDefault'"
|
||||
:value="upgradedGroup.demographics"
|
||||
@select="upgradedGroup.demographics = $event"
|
||||
/>
|
||||
<button
|
||||
v-if="!paymentData.newGroup"
|
||||
class="btn btn-primary mx-auto"
|
||||
:disabled="!upgradedGroup.demographics"
|
||||
@click="submit()"
|
||||
>
|
||||
{{ $t('submit') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
#payments-success-modal .modal-md {
|
||||
max-width: 20.5rem;
|
||||
}
|
||||
#payments-success-modal {
|
||||
.modal-md {
|
||||
max-width: 448px;
|
||||
min-width: 330px;
|
||||
|
||||
#payments-success-modal .modal-content {
|
||||
background: transparent;
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 16px;
|
||||
cursor: pointer;
|
||||
|
||||
.icon-close {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
vertical-align: middle;
|
||||
|
||||
& svg path {
|
||||
fill: $green-1;
|
||||
}
|
||||
& :hover {
|
||||
fill: $green-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
justify-content: center;
|
||||
padding-top: 24px;
|
||||
padding-bottom: 0px;
|
||||
background: $green-100;
|
||||
border-top-right-radius: 8px;
|
||||
border-top-left-radius: 8px;
|
||||
border-bottom: none;
|
||||
|
||||
h2 {
|
||||
color: $green-1;
|
||||
}
|
||||
|
||||
.check-container {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border-radius: 50%;
|
||||
background: $green-1;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.check {
|
||||
width: 35.1px;
|
||||
height: 28px;
|
||||
color: $white;
|
||||
}
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
padding: 16px 32px 24px 32px;
|
||||
background: $white;
|
||||
|
||||
.modal-body-col {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
|
||||
.btn.btn-primary {
|
||||
margin-top: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
.details-block {
|
||||
background: $gray-700;
|
||||
border-radius: 4px;
|
||||
padding: 8px 16px;
|
||||
margin-top: 16px;
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
text-align: center;
|
||||
|
||||
&.gems {
|
||||
padding: 12px 16px 12px 20px;
|
||||
color: $green-10;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
line-height: 1.33;
|
||||
|
||||
.svg-icon {
|
||||
margin-right: 8px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.auto-renew {
|
||||
margin-top: 16px;
|
||||
color: $orange-10;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.group-auto-renew {
|
||||
margin: 12px 20px -8px 20px;
|
||||
color: $yellow-5;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.group-billing-date {
|
||||
width: 269px;
|
||||
}
|
||||
}
|
||||
.modal-footer {
|
||||
background: $gray-700;
|
||||
border-bottom-right-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
justify-content: center;
|
||||
border-top: none;
|
||||
|
||||
.small-text {
|
||||
font-style: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#payments-success-modal.modal-hidden-footer .modal-body {
|
||||
@@ -114,119 +313,123 @@
|
||||
border-bottom-left-radius: 8px;
|
||||
}
|
||||
|
||||
#payments-success-modal .modal-header {
|
||||
justify-content: center;
|
||||
padding-top: 24px;
|
||||
padding-bottom: 0px;
|
||||
background: $green-100;
|
||||
border-top-right-radius: 8px;
|
||||
border-top-left-radius: 8px;
|
||||
border-bottom: none;
|
||||
.demographics {
|
||||
background-color: $gray-700;
|
||||
|
||||
h2 {
|
||||
color: white;
|
||||
.label-text {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.check-container {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border-radius: 50%;
|
||||
background: #1CA372;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 16px;
|
||||
.group-input {
|
||||
width: 400px !important;
|
||||
margin-top: -24px !important;
|
||||
}
|
||||
|
||||
.check {
|
||||
width: 35.1px;
|
||||
height: 28px;
|
||||
color: white;
|
||||
.btn {
|
||||
margin-top: 0px;
|
||||
width: 77px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
.message {
|
||||
margin-bottom: 8px;
|
||||
width: 378px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
#payments-success-modal .modal-body {
|
||||
padding-top: 16px;
|
||||
padding-bottom: 24px;
|
||||
background: white;
|
||||
|
||||
.modal-body-col {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
|
||||
.btn.btn-primary {
|
||||
margin-top: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
.details-block {
|
||||
background: $gray-700;
|
||||
border-radius: 4px;
|
||||
padding: 8px 24px;
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
text-align: center;
|
||||
|
||||
&.gems {
|
||||
padding: 12px 16px 12px 20px;
|
||||
color: $green-10;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
line-height: 1.33;
|
||||
|
||||
.svg-icon {
|
||||
margin-right: 8px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.auto-renew {
|
||||
margin-top: 16px;
|
||||
color: $orange-10;
|
||||
font-style: normal;
|
||||
}
|
||||
}
|
||||
|
||||
#payments-success-modal .modal-footer {
|
||||
background: $gray-700;
|
||||
border-bottom-right-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
justify-content: center;
|
||||
border-top: none;
|
||||
|
||||
.small-text {
|
||||
font-style: normal;
|
||||
textarea.form-control {
|
||||
height: 56px;
|
||||
margin: 0 24px 24px 24px;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss">
|
||||
@import '~@/assets/scss/mixins.scss';
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// icons
|
||||
import checkIcon from '@/assets/svg/check.svg';
|
||||
import gemIcon from '@/assets/svg/gem.svg';
|
||||
import closeIcon from '@/assets/svg/close.svg';
|
||||
|
||||
// components
|
||||
import { mapState } from '@/libs/store';
|
||||
import subscriptionBlocks from '@/../../common/script/content/subscriptionBlocks';
|
||||
import selectTranslatedArray from '@/components/tasks/modal-controls/selectTranslatedArray';
|
||||
import lockableLabel from '@/components/tasks/modal-controls/lockableLabel';
|
||||
|
||||
// mixins
|
||||
import notificationsMixin from '@/mixins/notifications';
|
||||
import paymentsMixin from '@/mixins/payments';
|
||||
|
||||
// analytics
|
||||
import * as Analytics from '@/libs/analytics';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
selectTranslatedArray,
|
||||
lockableLabel,
|
||||
},
|
||||
mixins: [
|
||||
paymentsMixin,
|
||||
notificationsMixin,
|
||||
],
|
||||
data () {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
check: checkIcon,
|
||||
gem: gemIcon,
|
||||
close: closeIcon,
|
||||
}),
|
||||
paymentData: {},
|
||||
upgradedGroup: {
|
||||
name: '',
|
||||
demographics: null,
|
||||
},
|
||||
sendingInProgress: false,
|
||||
gift: {
|
||||
message: '',
|
||||
},
|
||||
receiverName: {
|
||||
name: null,
|
||||
uuid: null,
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data', group: 'group.data' }),
|
||||
groupPlanCost () {
|
||||
const sub = this.paymentData.subscription;
|
||||
const memberCount = this.paymentData.group.memberCount || 1;
|
||||
return sub.price + 3 * (memberCount - 1);
|
||||
},
|
||||
isFromBalance () {
|
||||
isGemsBalance () {
|
||||
return this.paymentData.paymentType === 'gift-gems-balance';
|
||||
},
|
||||
isGems () {
|
||||
return this.paymentData.paymentType === 'gems';
|
||||
},
|
||||
isGiftGems () {
|
||||
return this.paymentData.paymentType === 'gift-gems';
|
||||
},
|
||||
isGiftSubscription () {
|
||||
return this.paymentData.paymentType === 'gift-subscription';
|
||||
},
|
||||
isSubscription () {
|
||||
return this.paymentData.paymentType === 'subscription';
|
||||
},
|
||||
isGroupPlan () {
|
||||
return this.paymentData.paymentType === 'groupPlan';
|
||||
},
|
||||
isUpgradedGroup () {
|
||||
return this.paymentData.paymentType === 'groupPlan' && !this.paymentData.newGroup;
|
||||
},
|
||||
isNewGroup () {
|
||||
return this.paymentData.paymentType === 'groupPlan' && this.paymentData.newGroup;
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.$root.$on('habitica:payment-success', data => {
|
||||
@@ -242,7 +445,30 @@ export default {
|
||||
this.$root.$off('habitica:payments-success');
|
||||
},
|
||||
methods: {
|
||||
async sendMessage () {
|
||||
this.sendingInProgress = true;
|
||||
await this.$store.dispatch('members:sendPrivateMessage', {
|
||||
message: this.gift.message,
|
||||
toUserId: this.paymentData.gift.uuid || this.paymentData.toUserId,
|
||||
});
|
||||
this.close();
|
||||
},
|
||||
close () {
|
||||
this.gift.message = '';
|
||||
this.sendingInProgress = false;
|
||||
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
|
||||
},
|
||||
submit () {
|
||||
if (this.paymentData.group && !this.paymentData.newGroup) {
|
||||
Analytics.track({
|
||||
hitType: 'event',
|
||||
eventName: 'group plan upgrade',
|
||||
eventAction: 'group plan upgrade',
|
||||
eventCategory: 'behavior',
|
||||
demographics: this.upgradedGroup.demographics,
|
||||
type: this.paymentData.group.type,
|
||||
}, { trackOnClient: true });
|
||||
}
|
||||
this.paymentData = {};
|
||||
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
|
||||
},
|
||||
|
||||
@@ -387,9 +387,7 @@
|
||||
{{ $t('saveAndConfirm') }}
|
||||
</button>
|
||||
</div>
|
||||
<h5
|
||||
v-if="user.auth.local.email"
|
||||
>
|
||||
<h5 v-if="user.auth.local.has_password">
|
||||
{{ $t('changeEmail') }}
|
||||
</h5>
|
||||
<div
|
||||
|
||||
@@ -125,6 +125,10 @@ export default {
|
||||
type: Object,
|
||||
default () {},
|
||||
},
|
||||
receiverName: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
@@ -135,7 +139,6 @@ export default {
|
||||
type: 'subscription',
|
||||
subscription: { key: 'basic_earned' },
|
||||
},
|
||||
receiverName: '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -385,7 +385,6 @@ import EquipmentAttributesGrid from '../inventory/equipment/attributesGrid.vue';
|
||||
import Item from '@/components/inventory/item';
|
||||
import Avatar from '@/components/avatar';
|
||||
|
||||
import seasonalShopConfig from '@/../../common/script/libs/shops-seasonal.config';
|
||||
import { drops as dropEggs } from '@/../../common/script/content/eggs';
|
||||
import { drops as dropPotions } from '@/../../common/script/content/hatching-potions';
|
||||
|
||||
@@ -438,7 +437,6 @@ export default {
|
||||
|
||||
selectedAmountToBuy: 1,
|
||||
isPinned: false,
|
||||
endDate: seasonalShopConfig.dateRange.end,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -489,6 +487,9 @@ export default {
|
||||
nonSubscriberHourglasses () {
|
||||
return (!this.user.purchased.plan.customerId && !this.user.purchased.plan.consecutive.trinkets && this.getPriceClass() === 'hourglasses');
|
||||
},
|
||||
endDate () {
|
||||
return moment(this.item.event.end);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
item: function itemChanged () {
|
||||
|
||||
@@ -8,16 +8,6 @@
|
||||
:popover-position="'top'"
|
||||
@click="itemSelected(item)"
|
||||
>
|
||||
<span slot="popoverContent">
|
||||
<strong v-if="item.key === 'gem' && gemsLeft === 0">{{ $t('maxBuyGems') }}</strong>
|
||||
<h4 class="popover-content-title">{{ item.text }}</h4>
|
||||
<div
|
||||
v-if="item.event"
|
||||
class="mt-2"
|
||||
>
|
||||
{{ limitedString }}
|
||||
</div>
|
||||
</span>
|
||||
<template
|
||||
slot="itemBadge"
|
||||
slot-scope="ctx"
|
||||
@@ -32,11 +22,9 @@
|
||||
import _filter from 'lodash/filter';
|
||||
import _sortBy from 'lodash/sortBy';
|
||||
import _map from 'lodash/map';
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
import pinUtils from '@/mixins/pinUtils';
|
||||
import planGemLimits from '@/../../common/script/libs/planGemLimits';
|
||||
import seasonalShopConfig from '@/../../common/script/libs/shops-seasonal.config';
|
||||
|
||||
import ShopItem from '../shopItem';
|
||||
import CategoryItem from './categoryItem';
|
||||
@@ -48,12 +36,6 @@ export default {
|
||||
},
|
||||
mixins: [pinUtils],
|
||||
props: ['hideLocked', 'hidePinned', 'searchBy', 'sortBy', 'category'],
|
||||
data () {
|
||||
return {
|
||||
timer: '',
|
||||
limitedString: '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
content: 'content',
|
||||
@@ -106,43 +88,10 @@ export default {
|
||||
return result;
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.countdownString();
|
||||
this.timer = setInterval(this.countdownString, 1000);
|
||||
},
|
||||
beforeDestroy () {
|
||||
this.cancelAutoUpdate();
|
||||
},
|
||||
methods: {
|
||||
itemSelected (item) {
|
||||
this.$root.$emit('buyModal::showItem', item);
|
||||
},
|
||||
countdownString () {
|
||||
const diffDuration = moment.duration(moment(seasonalShopConfig.dateRange.end).diff(moment()));
|
||||
|
||||
if (diffDuration.asSeconds() <= 0) {
|
||||
this.limitedString = this.$t('noLongerAvailable');
|
||||
} else if (diffDuration.days() > 0 || diffDuration.months() > 0) {
|
||||
this.limitedString = this.$t('limitedAvailabilityDays', {
|
||||
days: moment(seasonalShopConfig.dateRange.end).diff(moment(), 'days'),
|
||||
hours: diffDuration.hours(),
|
||||
minutes: diffDuration.minutes(),
|
||||
});
|
||||
} else if (diffDuration.asMinutes() > 2) {
|
||||
this.limitedString = this.$t('limitedAvailabilityHours', {
|
||||
hours: diffDuration.hours(),
|
||||
minutes: diffDuration.minutes(),
|
||||
});
|
||||
} else {
|
||||
this.limitedString = this.$t('limitedAvailabilityMinutes', {
|
||||
minutes: diffDuration.minutes(),
|
||||
seconds: diffDuration.seconds(),
|
||||
});
|
||||
}
|
||||
},
|
||||
cancelAutoUpdate () {
|
||||
clearInterval(this.timer);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -263,8 +263,8 @@
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
import seasonalShopConfig from '@/../../common/script/libs/shops-seasonal.config';
|
||||
|
||||
import svgClock from '@/assets/svg/clock.svg';
|
||||
import svgClose from '@/assets/svg/close.svg';
|
||||
@@ -319,7 +319,6 @@ export default {
|
||||
|
||||
isPinned: false,
|
||||
selectedAmountToBuy: 1,
|
||||
endDate: seasonalShopConfig.dateRange.end,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -343,6 +342,9 @@ export default {
|
||||
if (this.priceType === 'hourglasses') return this.icons.hourglass;
|
||||
return this.icons.gem;
|
||||
},
|
||||
endDate () {
|
||||
return moment(this.item.event.end);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
item: function itemChanged () {
|
||||
|
||||
@@ -402,6 +402,8 @@ import _sortBy from 'lodash/sortBy';
|
||||
import _throttle from 'lodash/throttle';
|
||||
import _groupBy from 'lodash/groupBy';
|
||||
import _map from 'lodash/map';
|
||||
import _each from 'lodash/each';
|
||||
import * as stopword from 'stopword/dist/stopword.esm.mjs';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
import ShopItem from '../shopItem';
|
||||
@@ -426,6 +428,51 @@ import SelectTranslatedArray from '@/components/tasks/modal-controls/selectTrans
|
||||
import QuestPopover from './questPopover';
|
||||
import { worldStateMixin } from '@/mixins/worldState';
|
||||
|
||||
function splitMultipleDelims (text, delims) {
|
||||
const omniDelim = 'θνι';
|
||||
let workingText = text;
|
||||
for (const delim of delims) {
|
||||
workingText = workingText.replace(new RegExp(delim, 'g'), omniDelim);
|
||||
}
|
||||
return workingText.split(omniDelim);
|
||||
}
|
||||
|
||||
function removeStopwordsFromText (text, language) {
|
||||
// list of supported languages https://www.npmjs.com/package/stopword
|
||||
const langs = {
|
||||
bg: stopword.bul,
|
||||
cs: stopword.ces,
|
||||
da: stopword.dan,
|
||||
de: stopword.deu,
|
||||
en: stopword.eng,
|
||||
en_GB: stopword.eng,
|
||||
'en@pirate': stopword.eng.concat(["th'"]),
|
||||
es: stopword.spa,
|
||||
es_419: stopword.spa,
|
||||
fr: stopword.fra,
|
||||
he: stopword.heb,
|
||||
hu: stopword.hun,
|
||||
id: stopword.ind,
|
||||
it: stopword.ita,
|
||||
ja: stopword.jpn,
|
||||
nl: stopword.nld,
|
||||
pl: stopword.pol,
|
||||
pt: stopword.por,
|
||||
pt_BR: stopword.porBr,
|
||||
ro: stopword.ron,
|
||||
ru: stopword.rus,
|
||||
sk: stopword.slv,
|
||||
// sr: stopword.,
|
||||
sv: stopword.swe,
|
||||
tr: stopword.tur,
|
||||
uk: stopword.ukr,
|
||||
zh: stopword.zho,
|
||||
zh_TW: stopword.zho,
|
||||
};
|
||||
const splitText = splitMultipleDelims(text, [' ', "'"]);
|
||||
return stopword.removeStopwords(splitText, langs[language] || stopword.eng).join(' ').toLowerCase();
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
QuestPopover,
|
||||
@@ -539,7 +586,14 @@ export default {
|
||||
|
||||
switch (sortBy) { // eslint-disable-line default-case
|
||||
case 'AZ': {
|
||||
result = _sortBy(result, ['text']);
|
||||
if (category.identifier === 'pet' || category.identifier === 'hatchingPotion') {
|
||||
_each(result, item => {
|
||||
item.sortText = removeStopwordsFromText(item.text, this.user.preferences.language);
|
||||
});
|
||||
result = _sortBy(result, ['sortText']);
|
||||
} else {
|
||||
result = _sortBy(result, ['text']);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,11 @@
|
||||
class="svg-icon inline lock"
|
||||
v-html="icons.lock"
|
||||
></span>
|
||||
<span
|
||||
v-if="item.completed"
|
||||
class="svg-icon inline check"
|
||||
v-html="icons.check"
|
||||
></span>
|
||||
<span
|
||||
v-if="item.isSuggested"
|
||||
class="suggestedDot"
|
||||
@@ -200,6 +205,15 @@
|
||||
color: $gray-200;
|
||||
}
|
||||
|
||||
span.svg-icon.inline.check {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
position: absolute;
|
||||
left: 4px;
|
||||
top: 4px;
|
||||
color: $gray-200;
|
||||
}
|
||||
|
||||
span.badge.badge-round.badge-item.badge-clock {
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
@@ -246,6 +260,7 @@ import svgGem from '@/assets/svg/gem.svg';
|
||||
import svgGold from '@/assets/svg/gold.svg';
|
||||
import svgHourglasses from '@/assets/svg/hourglass.svg';
|
||||
import svgLock from '@/assets/svg/lock.svg';
|
||||
import svgCheck from '@/assets/svg/check.svg';
|
||||
import svgClock from '@/assets/svg/clock.svg';
|
||||
|
||||
import EquipmentAttributesPopover from '@/components/inventory/equipment/attributesPopover';
|
||||
@@ -297,6 +312,7 @@ export default {
|
||||
gems: svgGem,
|
||||
gold: svgGold,
|
||||
lock: svgLock,
|
||||
check: svgCheck,
|
||||
hourglasses: svgHourglasses,
|
||||
clock: svgClock,
|
||||
}),
|
||||
@@ -350,6 +366,7 @@ export default {
|
||||
'highlight-border': this.highlightBorder,
|
||||
suggested: this.item.isSuggested,
|
||||
locked: this.item.locked,
|
||||
completed: this.item.completed,
|
||||
};
|
||||
},
|
||||
countdownString () {
|
||||
|
||||
@@ -13,25 +13,29 @@
|
||||
:key="index"
|
||||
class="faq-question"
|
||||
>
|
||||
<h2
|
||||
v-b-toggle="heading"
|
||||
role="tab"
|
||||
variant="info"
|
||||
@click="handleClick($event)"
|
||||
<div
|
||||
v-if="heading !== 'world-boss'"
|
||||
>
|
||||
{{ $t(`faqQuestion${index}`) }}
|
||||
</h2>
|
||||
<b-collapse
|
||||
:id="heading"
|
||||
:visible="isVisible(heading)"
|
||||
accordion="faq"
|
||||
role="tabpanel"
|
||||
>
|
||||
<div
|
||||
v-markdown="$t(`webFaqAnswer${index}`, replacements)"
|
||||
class="card-body"
|
||||
></div>
|
||||
</b-collapse>
|
||||
<h2
|
||||
v-b-toggle="heading"
|
||||
role="tab"
|
||||
variant="info"
|
||||
@click="handleClick($event)"
|
||||
>
|
||||
{{ $t(`faqQuestion${index}`) }}
|
||||
</h2>
|
||||
<b-collapse
|
||||
:id="heading"
|
||||
:visible="isVisible(heading)"
|
||||
accordion="faq"
|
||||
role="tabpanel"
|
||||
>
|
||||
<div
|
||||
v-markdown="$t(`webFaqAnswer${index}`, replacements)"
|
||||
class="card-body"
|
||||
></div>
|
||||
</b-collapse>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<p v-markdown="$t('webFaqStillNeedHelp')"></p>
|
||||
|
||||
@@ -363,7 +363,7 @@
|
||||
|
||||
#front {
|
||||
.form-text a {
|
||||
color: #fff !important;
|
||||
color: $white !important;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
@@ -375,30 +375,24 @@
|
||||
padding-bottom: 5em;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 128px;
|
||||
height: 28px;
|
||||
color: purple;
|
||||
}
|
||||
|
||||
.purple-1, .purple-2, .purple-3, .purple-4, h1, h2, h3, h4, h5 {
|
||||
color: #fff;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
.purple-1 {
|
||||
background-color: #6133b4;
|
||||
background-color: $purple-300;
|
||||
}
|
||||
|
||||
.purple-2 {
|
||||
background-color: #432874;
|
||||
background-color: $purple-100;
|
||||
}
|
||||
|
||||
.purple-3 {
|
||||
background-color: #36205d;
|
||||
background-color: $purple-50;
|
||||
}
|
||||
|
||||
.purple-4 {
|
||||
background-color: #271b3d;
|
||||
background-color: $header-dark-background;
|
||||
}
|
||||
|
||||
p.section-main {
|
||||
@@ -419,15 +413,15 @@
|
||||
}
|
||||
|
||||
.pixel-horizontal {
|
||||
color: #6133b4;
|
||||
color: $purple-300;
|
||||
}
|
||||
|
||||
.pixel-horizontal-2 {
|
||||
color: #432874;
|
||||
color: $purple-100;
|
||||
}
|
||||
|
||||
.pixel-horizontal-3 {
|
||||
color: #271b3d;
|
||||
color: $header-dark-background;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6, button, .strike > span, input {
|
||||
@@ -455,13 +449,13 @@
|
||||
|
||||
.social-button {
|
||||
border-radius: 2px;
|
||||
border: solid 2px #bda8ff;
|
||||
border: solid 2px $purple-500;
|
||||
width: 100%;
|
||||
min-height: 40px;
|
||||
padding: .5em;
|
||||
background: transparent;
|
||||
margin-bottom: .5em;
|
||||
color: #bda8ff;
|
||||
color: $purple-500;
|
||||
transition: .5s;
|
||||
|
||||
span {
|
||||
@@ -471,8 +465,8 @@
|
||||
|
||||
.social-button:hover {
|
||||
cursor: pointer;
|
||||
border-color: #fff;
|
||||
color: #fff;
|
||||
border-color: $white;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
.social-icon {
|
||||
@@ -531,8 +525,8 @@
|
||||
input {
|
||||
margin-bottom: 1em;
|
||||
border-radius: 2px;
|
||||
background-color: #432874;
|
||||
border-color: #432874;
|
||||
background-color: $purple-100;
|
||||
border-color: $purple-100;
|
||||
color: $purple-400;
|
||||
border: solid 2px transparent;
|
||||
transition-timing-function: ease;
|
||||
@@ -544,17 +538,17 @@
|
||||
}
|
||||
|
||||
.input-valid {
|
||||
color: #fff;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
input:focus {
|
||||
border: solid 2px #9a62ff;
|
||||
border: solid 2px $purple-400;
|
||||
color: #fff;
|
||||
background-color: #36205d;
|
||||
background-color: $purple-50;
|
||||
}
|
||||
|
||||
input:hover {
|
||||
background-color: #36205d;
|
||||
background-color: $purple-50;
|
||||
}
|
||||
|
||||
.sign-up {
|
||||
@@ -657,7 +651,7 @@
|
||||
width: 411px;
|
||||
height: 48px;
|
||||
border-radius: 2px;
|
||||
background-color: #9a62ff;
|
||||
background-color: $purple-400;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.24), 0 1px 4px 0 rgba(26, 24, 29, 0.16);
|
||||
margin-bottom: 5em;
|
||||
}
|
||||
@@ -674,7 +668,7 @@
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background-color: #5d3b9c;
|
||||
background-color: $purple-50;
|
||||
box-shadow: 0 4px 4px 0 rgba(26, 24, 29, 0.16), 0 1px 8px 0 rgba(26, 24, 29, 0.12);
|
||||
}
|
||||
}
|
||||
@@ -693,7 +687,7 @@
|
||||
|
||||
.svg-icon {
|
||||
vertical-align: bottom;
|
||||
color: #d5c8ff;
|
||||
color: $purple-600;
|
||||
display: inline-block;
|
||||
margin-right: 1em;
|
||||
}
|
||||
@@ -760,6 +754,7 @@
|
||||
height: 500px;
|
||||
width: 100%;
|
||||
opacity: .5;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -776,7 +771,7 @@
|
||||
}
|
||||
|
||||
.input-error {
|
||||
color: #fff;
|
||||
color: $white;
|
||||
font-size: 90%;
|
||||
width: 100%;
|
||||
margin-bottom: 1em;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="container-fluid">
|
||||
<h1>Privacy Notice</h1>
|
||||
<p class="strong pagemeta">
|
||||
Last Updated: December 10, 2021
|
||||
Last Updated September 19, 2022: Removed reference to Facebook login, which is no longer supported.
|
||||
</p>
|
||||
<p>
|
||||
HabitRPG, Inc. (“HabitRPG,” “we,” “us,” or “our”) welcomes you. This privacy notice (the “Privacy
|
||||
@@ -39,8 +39,8 @@
|
||||
In connection with the creation of an account on our Platforms, we collect account credentials such as
|
||||
your email, username, and password. We use this account information to create your account, including to
|
||||
verify your identity. We also use this information to manage your account, including your transactions. If
|
||||
you choose to log into your account through Google, Apple or Facebook, we capture and store the User
|
||||
ID and email address connected to the respective account, so we can verify your identity when you log in.
|
||||
you choose to log into your account through Google or Apple, we capture and store the User ID and email
|
||||
address connected to the respective account, so we can verify your identity when you log in.
|
||||
</p>
|
||||
<h3>User Content</h3>
|
||||
<p>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
.home-header {
|
||||
background: #6133b4 !important;
|
||||
background: $purple-300 !important;
|
||||
position: static;
|
||||
box-shadow: none !important;
|
||||
height: 100px !important;
|
||||
@@ -46,13 +46,13 @@
|
||||
|
||||
.nav-item a {
|
||||
font-size: 14px !important;
|
||||
color: #d5c8ff !important;
|
||||
color: $purple-600 !important;
|
||||
padding-top: 2.8em !important;
|
||||
}
|
||||
|
||||
.nav-item a:hover {
|
||||
background: transparent !important;
|
||||
color: #fff !important;
|
||||
color: $white !important;
|
||||
}
|
||||
|
||||
.nav-item .nav-link {
|
||||
@@ -73,20 +73,20 @@
|
||||
}
|
||||
|
||||
.white-header {
|
||||
background: #fff !important;
|
||||
background-color: #fff !important;
|
||||
background: $white !important;
|
||||
background-color: $white !important;
|
||||
|
||||
a {
|
||||
color: #271b3d !important;
|
||||
color: $header-dark-background !important;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #fff !important;
|
||||
color: $white !important;
|
||||
}
|
||||
}
|
||||
|
||||
#purple-footer {
|
||||
background-color: #271b3d;
|
||||
background-color: $header-dark-background;
|
||||
|
||||
.row {
|
||||
margin: 0;
|
||||
@@ -94,19 +94,91 @@
|
||||
|
||||
footer, footer a {
|
||||
background: transparent;
|
||||
color: #d5c8ff;
|
||||
color: $purple-500;
|
||||
&:hover {
|
||||
color: $white;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: $purple-400;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-top-color: $purple-100;
|
||||
}
|
||||
|
||||
.donate-text {
|
||||
color: $purple-500;
|
||||
}
|
||||
|
||||
.logo {
|
||||
color: #bda8ff;
|
||||
color: $purple-300;
|
||||
}
|
||||
|
||||
.social-circle, .btn-contribute {
|
||||
background: #36205d;
|
||||
color: #bda8ff;
|
||||
.colophon {
|
||||
color: $purple-500;
|
||||
}
|
||||
|
||||
.svg-icon {
|
||||
color: #bda8ff;
|
||||
.social-circle {
|
||||
background: $purple-50;
|
||||
color: $purple-500;
|
||||
|
||||
.instagram svg {
|
||||
background-color: $purple-50;
|
||||
fill: $purple-500;
|
||||
&:hover {
|
||||
fill: $white;
|
||||
}
|
||||
}
|
||||
|
||||
.twitter svg {
|
||||
background-color: $purple-50;
|
||||
fill: $purple-500;
|
||||
&:hover {
|
||||
fill: $white;
|
||||
}
|
||||
}
|
||||
|
||||
.facebook svg {
|
||||
background-color: $purple-50;
|
||||
fill: $purple-500;
|
||||
&:hover {
|
||||
fill: $white;
|
||||
}
|
||||
}
|
||||
|
||||
.tumblr svg {
|
||||
background-color: $purple-50;
|
||||
fill: $purple-500;
|
||||
&:hover {
|
||||
fill: $white;
|
||||
}
|
||||
}
|
||||
}
|
||||
.btn-contribute {
|
||||
background: $white;
|
||||
box-shadow: none;
|
||||
border-radius: 2px;
|
||||
width: 175px;
|
||||
height: 32px;
|
||||
color: $gray-50;
|
||||
text-align: center;
|
||||
line-height: 1.71;
|
||||
font-weight: bold;
|
||||
font-size: 0.875rem;
|
||||
vertical-align: middle;
|
||||
padding: 0;
|
||||
margin: 32px 0 32px 24px;
|
||||
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
|
||||
|
||||
a {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.text{
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -142,7 +214,7 @@
|
||||
|
||||
<style lang="scss" scoped>
|
||||
#bottom-wrap.purple-4 {
|
||||
background-color: #271b3d;
|
||||
background-color: #271B3D;
|
||||
}
|
||||
|
||||
#bottom-wrap {
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
:right="right"
|
||||
:hide-icon="false"
|
||||
:inline-dropdown="inlineDropdown"
|
||||
:placeholder="placeholder"
|
||||
@select="selectItem($event)"
|
||||
>
|
||||
<template v-slot:item="{ item }">
|
||||
@@ -70,6 +71,9 @@ export default {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="task-wrapper">
|
||||
<div class="task-wrapper" draggable>
|
||||
<div
|
||||
class="task transition"
|
||||
:class="[{
|
||||
@@ -773,9 +773,9 @@
|
||||
}
|
||||
|
||||
.check.svg-icon {
|
||||
width: 12.3px;
|
||||
height: 9.8px;
|
||||
margin: 9px 8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.challenge.broken {
|
||||
|
||||
@@ -1,105 +1,308 @@
|
||||
<template>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<h1>{{ $t('gemTransactions') }}</h1>
|
||||
<span v-if="gemTransactions.length === 0">{{ $t('noGemTransactions') }}</span>
|
||||
<table class="table">
|
||||
<tr
|
||||
v-for="entry in gemTransactions"
|
||||
:key="entry.createdAt"
|
||||
<div>
|
||||
<div class="clearfix">
|
||||
<div class="mb-4 float-left">
|
||||
<button
|
||||
class="page-header btn-flat tab-button textCondensed"
|
||||
:class="{'active': selectedTab === 'gems'}"
|
||||
@click="selectTab('gems')"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span
|
||||
class="svg-icon inline icon-24"
|
||||
aria-hidden="true"
|
||||
v-html="icons.gem"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
:class="entry.amount < 0 ? 'deducted' : 'added'"
|
||||
>{{ entry.amount * 4 }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span>{{ transactionTypeText(entry.transactionType) }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-html="entryReferenceText(entry)"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<h1>{{ $t('hourglassTransactions') }}</h1>
|
||||
<span v-if="hourglassTransactions.length === 0">{{ $t('noHourglassTransactions') }}</span>
|
||||
<table class="table">
|
||||
<tr
|
||||
v-for="entry in hourglassTransactions"
|
||||
:key="entry.createdAt"
|
||||
{{ $t('gems') }}
|
||||
</button>
|
||||
<button
|
||||
class="page-header btn-flat tab-button textCondensed"
|
||||
:class="{'active': selectedTab === 'hourglass'}"
|
||||
@click="selectTab('hourglass')"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span
|
||||
class="svg-icon inline icon-24"
|
||||
aria-hidden="true"
|
||||
v-html="icons.hourglass"
|
||||
></span>
|
||||
<span
|
||||
class="amount hourglasses"
|
||||
:class="entry.amount < 0 ? 'deducted' : 'added'"
|
||||
>{{ entry.amount }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span>{{ transactionTypeText(entry.transactionType) }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-html="entryReferenceText(entry)"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{{ $t('mysticHourglass', { amount: ''}) }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12" v-if="selectedTab === 'gems'">
|
||||
<span v-if="gemTransactions.length === 0">
|
||||
{{ $t('noGemTransactions') }}
|
||||
</span>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th v-once class="timestamp-column">
|
||||
{{ $t('timestamp')}}
|
||||
</th>
|
||||
<th v-once class="amount-column">
|
||||
{{ $t('amount')}}
|
||||
</th>
|
||||
<th v-once class="action-column">
|
||||
{{ $t('action')}}
|
||||
</th>
|
||||
<th v-once class="note-column">
|
||||
{{ $t('note')}}
|
||||
</th>
|
||||
</tr>
|
||||
<tr
|
||||
v-for="entry in gemTransactions"
|
||||
:key="entry.createdAt"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="amount-with-icon" :id="entry.id">
|
||||
<span
|
||||
class="svg-icon inline icon-16 my-1"
|
||||
aria-hidden="true"
|
||||
v-html="entry.amount < 0 ? icons.gemRed : icons.gem"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
:class="entry.amount | addedDeducted"
|
||||
>{{ entry.amount * 4 }}</span>
|
||||
</div>
|
||||
|
||||
<b-popover
|
||||
v-if="typeof entry.currentAmount !== 'undefined'"
|
||||
ref="popover"
|
||||
:target="entry.id"
|
||||
triggers="hover focus click"
|
||||
placement="bottom"
|
||||
>
|
||||
<div class="remaining-amount-popover-content">
|
||||
{{ $t('remainingBalance') }}:
|
||||
<span
|
||||
class="svg-icon inline icon-16 ml-1"
|
||||
aria-hidden="true"
|
||||
v-html="icons.gem"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
>{{ entry.currentAmount * 4 }}</span>
|
||||
</div>
|
||||
</b-popover>
|
||||
</td>
|
||||
<td class="entry-action">
|
||||
<span v-html="transactionTypeText(entry.transactionType)"></span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-if="transactionTypes.gifted.includes(entry.transactionType)">
|
||||
<router-link
|
||||
class="user-link"
|
||||
:to="{'name': 'userProfile', 'params': {'userId': entry.reference}}"
|
||||
>
|
||||
@{{ entry.referenceText }}
|
||||
</router-link>
|
||||
</span>
|
||||
<span v-else-if="transactionTypes.challenges.includes(entry.transactionType)">
|
||||
<router-link
|
||||
class="challenge-link"
|
||||
:to="{ name: 'challenge', params: { challengeId: entry.reference } }">
|
||||
<span
|
||||
v-markdown="entry.referenceText"
|
||||
></span>
|
||||
</router-link>
|
||||
</span>
|
||||
<span v-else v-html="entryReferenceText(entry)"></span>
|
||||
|
||||
<span v-if="entry.reference">
|
||||
({{entry.reference}})
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-12" v-if="selectedTab === 'hourglass'">
|
||||
<span v-if="hourglassTransactions.length === 0">
|
||||
{{ $t('noHourglassTransactions') }}
|
||||
</span>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th v-once class="timestamp-column">
|
||||
{{ $t('timestamp')}}
|
||||
</th>
|
||||
<th v-once class="amount-column">
|
||||
{{ $t('amount')}}
|
||||
</th>
|
||||
<th v-once class="action-column">
|
||||
{{ $t('action')}}
|
||||
</th>
|
||||
<th v-once class="note-column">
|
||||
{{ $t('note')}}
|
||||
</th>
|
||||
</tr>
|
||||
<tr
|
||||
v-for="entry in hourglassTransactions"
|
||||
:key="entry.createdAt"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="amount-with-icon" :id="entry.id">
|
||||
<span
|
||||
class="svg-icon inline icon-16 my-1"
|
||||
aria-hidden="true"
|
||||
v-html="entry.amount < 0 ? icons.hourglassRed : icons.hourglass"
|
||||
></span>
|
||||
<span
|
||||
class="amount hourglasses"
|
||||
:class="entry.amount | addedDeducted"
|
||||
>{{ entry.amount }}</span>
|
||||
</div>
|
||||
|
||||
<b-popover
|
||||
v-if="typeof entry.currentAmount !== 'undefined'"
|
||||
ref="popover"
|
||||
:target="entry.id"
|
||||
triggers="hover focus click"
|
||||
placement="bottom"
|
||||
>
|
||||
<div class="remaining-amount-popover-content">
|
||||
{{ $t('remainingBalance') }}:
|
||||
<span
|
||||
class="svg-icon inline icon-16 ml-1"
|
||||
aria-hidden="true"
|
||||
v-html="icons.hourglass"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
>{{ entry.currentAmount }}</span>
|
||||
</div>
|
||||
</b-popover>
|
||||
</td>
|
||||
<td class="entry-action">
|
||||
<span v-html="transactionTypeText(entry.transactionType)"></span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-html="entryReferenceText(entry)"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
.page-header.btn-flat {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.tab-button {
|
||||
height: 2rem;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
font-stretch: condensed;
|
||||
line-height: 1.33;
|
||||
letter-spacing: normal;
|
||||
color: $gray-10;
|
||||
|
||||
margin-right: 1.125rem;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-bottom: 2.5rem;
|
||||
|
||||
&.active, &:hover {
|
||||
color: $purple-300;
|
||||
box-shadow: 0px -0.25rem 0px $purple-300 inset;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
.amount-column {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.svg-icon {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.amount {
|
||||
font-weight: bold;
|
||||
font-size: 1.1rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
|
||||
.added::before {
|
||||
content: "+";
|
||||
}
|
||||
|
||||
.gems {
|
||||
color: $gems-color;
|
||||
color: $green-10;
|
||||
|
||||
&.deducted {
|
||||
color: $red-10;
|
||||
color: $maroon-50;
|
||||
}
|
||||
}
|
||||
|
||||
.hourglasses {
|
||||
font-weight: bold;
|
||||
color: $hourglass-color;
|
||||
color: $green-10;
|
||||
&.deducted {
|
||||
color: $red-10;
|
||||
color: $maroon-50;
|
||||
}
|
||||
}
|
||||
|
||||
.amount-with-icon {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.remaining-amount-popover-content {
|
||||
display: flex;
|
||||
font-size: 12px;
|
||||
line-height: 1.33;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
table {
|
||||
line-height: 1.71;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
th {
|
||||
border-top: 0 !important;
|
||||
padding: 0.25rem 0.5rem !important;
|
||||
font-weight: bold;
|
||||
line-height: 1.71;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
td {
|
||||
padding-left: 0.5rem !important;
|
||||
padding-right: 0.5rem !important;
|
||||
|
||||
line-height: 1.71;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding-top: 0.35rem !important;
|
||||
padding-bottom: 0.35rem !important;
|
||||
}
|
||||
|
||||
.timestamp-column, .action-column {
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
.amount-column {
|
||||
width: 10%;
|
||||
}
|
||||
|
||||
.note-column {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.challenge-link, .user-link {
|
||||
color: $blue-10 !important;
|
||||
}
|
||||
|
||||
.entry-action {
|
||||
b {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -107,9 +310,15 @@
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import svgGem from '@/assets/svg/gem.svg';
|
||||
import svgGemRed from '@/assets/svg/gem-red.svg';
|
||||
import svgHourglass from '@/assets/svg/hourglass.svg';
|
||||
import svgHourglassRed from '@/assets/svg/hourglass-red.svg';
|
||||
import markdownDirective from '@/directives/markdown';
|
||||
|
||||
export default {
|
||||
directives: {
|
||||
markdown: markdownDirective,
|
||||
},
|
||||
filters: {
|
||||
timeAgo (value) {
|
||||
return moment(value).fromNow();
|
||||
@@ -118,6 +327,13 @@ export default {
|
||||
// @TODO: Vue doesn't support this so we cant user preference
|
||||
return moment(value).toDate().toString();
|
||||
},
|
||||
addedDeducted (amount) {
|
||||
if (amount === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return amount < 0 ? 'deducted' : 'added';
|
||||
},
|
||||
},
|
||||
props: {
|
||||
gemTransactions: {
|
||||
@@ -133,11 +349,21 @@ export default {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
gem: svgGem,
|
||||
gemRed: svgGemRed,
|
||||
hourglass: svgHourglass,
|
||||
hourglassRed: svgHourglassRed,
|
||||
}),
|
||||
selectedTab: 'gems',
|
||||
transactionTypes: Object.freeze({
|
||||
gifted: ['gift_send', 'gift_receive'],
|
||||
challenges: ['create_challenge', 'create_bank_challenge'],
|
||||
}),
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
selectTab (type) {
|
||||
this.selectedTab = type;
|
||||
},
|
||||
entryReferenceText (entry) {
|
||||
if (entry.reference === undefined && entry.referenceText === undefined) {
|
||||
return '';
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<template v-slot:button-content>
|
||||
<slot
|
||||
name="item"
|
||||
:item="selected"
|
||||
:item="selected || placeholder"
|
||||
:button="true"
|
||||
>
|
||||
<!-- Fallback content -->
|
||||
@@ -114,6 +114,9 @@ export default {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
|
||||
@@ -34,44 +34,4 @@ export default [
|
||||
type: 'Staff',
|
||||
uuid: 'f4e5c6da-0617-48bf-b3bd-9f97636774a8',
|
||||
},
|
||||
{
|
||||
name: 'Alys',
|
||||
type: 'Moderator',
|
||||
uuid: 'd904bd62-da08-416b-a816-ba797c9ee265',
|
||||
},
|
||||
{
|
||||
name: 'Cantras',
|
||||
type: 'Moderator',
|
||||
uuid: '28771972-ca6d-4c03-8261-e1734aa7d21d',
|
||||
},
|
||||
{
|
||||
name: 'deilann',
|
||||
type: 'Moderator',
|
||||
uuid: 'e7b5d1e2-3b6e-4192-b867-8bafdb03eeec',
|
||||
},
|
||||
{
|
||||
name: 'Dewines',
|
||||
type: 'Moderator',
|
||||
uuid: '262a7afb-6b57-4d81-88e0-80d2e9f6cbdc',
|
||||
},
|
||||
{
|
||||
name: 'Fox_town',
|
||||
type: 'Moderator',
|
||||
uuid: 'a05f0152-d66b-4ef1-93ac-4adb195d0031',
|
||||
},
|
||||
{
|
||||
name: 'MaybeSteveRogers',
|
||||
type: 'Moderator',
|
||||
uuid: '767e5d92-0e13-4e30-acb1-d8bba62824fc',
|
||||
},
|
||||
{
|
||||
name: 'Nakonana',
|
||||
type: 'Moderator',
|
||||
uuid: '33bb14bd-814d-40cb-98a4-7b76a752761c',
|
||||
},
|
||||
{
|
||||
name: 'shanaqui',
|
||||
type: 'Moderator',
|
||||
uuid: 'bb089388-28ae-4e42-a8fa-f0c2bfb6f779',
|
||||
},
|
||||
];
|
||||
|
||||
@@ -17,8 +17,14 @@ export const avatarEditorUtilies = { // eslint-disable-line import/prefer-defaul
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
hideSet (set) {
|
||||
return moment(appearanceSets[set.key].availableUntil).isBefore(moment());
|
||||
hideSet (setKey) {
|
||||
if (appearanceSets[setKey].availableFrom) {
|
||||
return !moment().isBetween(
|
||||
appearanceSets[setKey].availableFrom,
|
||||
appearanceSets[setKey].availableUntil,
|
||||
);
|
||||
}
|
||||
return moment(appearanceSets[setKey].availableUntil).isBefore(moment());
|
||||
},
|
||||
mapKeysToFreeOption (key, type, subType) {
|
||||
const userPreference = subType
|
||||
@@ -43,8 +49,8 @@ export const avatarEditorUtilies = { // eslint-disable-line import/prefer-defaul
|
||||
const locked = !userPurchased || !userPurchased[key];
|
||||
let hide = false;
|
||||
|
||||
if (set && appearanceSets[set]) {
|
||||
if (locked) hide = moment(appearanceSets[set].availableUntil).isBefore(moment());
|
||||
if (set && appearanceSets[set] && locked) {
|
||||
hide = this.hideSet(set);
|
||||
}
|
||||
|
||||
option.gemLocked = locked;
|
||||
|
||||
@@ -39,6 +39,13 @@ export default {
|
||||
return moment(this.user.purchased.plan.dateTerminated)
|
||||
.format(this.user.preferences.dateFormat.toUpperCase());
|
||||
},
|
||||
renewalDate () {
|
||||
const renewalDate = moment().add(1, 'months');
|
||||
if (!this.user.preferences || !this.user.preferences.dateFormat) {
|
||||
return renewalDate;
|
||||
}
|
||||
return renewalDate.format(this.user.preferences.dateFormat.toUpperCase());
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
encodeGift (uuid, gift) {
|
||||
@@ -140,6 +147,7 @@ export default {
|
||||
if (data.subscription) postData.sub = sub.key;
|
||||
if (data.coupon) postData.coupon = data.coupon;
|
||||
if (data.groupId) postData.groupId = data.groupId;
|
||||
if (data.demographics) postData.demographics = data.demographics;
|
||||
|
||||
const response = await axios.post(url, postData);
|
||||
|
||||
@@ -267,6 +275,10 @@ export default {
|
||||
this.amazonPayments.groupToCreate = data.groupToCreate;
|
||||
}
|
||||
|
||||
if (data.demographics) { // sending demographics
|
||||
this.amazonPayments.demographics = data.demographics;
|
||||
}
|
||||
|
||||
this.amazonPayments.gift = data.gift;
|
||||
this.amazonPayments.type = data.type;
|
||||
},
|
||||
|
||||
@@ -102,7 +102,7 @@ export function canEdit (store) {
|
||||
}
|
||||
break;
|
||||
case 'group':
|
||||
isUserCanEditTask = isUserGroupLeader || isUserGroupManager || isUserAdmin;
|
||||
isUserCanEditTask = isUserGroupLeader || isUserGroupManager;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -23,7 +23,6 @@ const envVars = [
|
||||
'BASE_URL',
|
||||
'GA_ID',
|
||||
'STRIPE_PUB_KEY',
|
||||
'FACEBOOK_KEY',
|
||||
'GOOGLE_CLIENT_ID',
|
||||
'APPLE_AUTH_CLIENT_ID',
|
||||
'AMPLITUDE_KEY',
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
"foundNewItemsExplanation": "القيام بمهامك يمنحك الفرصة للفوز بقطع جديدة مثل البيضات، جرعات التفقيس، وطعام الحيوانات الأليفة.",
|
||||
"onboardingProgress": "التقدم <%= percentage %>%",
|
||||
"achievementCreatedTask": "إصنع مهمتك الأولى",
|
||||
"achievementJustAddWaterModalText": "لقد أكملت جميع مغامرات حيوانات الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين الأليفة!",
|
||||
"achievementJustAddWaterText": "قد أكمل جميع مغامرات حيوانات الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين الأليفة.",
|
||||
"achievementMindOverMatterModalText": "لقد أكملت جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة!",
|
||||
"achievementMindOverMatterText": "قد أكمل جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة.",
|
||||
"achievementJustAddWaterModalText": "أكملت جميع مغامرات حيوانات الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين الأليفة!",
|
||||
"achievementJustAddWaterText": "أكملت جميع مغامرات حيوانات: الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين.",
|
||||
"achievementMindOverMatterModalText": "أكملت جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة!",
|
||||
"achievementMindOverMatterText": "أكملت جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة.",
|
||||
"achievementLostMasterclasserModalText": "لقد أكملت جميع المغامرات الستة عشرة في سلسلة مغامرات الخبير و حللت لغز الخبيرة المفقودة!",
|
||||
"achievementMonsterMagusModalText": "لقد جمعت جميع الحيوانات الأليفة من الأموات الأحياء!",
|
||||
"achievementMonsterMagusText": "قد جمع جميع الحيوانات الأليفة من الأموات الأحياء.",
|
||||
@@ -37,7 +37,7 @@
|
||||
"achievementBackToBasicsModalText": "لقد جمعت جميع الحيوانات الأليفة الأساسية!",
|
||||
"achievementBackToBasicsText": "قد جمع جميع الحيوانات الأليفة الأساسية.",
|
||||
"achievementBackToBasics": "عودة إلى الأساسيات",
|
||||
"achievementJustAddWater": "أضف الماء وحسب",
|
||||
"achievementJustAddWater": "أضف الماء فقط",
|
||||
"achievementMindOverMatter": "العقل فوق المادة",
|
||||
"achievementFedPet": "أطعم/ي حيواناً أليفاً",
|
||||
"achievementHatchedPetModalText": "إذهب/ي إلى قائمة أغراضك وحاول/ي جمع بيضة وجرعة تفقيس معاً",
|
||||
@@ -49,8 +49,8 @@
|
||||
"achievementAridAuthorityModalText": "لقد أكملت ترويض جميع حيوانات الركوب الصحراوية!",
|
||||
"achievementAridAuthorityText": "أكملوا ترويض جميع حيوانات الركوب الصحراوية.",
|
||||
"achievementPartyUp": "لقد كونت فريقاً مع عضو من مجموعتك!",
|
||||
"achievementAllYourBaseModalText": "لقد أكملت ترويض جميع حيوانات الركوب الأساسية!",
|
||||
"achievementAllYourBaseText": "أكمل(ت) ترويض جميع حيوانات الركوب الأساسية.",
|
||||
"achievementAllYourBaseModalText": "أكملت ترويض جميع حيوانات الركوب الأساسية!",
|
||||
"achievementAllYourBaseText": "أكملت ترويض جميع حيوانات الركوب الأساسية.",
|
||||
"achievementAllYourBase": "كل قاعدتك ملكنا الأن",
|
||||
"achievementFedPetText": "أطعموا حيوانهم الأليف الأول.",
|
||||
"achievementBugBonanza": "حفلة الحشرات",
|
||||
@@ -118,22 +118,25 @@
|
||||
"achievementDomesticatedModalText": "لقد جمعت كل الحيوانات الأليفة المستأنسة!",
|
||||
"achievementDomesticatedText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة المستأنسة: النمس ، وخنزير غينيا ، والديك ، والخنزير الطائر ، والجرذ ، والأرنب ، والحصان ، والبقر!",
|
||||
"achievementDomesticated": "ا-يا-ا-يا-يو",
|
||||
"achievementBirdsOfAFeatherModalText": "تقوم بجمع كل الحيوانات الأليفة الطائرة!",
|
||||
"achievementBirdsOfAFeatherModalText": "لقد قمت بجمع كل الحيوانات الأليفة الطائرة!",
|
||||
"achievementZodiacZookeeperText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة في الأبراج: الجرذ ، البقرة ، الأرنب ، الأفعى ، الحصان ، الأغنام ، القرد ، الديك ، الذئب ، النمر ، الخنزير الطائر ، والتنين!",
|
||||
"achievementGroupsBeta2022ModalText": "لقد ساعدت أنت ومجموعاتك Habitica من خلال الاختبار وتقديم التعليقات!",
|
||||
"achievementGroupsBeta2022": "اختبار تجريبي تفاعلي",
|
||||
"achievementGroupsBeta2022Text": "قدمت أنت ومجموعتك تعليقات لا تقدر بثمن لمساعدة Habitica في الاختبار.",
|
||||
"achievementReptacularRumble": "الدمدمة الزاحفة",
|
||||
"achievementReptacularRumbleModalText": "لقد جمعت كل الزواحف الأليفة!",
|
||||
"achievementReptacularRumbleText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الزواحف: التمساح ، الزاحف المجنح ، الأفعى ، ترايسيراتوبس ، السلحفاة ، التيرانوصور ريكس ، وفيلوسيرابتور!",
|
||||
"achievementBirdsOfAFeather": "متشابهون",
|
||||
"achievementReptacularRumbleText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الزواحف: التمساح، الزاحف المجنح، الأفعى، ترايسيراتوبس، السلحفاة، التيرانوصور ريكس وفيلوسيرابتور!",
|
||||
"achievementBirdsOfAFeather": "أصدقاء الطيران",
|
||||
"achievementZodiacZookeeper": "حارس حديقة الحيوانات الفلكية",
|
||||
"achievementShadyCustomerText": "لقد جمع كل حيوانات الظل الأليفة.",
|
||||
"achievementShadyCustomerModalText": "لقد قمت بتجميع كل حيوانات الظل الأليفة!",
|
||||
"achievementZodiacZookeeperModalText": "لقد قمت بتجميع كل الحيوانات الفلكية الأليفة!",
|
||||
"achievementBirdsOfAFeatherText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الطائرة: الخنزير الطائر ، البومة ، الببغاء ، الزاحف المجنح ، الجريفون ، فالكون ، الطاووس ، والديك!",
|
||||
"achievementShadeOfItAllModalText": "لقد قمت بترويض كل حيوانات الظل للركوب!",
|
||||
"achievementShadyCustomer": "زبون الظل",
|
||||
"achievementShadeOfItAll": "ظل كل شيء",
|
||||
"achievementShadeOfItAllText": "لقد ربي كل حيوانات الظل للترويض."
|
||||
"achievementShadyCustomerText": "جمع كل حيوانات الظل الأليفة.",
|
||||
"achievementShadyCustomerModalText": "لقد جمعت كل حيوانات الظل الأليفة!",
|
||||
"achievementZodiacZookeeperModalText": "لقد جمعت كل الحيوانات الأليفة الفلكية!",
|
||||
"achievementBirdsOfAFeatherText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الطائرة: الخنزير الطائر، البومة، الببغاء، الزاحف المجنح، الجرايفون، فالكون، الطاووس والديك!",
|
||||
"achievementShadeOfItAllModalText": "قمت بترويض كل الحيوانات السوداء",
|
||||
"achievementShadyCustomer": "عميل الظل",
|
||||
"achievementShadeOfItAll": "الظل فوق كل شيء",
|
||||
"achievementShadeOfItAllText": "روض كل حيوانات الظل السوداء.",
|
||||
"achievementWoodlandWizard": "ساحر الغابة",
|
||||
"achievementWoodlandWizardText": "لقد فقس جميع الألوان القياسية لمخلوقات الغابة: الغرير، الدب، الغزال، الثعلب، الضفدع، القنفذ، البومة، الأفعى، السنجاب والشجيرة!",
|
||||
"achievementWoodlandWizardModalText": "لقد جمعت كل حيوانات الغابة الأليفة!"
|
||||
}
|
||||
|
||||
@@ -306,5 +306,35 @@
|
||||
"foodSaddleText": "سرج",
|
||||
"foodSaddleNotes": "يحول حيوانًا أليفًا إلى مركب فورًا.",
|
||||
"foodSaddleSellWarningNote": "Hey! This is a pretty useful item! Are you familiar with how to use a Saddle with your Pets?",
|
||||
"foodNotes": "إطعام أحد الحيوانات الأليفة بهذا يمكنه من النمو ليصبح مركبًا قويًا."
|
||||
"foodNotes": "إطعام أحد الحيوانات الأليفة بهذا يمكنه من النمو ليصبح مركبًا قويًا.",
|
||||
"hatchingPotionBronze": "البرونز",
|
||||
"hatchingPotionWatery": "المائي",
|
||||
"hatchingPotionPolkaDot": "نقاط البولكا",
|
||||
"hatchingPotionBlackPearl": "اللؤلؤ الأسود",
|
||||
"hatchingPotionAutumnLeaf": "ورقة الخريف",
|
||||
"hatchingPotionVampire": "مصاص الدماء",
|
||||
"hatchingPotionDessert": "حلويات",
|
||||
"hatchingPotionVeggie": "حديقة",
|
||||
"questEggRobotAdjective": "مستقبلي",
|
||||
"hatchingPotionFluorite": "الفلوريت",
|
||||
"questEggRobotText": "حيوان الروبوت الأليف",
|
||||
"questEggDolphinMountText": "حيوان الدولفين للركوب",
|
||||
"hatchingPotionSolarSystem": "المجموعة الشمسية",
|
||||
"hatchingPotionMoonglow": "لمعان القمر",
|
||||
"questEggRobotMountText": "حيوان الروبوت للركوب",
|
||||
"hatchingPotionAmber": "العنبر",
|
||||
"hatchingPotionAurora": "الشفق القطبي",
|
||||
"hatchingPotionSandSculpture": "تمثال رملي",
|
||||
"hatchingPotionStainedGlass": "الزجاج الملون",
|
||||
"questEggDolphinText": "حيوان الدولفين الأليف",
|
||||
"hatchingPotionSunset": "غروب الشمس",
|
||||
"hatchingPotionShadow": "الظل",
|
||||
"hatchingPotionSilver": "الفضي",
|
||||
"hatchingPotionTurquoise": "التيركواز",
|
||||
"hatchingPotionSunshine": "شعاع الشمس",
|
||||
"hatchingPotionVirtualPet": "حيوان افتراضي أليف",
|
||||
"hatchingPotionWindup": "الزنبرك",
|
||||
"hatchingPotionPorcelain": "الخزف الملون",
|
||||
"hatchingPotionBirchBark": "لحاء الشجر",
|
||||
"hatchingPotionRuby": "الياقوت"
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"defaultHabit1Text": "عمل منتج (اضغط على القلم للتحرير)",
|
||||
"defaultHabit2Text": "أكل طعام غير صحى (أنقر على القلم للتعديل)",
|
||||
"defaultHabit3Text": "صعود السلم/استخدام المصعد (اضغط على قلم الرصاص للتعديل)",
|
||||
"defaultHabit4Text": "Add a task to Habitica",
|
||||
"defaultHabit4Notes": "Either a Habit, a Daily, or a To-Do",
|
||||
"defaultHabit4Text": "أضف مهمة إلى Habitica",
|
||||
"defaultHabit4Notes": "إما عادة أو يومية أو مهمة",
|
||||
"defaultTodo1Text": "الانضمام إلى Habitica (عَلِّم عليَّ)",
|
||||
"defaultTodoNotes": "بإمكانك أن تكمل هذه المهمة، تعدلها، أو تحذفها.",
|
||||
"defaultReward1Text": "15 دقيقة استراحة",
|
||||
@@ -11,9 +11,46 @@
|
||||
"defaultReward2Notes": "شاهد التلفاز، إلعب لعبة، كل حلوى، الأمر يعود لك!",
|
||||
"defaultTag1": "عمل",
|
||||
"defaultTag2": "تمرين",
|
||||
"defaultTag3": "Health + Wellness",
|
||||
"defaultTag3": "الصحة + الراحة",
|
||||
"defaultTag4": "مدرسة",
|
||||
"defaultTag5": "فرق",
|
||||
"defaultTag6": "Chores",
|
||||
"defaultTag7": "الإبداع"
|
||||
"defaultTag6": "عمل منزلي",
|
||||
"defaultTag7": "إبداع",
|
||||
"workTodoProject": "مشروع العمل >> إكمال مشروع العمل",
|
||||
"workDailyImportantTask": "أهم مهمة >> عملت على أهم مهمة اليوم",
|
||||
"workHabitMail": "معالجة البريد الإلكتروني",
|
||||
"workDailyImportantTaskNotes": "انقر لتحديد أهم مهمة لديك",
|
||||
"workTodoProjectNotes": "انقر لتحديد اسم مشروعك الحالي + تعيين تاريخ الاستحقاق!",
|
||||
"exerciseDailyText": "التمدد (ستريتش) >> روتين التمرين اليومي",
|
||||
"healthDailyNotes": "انقر للتعديل!",
|
||||
"exerciseTodoText": "إعداد جدول التمرين",
|
||||
"healthTodoNotes": "انقر لإضافة قائمة مراجعة!",
|
||||
"creativityDailyText": "العمل على مشروع إبداعي",
|
||||
"schoolDailyNotes": "انقر لاختيار جدول الواجبات المنزلية!",
|
||||
"creativityDailyNotes": "انقر لتسمية مشروعك الحالي + تحديد جدول المواعيد!",
|
||||
"selfCareDailyText": "5 دقائق للتنفس بهدوء",
|
||||
"creativityTodoText": "إنهاء مشروع إبداعي",
|
||||
"selfCareDailyNotes": "انقر لاختيار الجدول!",
|
||||
"selfCareTodoNotes": "انقر لتحديد خطة العمل!",
|
||||
"defaultHabitText": "انقر هنا لتحديد أن هذه العادة سلبية، وتريد أن تقلع عنها",
|
||||
"defaultHabitNotes": "أو قم بالحذف من نافذة التعديل",
|
||||
"choresDailyNotes": "انقر لاختيار جدولك!",
|
||||
"creativityHabit": "احترف المهارة >> + مارس تقنية إبداعية جديدة",
|
||||
"exerciseHabit": "10 دقائق كارديو >> + 10 دقائق كارديو",
|
||||
"healthTodoText": "حدد موعداً للمراجعة >> تفكر في تغيير صحي",
|
||||
"schoolHabit": "دراسة / مماطلة",
|
||||
"selfCareHabit": "خذ استراحة قصيرة",
|
||||
"exerciseTodoNotes": "انقر لإضافة قائمة تدقيق!",
|
||||
"choresHabit": "10 دقائق تنظيف",
|
||||
"schoolTodoText": "إنهاء واجب دراسي",
|
||||
"healthHabit": "غذاء صحي/ غذاء غير صحي",
|
||||
"choresTodoText": "ترتيب الخزانة >> ترتيب الفوضى",
|
||||
"choresTodoNotes": "انقر لتحديد منطقة الفوضى!",
|
||||
"exerciseDailyNotes": "انقر لاختيار الجدول وتحديد التمارين!",
|
||||
"schoolTodoNotes": "انقر لتسمية الواجب المنزلي وتحديد وقت الانتهاء!",
|
||||
"creativityTodoNotes": "انقر لتسمية مشروعك",
|
||||
"selfCareTodoText": "شارك في فعالية ممتعة",
|
||||
"healthDailyText": "خيط الأسنان",
|
||||
"schoolDailyText": "إنهاء واجبات منزلية",
|
||||
"choresDailyText": "غسيل الصحون"
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
"forgotPassword": "هل نسيت كلمة المرور؟",
|
||||
"logout": "تسجيل الخروج",
|
||||
"footerMobile": "هاتف",
|
||||
"companyDonate": "تبرع",
|
||||
"companyDonate": "تبرع لصالح Habitica",
|
||||
"login": "تسجيل الدخول",
|
||||
"companyBlog": "مقالات",
|
||||
"communityInstagram": "Instagram",
|
||||
"guidanceForBlacksmiths": "إرشادات للحدادين (المبرمجين)",
|
||||
"companyContribute": "ساهم",
|
||||
"companyContribute": "ساهم في تطوير Habitica",
|
||||
"marketing1Header": "حسن عاداتك من خلال اللعب",
|
||||
"footerCompany": "الشركة",
|
||||
"companyAbout": "كيف يعمل",
|
||||
@@ -20,31 +20,165 @@
|
||||
"emailNewPass": "إرسال رابط إعادة تعيين كلمة المرور الى البريد الإلكتروني",
|
||||
"footerSocial": "منصات التواصل الاجتماعي",
|
||||
"free": "الإنضمام مجاناً",
|
||||
"marketing1Lead1": "Habitica هي لعبة تساعدك على تحسين عادات الحياة الواقعية. إنها \"تحاكي\" حياتك عن طريق تحويل كل مهامك (العادات ، الأعمال اليومية ، المهام) إلى وحوش صغيرة عليك التغلب عليها. كلما كنت أفضل في هذا ، كلما تقدمت في اللعبة. إذا تعثرت في الحياة ، تبدأ شخصيتك بالتراجع في اللعبة.",
|
||||
"marketing1Lead1": "Habitica هي لعبة تساعدك على تحسين عادات الحياة الواقعية. إنها \"تحاكي\" حياتك عن طريق تحويل كل مهامك (العادات، الأعمال اليومية، المهام) إلى وحوش صغيرة عليك التغلب عليها. كلما كنت أفضل في هذا، كلما تقدمت في اللعبة. إذا تعثرت في الحياة، تبدأ شخصيتك بالتراجع في اللعبة.",
|
||||
"termsAndAgreement": "بالنقر على الزر ادناه، فإنك تشير الى كونك قد قرأت ووافقت على <a href='/static/terms'>شروط الخدمة</a> و <a href='/static/privacy'>سياسة الخصوصية</a>.",
|
||||
"clearBrowserData": "حذف بيانات المتصفح",
|
||||
"communityExtensions": "<a href='https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>الإضافات</a>",
|
||||
"forgotPasswordSteps": "أدخل عنوان البريد الإلكتروني الذي استخدمته لتسجيل حسابك في Habitica.",
|
||||
"pkQuestion1": "ما الذي ألهم Habitica؟ كيف بدأ؟",
|
||||
"mobileAndroid": "Android",
|
||||
"communityExtensions": "الإضافات والتطويرات",
|
||||
"forgotPasswordSteps": "أدخل اسم المستخدم أو عنوان البريد الإلكتروني الخاص بك لتسجيل حسابك في Habitica.",
|
||||
"pkQuestion1": "ما الذي ألهم Habitica؟ كيف بدأت؟",
|
||||
"mobileAndroid": "تطبيق آندرويد",
|
||||
"playButton": "العب",
|
||||
"playButtonFull": "دخول Habitica",
|
||||
"password": "كلمة المرور",
|
||||
"newsArchive": "أرشيف الأخبار في ويكيا (متعدد اللغات)",
|
||||
"marketing4Lead3-1": "تريد تحويل حياتك الى لعبة؟",
|
||||
"marketing4Lead3-1": "هل تريد إدخال نظام اللعب لتطوير حياتك؟",
|
||||
"marketing2Lead3Title": "تحدوا بعضكم",
|
||||
"marketing2Lead2Title": "حارب الوحوش",
|
||||
"marketing4Lead3-2": "مهتم بإدارة مجموعة في التعليم، الصحة، وغير ذلك؟",
|
||||
"mobileIOS": "iOS",
|
||||
"mobileIOS": "تطبيق آيفون",
|
||||
"marketing1Lead1Title": "حياتك، لعبة تقمص الأدوار",
|
||||
"marketing3Header": "التطبيقات والإضافات",
|
||||
"marketing2Lead1Title": "الإنتاجية الاجتماعية",
|
||||
"marketing4Lead2": "تكاليف الرعاية الصحية في إزدياد، ويجب فعل شيء ما. تم إنشاء مئات البرامج لتقليل التكاليف وتحسين الصحة. نعتقد أن Habitica قادر على تمهيد طريق حقيقي نحو أنماط حياة صحية.",
|
||||
"marketing4Lead2": "تكاليف الرعاية الصحية في ازدياد، ويجب فعل شيء ما. تم إنشاء مئات البرامج لتقليل التكاليف وتحسين الصحة. نعتقد أن Habitica قادرة على تمهيد طريق حقيقي نحو أنماط حياة صحية.",
|
||||
"oldNews": "أخبار",
|
||||
"setNewPass": "تعيين كلمة مرور جديدة",
|
||||
"presskitText": "شكراً لاهتمامك ب Habitica! يمكن استخدام الصور التالية للمقالات أو مقاطع الفيديو حول Habitica. لمزيد من المعلومات، يرجى التواصل معنا على <٪ = pressEnquiryEmail٪>.",
|
||||
"presskitText": "شكراً لاهتمامك ب Habitica! يمكن استخدام الصور التالية للمقالات أو مقاطع الفيديو حول Habitica. لمزيد من المعلومات، يرجى التواصل معنا على <٪ = pressEnquiryEmail٪>.",
|
||||
"invalidEmail": "إجراء إعادة تعيين كلمة المرور يتطلب عنوان بريد الكتروني صالح.",
|
||||
"marketing1Lead2": "حسن عاداتك لبناء صورتك الرمزية، تباهى بالعتاد الذي كسبته!",
|
||||
"marketing2Lead2": "ما هي لعبة تقمص الأدوار من دون معارك؟ حارب الوحوش مع فريقك. الوحوش هي \"super accountability mode\" - اليوم الذي تتغيب فيه عن النادي الرياضي هو يوم يؤذي فيه الوحش * الجميع! *",
|
||||
"marketing3Lead1": "تتيح لك تطبيقات ** الايفون و الاندرويد ** الاعتناء بالأعمال أثناء التنقل. نحن ندرك أن تسجيل الدخول إلى موقع الويب للنقر على الأزرار يمكن أن يشكل عائق."
|
||||
"marketing2Lead2": "ما هي لعبة تقمص الأدوار من دون معارك؟ حارب الوحوش مع فريقك. الوحوش هي \"super accountability mode\" - اليوم الذي تتغيب فيه عن النادي الرياضي هو يوم يؤذي فيه الوحش *الجميع!*",
|
||||
"marketing3Lead1": "تتيح لك تطبيقات **الآيفون والآندرويد** الاعتناء بالأعمال أثناء التنقل. نحن ندرك أن تسجيل الدخول إلى موقع الويب والنقر على الأزرار يمكن أن يشكل عائقاً.",
|
||||
"chores": "الواجبات المنزلية",
|
||||
"footerProduct": "منتج",
|
||||
"marketing2Header": "تنافس مع الأصدقاء، وانضم إلى مجموعات من اهتماماتك",
|
||||
"presskit": "العدة الصحفية",
|
||||
"pkAnswer1": "إذا كنت قد استثمرت وقتاً في تحسين مستوى شخصية ما في لعبة ما، فمن الصعب ألا تتساءل عن مدى روعة حياتك إذا بذلت كل هذا الجهد لتحسين نفسك في الحياة الواقعية بدلاً من الصورة الرمزية الخاصة بك. بدأنا في بناء Habitica لمعالجة هذا السؤال. <br /> تم إطلاق Habitica رسمياً مع Kickstarter في عام 2013، وبدأت الفكرة حقاً. منذ ذلك الحين، نمت لتصبح مشروعاً ضخماً، مدعوماً من قبل متطوعينا الرائعين في دعم المصدر المفتوح ومستخدمينا الكرماء.",
|
||||
"pkAnswer3": "يعد الضغط الاجتماعي عاملاً محفزاً كبيراً لكثير من الناس، لذلك عرفنا أننا نريد أن يكون لدينا مجتمع قوي يحاسب بعضنا البعض على أهدافهم ويشجع نجاحاتهم. لحسن الحظ، فإن أحد الأشياء التي تقوم بها ألعاب الفيديو متعددة اللاعبين هو تعزيز الشعور بالانتماء للمجتمع بين مستخدميها! يستعير هيكل مجتمع Habitica من هذه الأنواع من الألعاب؛ يمكنك تكوين مجموعة صغيرة من الأصدقاء المقربين، ولكن يمكنك أيضاً الانضمام إلى مجموعات مصالح مشتركة أكبر تُعرف باسم النقابة. على الرغم من أن بعض المستخدمين يختارون اللعب منفردين، فإن معظمهم يقررون تشكيل شبكة دعم تشجع المساءلة الاجتماعية من خلال ميزات مثل المهام، حيث يقوم أعضاء الحزب بتجميع إنتاجيتهم لمحاربة الوحوش معاً.",
|
||||
"pkQuestion2": "لماذا تعمل Habitica؟",
|
||||
"marketing1Lead3Title": "ابحث عن جوائز عشوائية",
|
||||
"marketing3Lead2Title": "الإدراجات",
|
||||
"marketing2Lead3": "تتيح لك التحديات التنافس مع الأصدقاء والغرباء. كل من يفعل الأفضل في نهاية التحدي يفوز بجوائز خاصة.",
|
||||
"pkQuestion3": "لماذا أضفت ميزات اجتماعية؟",
|
||||
"marketing1Lead3": "بالنسبة للبعض، فإن المغامرة التي تحفزهم: نظام يسمى \"المكافآت العشوائية\". تستوعب Habitica جميع أنماط التشجيع والعقاب: الإيجابية والسلبية والمتوقعة والعشوائية.",
|
||||
"marketing2Lead1": "بينما يمكنك لعب Habitica منفرداً، فإن الأضواء تضيء حقاً عندما تبدأ في التعاون والمنافسة وتحميل بعضكم المسؤولية. الجزء الأكثر فعالية في أي برنامج لتحسين الذات هو تحمل المسؤولية الاجتماعية، وهل هناك بيئة للمساءلة والمنافسة أفضل من لعبة فيديو؟",
|
||||
"marketing3Lead2": "**أدوات الطرف الثالث الأخرى** تربط Habitica بجوانب مختلفة من حياتك. توفر واجهة برمجة التطبيقات الخاصة بنا تكاملاً سهلاً لأشياء مثل [Chrome Extension](https://chrome.google.com/webstore/detail/habitica/pidkmpibnnnhneohdgjclfdjpijggmjj?hl=en-US)، التي تفقدك نقاطاً عند تصفح مواقع الويب غير المنتجة، وتكسبك نقاطاً عندما تكون المواقع منتجة. [شاهد المزيد هنا](https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations).",
|
||||
"pkAnswer2": "إن تكوين عادة جديدة أمر صعب لأن الناس يحتاجون حقاً إلى تلك المكافأة الفورية الواضحة. على سبيل المثال، من الصعب البدء في تنظيف الأسنان بالخيط، لأنه على الرغم من أن طبيب الأسنان لدينا يخبرنا أنه أكثر صحة على المدى الطويل، إلا أنه في الوقت الحالي يتسبب في إصابة لثتك. <br /> يضيف أسلوب اللعب في Habitica إحساساً بالإشباع الفوري للأهداف اليومية من خلال مكافأة مهمة صعبة وإعطائك الخبرة، والذهب ... وربما حتى جائزة عشوائية، مثل بيضة التنين! يساعد هذا في الحفاظ على تحفيز الأشخاص حتى عندما لا يكون للمهمة نفسها مكافأة جوهرية، وقد رأينا أشخاصاً يغيرون حياتهم نتيجة لذلك. يمكنك التحقق من قصص النجاح هنا: https://habitversary.tumblr.com",
|
||||
"marketing1Lead2Title": "احصل على معدات رائعة",
|
||||
"enterHabitica": "ادخل Habitica",
|
||||
"pkQuestion6": "من هو مستخدم Habitica التقليدي؟",
|
||||
"pkQuestion8": "كيف أثرت Habitica على حياة الناس الحقيقية؟",
|
||||
"pkLogo": "شعارات",
|
||||
"register": "تسجيل",
|
||||
"teams": "مجموعات",
|
||||
"terms": "الأحكام والشروط",
|
||||
"reportAccountProblems": "الإبلاغ عن مشاكل الحساب",
|
||||
"subscriptionPaymentIssues": "قضايا الاشتراك والدفع",
|
||||
"generalQuestionsSite": "أسئلة عامة حول الموقع",
|
||||
"businessInquiries": "استفسارات الأعمال / التسويق",
|
||||
"merchandiseInquiries": "استفسارات عن البضائع المادية (قمصان، ملصقات)",
|
||||
"socialAlreadyExists": "تسجيل الدخول الاجتماعي هذا مرتبط بالفعل بحساب Habitica موجود.",
|
||||
"invalidReqParams": "معلمات الطلب غير صالحة.",
|
||||
"confirmPassword": "تأكيد كلمة المرور",
|
||||
"emailPlaceholder": "على سبيل المثال، gryphon@example.com",
|
||||
"emailUsernamePlaceholder": "على سبيل المثال، HabitRabbit أو gryphon@example.com",
|
||||
"passwordPlaceholder": "على سبيل المثال، ******************",
|
||||
"confirmPasswordPlaceholder": "تأكد من أنها نفس كلمة المرور!",
|
||||
"joinHabitica": "انضم إلى Habitica",
|
||||
"or": "أو",
|
||||
"gamifyYourLife": "حول حياتك إلى لعبة",
|
||||
"aboutHabitica": "Habitica هو تطبيق مجاني لبناء العادات والإنتاجية يتعامل مع حياتك الواقعية وكأنها لعبة. من خلال المكافآت والعقوبات داخل اللعبة لتحفيزك وشبكة اجتماعية قوية لإلهامك، يمكن أن تساعدك Habitica في تحقيق أهدافك لتصبح صحياً وتعمل بجد وسعادة.",
|
||||
"trackYourGoalsDesc": "كن مسؤولاً عن طريق تتبع وإدارة عاداتك وأهدافك اليومية وقائمة المهام مع تطبيقات الجوال سهلة الاستخدام وواجهة الويب من Habitica.",
|
||||
"battleMonstersDesc": "حارب الوحوش مع مستخدمي Habitica الآخرين! استخدم الذهب الذي تربحه لشراء مكافآت داخل اللعبة أو المكافآت الخاصة، مثل مشاهدة حلقة من برنامجك التلفزيوني المفضل.",
|
||||
"healthAndFitnessDesc": "ليس لديك الحافز لاستعمال خيط الأسنان؟ لا يبدو أنك تريد الذهاب إلى النادي الرياضي؟ Habitica تجعل أخيراً الحصول على صحة جيدة تحدياً ممتعاً.",
|
||||
"schoolAndWorkDesc": "سواء كنت تقوم بإعداد تقرير لمعلمك أو لرئيسك في العمل، فمن السهل تتبع تقدمك وأنت تتعامل مع أصعب مهامك.",
|
||||
"muchmuchMoreDesc": "تعني قائمة مهامنا القابلة للتخصيص بالكامل أنه يمكنك تشكيل Habitica لتناسب أهدافك الشخصية. اعمل على مشاريع إبداعية، أو ركز على الرعاية الذاتية، أو اسعى وراء حلم مختلف - الأمر كله متروك لك.",
|
||||
"levelUpAnywhereDesc": "تجعل تطبيقات الأجهزة المحمولة الخاصة بنا من السهل تتبع مهامك أثناء التنقل. حقق أهدافك بنقرة واحدة، بغض النظر عن مكانك.",
|
||||
"getStarted": "انطلق!",
|
||||
"marketing4Lead2Title": "نظام الصحة والراحة عن طريق اللعب",
|
||||
"marketing4Lead3Title": "أدخل نظام اللعب إلى كل شيء",
|
||||
"pkQuestion4": "لماذا تنقص الصحة الشخصية عند عدم إتمام المهام؟",
|
||||
"pkAnswer4": "إذا لم تؤدي أحد أهدافك اليومية، فستفقد بعضاً من صحة شخصيتك الرمزية. يعد هذا العامل التحفيزي مهماً جداً لتشجيع الناس على متابعة أهدافهم اليومية، لأن الناس يكرهون حقاً إيذاء صورتهم الرمزية الصغيرة! بالإضافة إلى ذلك، تعد المساءلة الاجتماعية أمراً بالغ الأهمية لكثير من الأشخاص: أي إذا كنت تقاتل وحشاً مع أصدقائك، فإن تخطي مهامك يضر بصحتهم الرمزية أيضاً.",
|
||||
"pkAnswer5": "إحدى الطرق التي نجحت بها Habitica في استخدام التحفيز هي أننا بذلنا الكثير من الجهد في التفكير في جوانب اللعبة للتأكد من أنها ممتعة بالفعل. لقد قمنا أيضاً بتضمين العديد من المكونات الاجتماعية، لأننا نشعر أن بعض الألعاب الأكثر تحفيزاً تتيح لك اللعب مع الأصدقاء، ولأن الأبحاث أظهرت أنه من الأسهل تكوين عادات عندما تكون لديك مسؤولية تجاه الآخرين.",
|
||||
"pkAnswer6": "يستخدم الكثير من الأشخاص المختلفين Habitica! أكثر من نصف مستخدمينا تتراوح أعمارهم بين 18 و 34 عاماً، لكن لدينا أجداد يستخدمون الموقع مع أحفادهم الصغار وفي كل الأعمار. غالباً ما تنضم العائلات إلى الحفلة وتقاتل الوحوش معاً. <br /> يتمتع العديد من مستخدمينا بمعرفة في الألعاب، ولكن من المدهش أنه عندما أجرينا استطلاعاً منذ فترة، تم تحديد 40٪ من مستخدمينا على أنهم ليسوا لاعبين! لذلك يبدو أن طريقتنا يمكن أن تكون فعالة لأي شخص يريد أن يشعر بالإنتاجية والعافية ليشعر بمزيد من المرح.",
|
||||
"pkAnswer7": "تستخدم Habitica فن البكسل لعدة أسباب، بالإضافة إلى عامل الحنين الممتع، فإن فن البكسل سهل للغاية بالنسبة لفنانينا المتطوعين الذين يرغبون في المشاركة. من الأسهل كثيراً الحفاظ على اتساق فن البكسل حتى عندما يساهم الكثير من الفنانين المختلفين، ويتيح لنا إنشاء الكثير من الأعمال الجديدة بسرعة وزيادة المحتوى!",
|
||||
"localStorageTryFirst": "إذا كنت تواجه مشكلات في Habitica ، فانقر فوق الزر أدناه لمسح التخزين المحلي ومعظم ملفات تعريف الارتباط لهذا الموقع (لن تتأثر مواقع الويب الأخرى). ستحتاج إلى تسجيل الدخول مرة أخرى بعد ذلك، لذا تأكد أولاً من أنك تعرف معلومات تسجيل الدخول الخاصة بك من اسم مستخدم وكلمة سر. يمكن العثور عليها في الإعدادات -> <%= linkStart %>Site<%= linkEnd %>.",
|
||||
"missingUsernameEmail": "اسم المستخدم أو البريد الإلكتروني مفقود.",
|
||||
"emailTaken": "عنوان البريد الإلكتروني مستخدم بالفعل في الحساب.",
|
||||
"usernameInfo": "أصبحت الآن أسماء تسجيل دخول المستخدمين فريدة ستظهر بجانب اسم العرض الخاص بك وتستخدم للدعوات وإشارات @ للدردشة والمراسلة.<br> <br> إذا كنت ترغب في معرفة المزيد حول هذا التغيير، <a href='https://habitica.fandom.com/wiki/Player_Names' target='_blank'>قم بزيارة موقع wiki الخاص بنا</a>.",
|
||||
"passwordConfirmationMatch": "تأكيد كلمة المرور لا يتطابق مع كلمة المرور.",
|
||||
"invalidLoginCredentialsLong": "عذراً، عنوان بريدك الإلكتروني / اسم المستخدم أو كلمة المرور غير صحيحين.\n- تأكد من كتابتها بشكل صحيح. اسم المستخدم وكلمة المرور حساسان لحالة الأحرف الكبيرة والصغيرة.\n- ربما تكون قد اشتركت في حساب Facebook أو Google، وليس عبر البريد الإلكتروني، لذا تحقق جيداً من خلال تجربتها.\n- إذا نسيت كلمة المرور الخاصة بك، انقر فوق \"نسيت كلمة المرور\".",
|
||||
"alreadyHaveAccountLogin": "لديك بالفعل حساب Habitica؟ <strong> تسجيل الدخول </strong>",
|
||||
"earnRewardsDesc": "أنجز المهام لترفع مستوى شخصيتك الرمزية الخاصة بك وفتح الميزات داخل اللعبة مثل درع المعركة والحيوانات الأليفة الغامضة والمهارات السحرية وحتى المهام!",
|
||||
"featuredIn": "أعلن عنها في",
|
||||
"usernameTOSRequirements": "يجب أن تتوافق أسماء المستخدمين مع <a href='/static/terms' target='_blank'> شروط الخدمة </a> و <a href='/static/community-guidelines' target='_blank'> إرشادات المجتمع < / أ>. إذا لم تكن قد قمت بتعيين اسم تسجيل دخول من قبل، فسيتم إنشاء اسم المستخدم تلقائياً.",
|
||||
"accountSuspended": "تم حظر هذا الحساب، للمستخدم \"<%= userId %>\"، لخرقه إرشادات المجتمع (https://habitica.com/static/community-guidelines) أو شروط الخدمة (https://habitica.com/static/community-guidelines). للحصول على تفاصيل أو لطلب إلغاء الحظر، يرجى إرسال بريد إلكتروني إلى مدير المجتمع لدينا على <%= communityManagerEmail %> أو اطلب من والديك أو الوصي عليك إرسال بريد إلكتروني إليهم. الرجاء تضمين اسم المستخدم @ في البريد الإلكتروني.",
|
||||
"cannotFulfillReq": "لا يمكن تلبية طلبك. أرسل بريداً إلكترونياً إلى admin@habitica.com إذا استمر هذا الخطأ.",
|
||||
"pkAnswer8": "يمكنك العثور على الكثير من الشهادات حول كيفية مساعدة Habitica للأشخاص هنا: https://habitversary.tumblr.com",
|
||||
"sync": "تحديث",
|
||||
"tumblr": "تمبلر Tumblr",
|
||||
"emailOrUsername": "البريد الإلكتروني أو اسم المستخدم (مع الانتباه للأحرف الكبيرة والصغيرة)",
|
||||
"missingUsername": "اسم المستخدم مفقود.",
|
||||
"wrongPassword": "كلمة مرور خاطئة.",
|
||||
"incorrectDeletePhrase": "يرجى كتابة <%= magicWord %> بأحرف كبيرة لحذف حسابك.",
|
||||
"newEmailRequired": "عنوان البريد الإلكتروني الجديد مفقود.",
|
||||
"accountSuspendedTitle": "تم تعليق حسابك",
|
||||
"unsupportedNetwork": "هذه الشبكة غير مدعومة حالياً.",
|
||||
"onlySocialAttachLocal": "يمكن إضافة المصادقة المحلية إلى تسجيل دخول حساب اجتماعي فقط.",
|
||||
"loginWithSocial": "قم بالدخول عن طريق <%= social %>",
|
||||
"usernamePlaceholder": "على سبيل المثال، HabitRabbit",
|
||||
"motivateYourself": "حفز نفسك لتحقيق أهدافك.",
|
||||
"timeToGetThingsDone": "حان الوقت للاستمتاع عندما تنجز الأشياء! انضم إلى أكثر من <%= userCountInMillions %> مليون مواطن وحسن حياتك مهمة واحدة في كل مرة.",
|
||||
"earnRewards": "اكسب مكافآت مقابل تحقيق أهدافك",
|
||||
"playersUseToImprove": "يستخدم اللاعبون Habitica للترقي",
|
||||
"healthAndFitness": "الصحة واللياقة",
|
||||
"muchmuchMore": "والكثير الكثير!",
|
||||
"joinMany": "انضم إلى أكثر من <%= userCountInMillions %> مليون شخص يستمتعون خلال تحقيق أهدافهم!",
|
||||
"work": "العمل",
|
||||
"levelUpAnywhere": "تقدم في المستوى من أي مكان",
|
||||
"learnMore": "تعلم أكثر",
|
||||
"usernameTaken": "اسم المستخدم غير متاح.",
|
||||
"pkBoss": "وحوش",
|
||||
"username": "اسم المستخدم",
|
||||
"trackYourGoals": "تتبع عاداتك وأهدافك",
|
||||
"notAnEmail": "عنوان البريد الإلكتروني غير صالح.",
|
||||
"missingEmail": "البريد الإلكتروني مفقود.",
|
||||
"dontHaveAccountSignup": "ليس لديك حساب Habitica؟ <strong> إنشاء حساب </strong>",
|
||||
"pkQuestion7": "لماذا تستخدم Habitica فن البكسل؟",
|
||||
"tasks": "المهام",
|
||||
"localStorageTryNext": "إذا استمرت المشكلة، يرجى <%= linkStart %>الإبلاغ عن الخطأ<%= linkEnd %> إذا لم تكن قد قمت ذلك.",
|
||||
"pkMoreQuestions": "هل لديك سؤال غير موجود في هذه القائمة؟ أرسل بريد إلكتروني إلى admin@habitica.com!",
|
||||
"mobileApps": "تطبيقات الموبايل",
|
||||
"localStorageClearExplanation": "سيؤدي هذا الزر إلى مسح التخزين المحلي ومعظم ملفات تعريف الارتباط وتسجيل خروجك.",
|
||||
"marketing4Header": "لاستخدام المنظمات",
|
||||
"pkQuestion5": "ما الذي يميز Habitica عن برامج التلعيب (إضافة نظام اللعب) الأخرى؟",
|
||||
"marketing4Lead1": "التعليم هو أحد أفضل القطاعات لتطبيق نظام اللعب. نعلم جميعاً مدى تعلق الطلاب بالهواتف والألعاب هذه الأيام؛ نعم لتسخير تلك القوة! إن كنت معلماً؛ حرض طلابك ضد بعضهم البعض في منافسة ودية، وكافئ السلوك الجيد بجوائز نادرة، تشاهد درجاتهم وسلوكهم يرتفع.",
|
||||
"usernameTime": "حان الوقت لتعيين اسم المستخدم الخاص بك!",
|
||||
"missingPassword": "كلمة المرور مفقودة.",
|
||||
"joinToday": "انضم إلى Habitica اليوم",
|
||||
"marketing4Lead1Title": "نظام التعليم عن طريق اللعب",
|
||||
"memberIdRequired": "\"member\" يجب أن يكون معرف UUID صالحاً.",
|
||||
"modelNotFound": "هذا النموذج غير موجود.",
|
||||
"signUpWithSocial": "قم بالتسجيل عن طريق <%= social %>",
|
||||
"pkSamples": "عينات لقطات شاشة",
|
||||
"pkWebsite": "موقع",
|
||||
"schoolAndWork": "الدراسة والعمل",
|
||||
"invalidEmailDomain": "لا يمكنك تسجيل البريد الإلكتروني من المخدمات التالية: <%= domains %>",
|
||||
"missingNewPassword": "كلمة المرور الجديدة مفقودة.",
|
||||
"heroIdRequired": "\"heroId\" يجب أن يكون معرف UUID صالحاً.",
|
||||
"signup": "اشتراك",
|
||||
"minPasswordLength": "يجب أن تتكون كلمة المرور من 8 أحرف أو أكثر.",
|
||||
"singUpForFree": "سجل مجاناً",
|
||||
"localStorageClear": "مسح البيانات المحلية",
|
||||
"pkPromo": "إجراءات",
|
||||
"tweet": "تغريد",
|
||||
"privacy": "سياسة الخصوصية",
|
||||
"reportCommunityIssues": "الإبلاغ عن مشاكل المجتمع",
|
||||
"checkOutMobileApps": "جرب تطبيقات الجوال!",
|
||||
"school": "المدرسة",
|
||||
"missingAuthHeaders": "سلاسل المصادقة مفقودة.",
|
||||
"passwordReset": "إذا كان لدينا بريدك الإلكتروني أو اسم المستخدم الخاصين بك في الملف، فقد تم إرسال تعليمات تعيين كلمة مرور جديدة إلى بريدك الإلكتروني.",
|
||||
"invalidCredentials": "لا يوجد حساب يستخدم بيانات الاعتماد هذه.",
|
||||
"cantDetachSocial": "يفتقر الحساب إلى طريقة مصادقة أخرى؛ لا يمكن فصل طريقة المصادقة هذه.",
|
||||
"usernameLimitations": "يجب أن يكون اسم المستخدم من 1 إلى 20 حرفاً، ويحتوي فقط على الأحرف، والأرقام من 0 إلى 9، والواصلات، أو الشرطات السفلية، ولا يمكن أن يتضمن أي مصطلحات غير ملائمة.",
|
||||
"battleMonsters": "حارب الوحوش مع الأصدقاء",
|
||||
"passwordResetPage": "إعادة تعيين كلمة المرور"
|
||||
}
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
{
|
||||
"languageName": "العربية",
|
||||
"stringNotFound": "سلسلة المحارف '<%= string %>' لم توجد.",
|
||||
"stringNotFound": "سلسلة المحارف '<%= string %>' غير موجودة.",
|
||||
"habitica": "Habitica",
|
||||
"onward": "إلي الأمام!",
|
||||
"done": "Done",
|
||||
"gotIt": "Got it!",
|
||||
"onward": "إلى الأمام!",
|
||||
"done": "انتهى",
|
||||
"gotIt": "فهمت!",
|
||||
"titleTimeTravelers": "مسافرين عبر الزمن",
|
||||
"titleSeasonalShop": "المتجر الموسمي",
|
||||
"saveEdits": "Save Edits",
|
||||
"showMore": "Show More",
|
||||
"showLess": "Show Less",
|
||||
"markdownHelpLink": "Markdown formatting help",
|
||||
"bold": "**Bold**",
|
||||
"saveEdits": "حفظ التغييرات",
|
||||
"showMore": "إظهار المزيد",
|
||||
"showLess": "عرض أقل",
|
||||
"markdownHelpLink": "تعليمات تنسيق لغة Markdown",
|
||||
"bold": "**سميك**",
|
||||
"markdownImageEx": "",
|
||||
"code": "`code`",
|
||||
"achievements": "الإنجازات",
|
||||
"basicAchievs": "Basic Achievements",
|
||||
"seasonalAchievs": "Seasonal Achievements",
|
||||
"specialAchievs": "Special Achievements",
|
||||
"basicAchievs": "الإنجازات الأساسية",
|
||||
"seasonalAchievs": "الإنجازات الموسمية",
|
||||
"specialAchievs": "الإنجازات الخاصة",
|
||||
"modalAchievement": "إنجاز!",
|
||||
"special": "خاص",
|
||||
"site": "الموقع",
|
||||
"help": "مساعدة",
|
||||
"user": "المستخدم",
|
||||
"market": "المتجر",
|
||||
"newSubscriberItem": "You have new <span class=\"notification-bold-blue\">Mystery Items</span>",
|
||||
"newSubscriberItem": "لديك <span class=\"notification-bold-blue\"> عناصر غامضة جديدة </span>",
|
||||
"subscriberItemText": "كل شهر يحصل المشتركون على غرض غامض. عادةً يصبح متاحا في بداية الشهر. راجع صفحة الويكي \"الغرض الغامض\" للمزيد من المعلومات.",
|
||||
"all": "الجميع",
|
||||
"none": "لا شيء",
|
||||
"more": "<%= count %> more",
|
||||
"more": "<%= count %> أكثر",
|
||||
"and": "و",
|
||||
"submit": "إرسال",
|
||||
"close": "إغلاق",
|
||||
"saveAndClose": "حفظ وإغلاق",
|
||||
"saveAndConfirm": "Save & Confirm",
|
||||
"saveAndConfirm": "حفظ & تأكيد",
|
||||
"cancel": "إلغاء",
|
||||
"ok": "حسناً",
|
||||
"add": "إضافة",
|
||||
@@ -47,29 +47,29 @@
|
||||
"delete": "حذف",
|
||||
"gemsPopoverTitle": "جواهر",
|
||||
"gems": "الجواهر",
|
||||
"needMoreGems": "Need More Gems?",
|
||||
"needMoreGemsInfo": "Purchase Gems now, or become a subscriber to buy Gems with Gold, get monthly mystery items, enjoy increased drop caps and more!",
|
||||
"needMoreGems": "تحتاج المزيد من الأحجار الكريمة؟",
|
||||
"needMoreGemsInfo": "قم بشراء الأحجار الكريمة الآن، أو اشترك لتكون قادراً على شراء الأحجار الكريمة بالذهب، واحصل على عناصر غامضة شهرياً، واستمتع بالتميز والجوائز المتزايدة والمزيد!",
|
||||
"veteran": "متمرس",
|
||||
"veteranText": "نجا من \"العادة الرمادية\" (موقعنا السابق)، وحصل على العديد من ندب المعارك من أخطائه.",
|
||||
"originalUser": "مستخدم أصلي!",
|
||||
"originalUserText": "واحد من المتبنين <em>الأوائل</em>. نتكلم عن مجرب منذ البداية!",
|
||||
"habitBirthday": "حفلة يوم ميلاد Habitica",
|
||||
"habitBirthdayText": "احتفل بيوم ميلاد Habitica!",
|
||||
"habitBirthdayPluralText": "Celebrated <%= count %> Habitica Birthday Bashes!",
|
||||
"habitBirthdayPluralText": "احتفل <%= count %> أيام ميلاد Habitica!",
|
||||
"habiticaDay": "يوم تسمية Habitica",
|
||||
"habiticaDaySingularText": "احتفل بيوم تسمية Habitica! شكراً لكونك مستخدماً رائعاً.",
|
||||
"habiticaDayPluralText": "Celebrated <%= count %> Naming Days! Thanks for being a fantastic user.",
|
||||
"habiticaDayPluralText": "احتفل <%= count %> بأيام تسمية Habitica! شكراً لكونك مستخدماً رائعاً.",
|
||||
"achievementDilatory": "المنقذ من المماطلة",
|
||||
"achievementDilatoryText": "ساعد على هزيمة تنين المماطلة المروع خلال احتفال صيف 2014!",
|
||||
"costumeContest": "متسابق الأزياء التنكرية",
|
||||
"costumeContestText": "Participated in the Habitoween Costume Contest. See some of the awesome entries at blog.habitrpg.com!",
|
||||
"costumeContestTextPlural": "Participated in <%= count %> Habitoween Costume Contests. See some of the awesome entries at blog.habitrpg.com!",
|
||||
"newPassSent": "If we have your email on file, instructions for setting a new password have been sent to your email.",
|
||||
"costumeContestText": "شارك في مسابقة أزياء الهالوين. شاهد بعض الأفكار الرائعة على blog.habitrpg.com!",
|
||||
"costumeContestTextPlural": "شارك في <%= count %> مسابقات أزياء الهالوين. شاهد بعض الأفكار الرائعة على blog.habitrpg.com!",
|
||||
"newPassSent": "إذا كان لدينا بريدك الإلكتروني في الملف، فقد تم إرسال تعليمات تعيين كلمة مرور جديدة إلى بريدك الإلكتروني.",
|
||||
"error": "خطأ",
|
||||
"menu": "القائمة",
|
||||
"notifications": "الإشعارات",
|
||||
"noNotifications": "You're all caught up!",
|
||||
"noNotificationsText": "The notification fairies give you a raucous round of applause! Well done!",
|
||||
"noNotifications": "لديك آخر التحديثات!",
|
||||
"noNotificationsText": "تمنحك جنيات الإشعارات جولة من التصفيق الصاخب! أحسنت!",
|
||||
"clear": "إزالة",
|
||||
"audioTheme": "سمة الصوت",
|
||||
"audioTheme_off": "تعطيل",
|
||||
@@ -77,17 +77,17 @@
|
||||
"audioTheme_wattsTheme": "سمة واتس",
|
||||
"audioTheme_gokulTheme": "سمة غوكل",
|
||||
"audioTheme_luneFoxTheme": "سمة لونفوكس",
|
||||
"audioTheme_rosstavoTheme": "Rosstavo's Theme",
|
||||
"audioTheme_dewinTheme": "Dewin's Theme",
|
||||
"audioTheme_airuTheme": "Airu's Theme",
|
||||
"audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme",
|
||||
"audioTheme_arashiTheme": "Arashi's Theme",
|
||||
"audioTheme_triumphTheme": "Triumph Theme",
|
||||
"audioTheme_lunasolTheme": "Lunasol Theme",
|
||||
"audioTheme_spacePenguinTheme": "SpacePenguin's Theme",
|
||||
"audioTheme_maflTheme": "MAFL Theme",
|
||||
"audioTheme_pizildenTheme": "Pizilden's Theme",
|
||||
"audioTheme_farvoidTheme": "Farvoid Theme",
|
||||
"audioTheme_rosstavoTheme": "سمة روسستافو",
|
||||
"audioTheme_dewinTheme": "سمة ديوين",
|
||||
"audioTheme_airuTheme": "سمة آيرو",
|
||||
"audioTheme_beatscribeNesTheme": "سمة بيتسكرايب NES",
|
||||
"audioTheme_arashiTheme": "سمة أراشي",
|
||||
"audioTheme_triumphTheme": "سمة الانتصار الساحق",
|
||||
"audioTheme_lunasolTheme": "سمة لوناسول",
|
||||
"audioTheme_spacePenguinTheme": "سمة بطريق الفضاء",
|
||||
"audioTheme_maflTheme": "سمة مافل",
|
||||
"audioTheme_pizildenTheme": "سمة بيزيلدن",
|
||||
"audioTheme_farvoidTheme": "سمة فارفويد",
|
||||
"reportBug": "بلّغ عن خطأ",
|
||||
"overview": "لمحة عامة للمستخدمين الجدد",
|
||||
"dateFormat": "صيغة التاريخ",
|
||||
@@ -95,110 +95,110 @@
|
||||
"achievementStressbeastText": "ساعد على هزيمة وحش التوتر الفظيع خلال احتفال شتاء 2014!",
|
||||
"achievementBurnout": "المنقذ من الحقول المزدهرة",
|
||||
"achievementBurnoutText": "ساعد على هزيمة احتراقي واستعادة أشباح العادم خلال احتفال خريف 2015!",
|
||||
"achievementBewilder": "Savior of Mistiflying",
|
||||
"achievementBewilderText": "Helped defeat the Be-Wilder during the 2016 Spring Fling Event!",
|
||||
"achievementDysheartener": "Savior of the Shattered",
|
||||
"achievementDysheartenerText": "Helped defeat the Dysheartener during the 2018 Valentine's Event!",
|
||||
"cards": "Cards",
|
||||
"sentCardToUser": "You sent a card to <%= profileName %>",
|
||||
"cardReceived": "You received a <span class=\"notification-bold-blue\"><%= card %></span>",
|
||||
"achievementBewilder": "المنقذ من الخطأ",
|
||||
"achievementBewilderText": "ساعد في هزيمة Be-Wilder خلال حدث Spring Fling لعام 2016!",
|
||||
"achievementDysheartener": "منقذ المحطمين",
|
||||
"achievementDysheartenerText": "ساعد في هزيمة Dysheartener خلال حدث عيد الحب 2018!",
|
||||
"cards": "البطاقات",
|
||||
"sentCardToUser": "لقد أرسلت بطاقة إلى <%= profileName %>",
|
||||
"cardReceived": "لقد وصلتك <span class=\"notification-bold-blue\"><%= card %></span>",
|
||||
"greetingCard": "بطاقة معايدة",
|
||||
"greetingCardExplanation": "كلاكما ستحصلان على إنجاز الصاحب المبتهج!",
|
||||
"greetingCardNotes": "أرسل بطاقة تحية لعضو بالفريق.",
|
||||
"greeting0": "مرحباً!",
|
||||
"greeting1": "فقط أحببت أن أقول مرحباً :)",
|
||||
"greeting2": "`waves frantically`",
|
||||
"greeting2": "`موجات حميمية`",
|
||||
"greeting3": "مرحباً يا!",
|
||||
"greetingCardAchievementTitle": "الصاحب المبتهج",
|
||||
"greetingCardAchievementText": "Hey! Hi! Hello! Sent or received <%= count %> greeting cards.",
|
||||
"greetingCardAchievementText": "مرحباً! لقد أرسلت أو استلمت <%= count %> بطاقة تحية.",
|
||||
"thankyouCard": "بطاقة شكر",
|
||||
"thankyouCardExplanation": "كلاكما ستحصلان على إنجاز الممتن كثيراً!",
|
||||
"thankyouCardNotes": "أرسل بطاقة شكر لعضو فريق.",
|
||||
"thankyou0": "شكراً جزيلاً لك!",
|
||||
"thankyou1": "شكراً، شكراً، شكراً!",
|
||||
"thankyou1": "شكراً جزيلاً، شكراً!",
|
||||
"thankyou2": "أرسل لك ألف شكر.",
|
||||
"thankyou3": "أنا ممتن كثيراً، شكراً لك!",
|
||||
"thankyouCardAchievementTitle": "ممتن لك بشدة",
|
||||
"thankyouCardAchievementText": "Thanks for being thankful! Sent or received <%= count %> Thank-You cards.",
|
||||
"thankyouCardAchievementText": "شكراً لكونك ممتناً! لقد أرسلت أو استلمت <%= count %> رسالة شكر.",
|
||||
"birthdayCard": "بطاقة تهنئة بيوم الميلاد",
|
||||
"birthdayCardExplanation": "كلاكما تحصلان على إنجاز يوم الميلاد المليء بالحظ!",
|
||||
"birthdayCardNotes": "أرسل بطاقة تهنة يوم الميلاد لأحد أعضاء فريقك.",
|
||||
"birthday0": "يوم ميلاد سعيد!",
|
||||
"birthdayCardAchievementTitle": "يوم ميلاد مليء بالحظ",
|
||||
"birthdayCardAchievementText": "Many happy returns! Sent or received <%= count %> birthday cards.",
|
||||
"congratsCard": "Congratulations Card",
|
||||
"congratsCardExplanation": "You both receive the Congratulatory Companion achievement!",
|
||||
"congratsCardNotes": "Send a Congratulations card to a party member.",
|
||||
"congrats0": "Congratulations on your success!",
|
||||
"congrats1": "I'm so proud of you!",
|
||||
"congrats2": "Well done!",
|
||||
"congrats3": "A round of applause for you!",
|
||||
"congrats4": "Bask in your well-deserved success!",
|
||||
"congratsCardAchievementTitle": "Congratulatory Companion",
|
||||
"congratsCardAchievementText": "It's great to celebrate your friends' achievements! Sent or received <%= count %> congratulations cards.",
|
||||
"getwellCard": "Get Well Card",
|
||||
"getwellCardExplanation": "You both receive the Caring Confidant achievement!",
|
||||
"getwellCardNotes": "Send a Get Well card to a party member.",
|
||||
"getwell0": "Hope you feel better soon!",
|
||||
"getwell1": "Take care! <3",
|
||||
"getwell2": "You're in my thoughts!",
|
||||
"getwell3": "Sorry you're not feeling your best!",
|
||||
"getwellCardAchievementTitle": "Caring Confidant",
|
||||
"getwellCardAchievementText": "Well-wishes are always appreciated. Sent or received <%= count %> get well cards.",
|
||||
"goodluckCard": "Good Luck Card",
|
||||
"goodluckCardExplanation": "You both receive the Lucky Letter achievement!",
|
||||
"goodluckCardNotes": "Send a good luck card to a party member.",
|
||||
"goodluck0": "May luck always follow you!",
|
||||
"goodluck1": "Wishing you lots of luck!",
|
||||
"goodluck2": "I hope luck is on your side today and always!!",
|
||||
"goodluckCardAchievementTitle": "Lucky Letter",
|
||||
"goodluckCardAchievementText": "Wishes for good luck are great encouragement! Sent or received <%= count %> good luck cards.",
|
||||
"streakAchievement": "You earned a streak achievement!",
|
||||
"firstStreakAchievement": "21-Day Streak",
|
||||
"streakAchievementCount": "<%= streaks %> 21-Day Streaks",
|
||||
"twentyOneDays": "You've completed your Daily for 21 days in a row!",
|
||||
"dontBreakStreak": "Amazing job. Don't break the streak!",
|
||||
"birthdayCardAchievementText": "العديد من عوائد سعيدة! لقد أرسلت أو استلمت <%= count %> بطاقة عيد ميلاد سعيد.",
|
||||
"congratsCard": "بطاقة تهنئة",
|
||||
"congratsCardExplanation": "كلاكما تلقى إنجاز الرفيق المهنئ!",
|
||||
"congratsCardNotes": "أرسل بطاقة تهنئة لعضو الفريق.",
|
||||
"congrats0": "مبارك نجاحك!",
|
||||
"congrats1": "أنا فخور جداً بك!",
|
||||
"congrats2": "أحسنت!",
|
||||
"congrats3": "جولة من التصفيق لك!",
|
||||
"congrats4": "تشرق في نجاحك الذي تستحقه!",
|
||||
"congratsCardAchievementTitle": "الرفيق المهنئ",
|
||||
"congratsCardAchievementText": "إنه لأمر رائع أن تحتفل بإنجازات أصدقائك! لقد أرسلت أو استلمت <%= count %> بطاقة تهنئة.",
|
||||
"getwellCard": "بطاقة التعافي والشفاء العاجل",
|
||||
"getwellCardExplanation": "كلاكما حصل على إنجاز رعاية المقرب!",
|
||||
"getwellCardNotes": "أرسل بطاقة تمنيات بالشفاء العاجل إلى أحد أعضاء الفريق.",
|
||||
"getwell0": "أتمنى أن تشعر بتحسن عما قريب!",
|
||||
"getwell1": "اعتن بنفسك! <3",
|
||||
"getwell2": "أنت في أفكاري!",
|
||||
"getwell3": "آسف لأنك لست في أفضل حالاتك!",
|
||||
"getwellCardAchievementTitle": "رعاية المقرب",
|
||||
"getwellCardAchievementText": "إنه لموضع تقدير، التمنيات الطيبة. لقد أرسلت أو استلمت <%= count %> بطاقة تمنيات طيبة.",
|
||||
"goodluckCard": "بطاقة حظ سعيد",
|
||||
"goodluckCardExplanation": "كلاكما تلقيت إنجاز البريد المحظوظ!",
|
||||
"goodluckCardNotes": "أرسل بطاقة حظ سعيد إلى أحد أعضاء الفريق.",
|
||||
"goodluck0": "فليتبعك الحظ دائماً!",
|
||||
"goodluck1": "أتمنى لك الكثير من الحظ!",
|
||||
"goodluck2": "أتمنى أن يكون الحظ بجانبك اليوم ودائماً !!",
|
||||
"goodluckCardAchievementTitle": "البريد المحظوظ",
|
||||
"goodluckCardAchievementText": "التمنيات بالتوفيق هي تشجيع كبير! لقد أرسلت أو استلمت <%= count %> بطاقة حظ سعيد.",
|
||||
"streakAchievement": "لقد ربحت إنجازاً متتالياً!",
|
||||
"firstStreakAchievement": "ضربة 21-يوماً",
|
||||
"streakAchievementCount": "<%= streaks %> ضربة 21-يوماً",
|
||||
"twentyOneDays": "لقد أكملت برنامجك اليومي لمدة 21 يوماً على التوالي!",
|
||||
"dontBreakStreak": "عمل مبهر. لا تكسر الضربة المتتالية!",
|
||||
"dontStop": "لا تتوقف الآن!",
|
||||
"wonChallengeShare": "فزت بتحد في Habitica!",
|
||||
"orderBy": "Order By <%= item %>",
|
||||
"you": "(you)",
|
||||
"loading": "Loading...",
|
||||
"userIdRequired": "User ID is required",
|
||||
"resetFilters": "Clear all filters",
|
||||
"applyFilters": "Apply Filters",
|
||||
"wantToWorkOn": "I want to work on:",
|
||||
"categories": "Categories",
|
||||
"animals": "Animals",
|
||||
"exercise": "Exercise",
|
||||
"creativity": "Creativity",
|
||||
"health_wellness": "Health & Wellness",
|
||||
"self_care": "Self-Care",
|
||||
"habitica_official": "Habitica Official",
|
||||
"academics": "Academics",
|
||||
"advocacy_causes": "Advocacy + Causes",
|
||||
"entertainment": "Entertainment",
|
||||
"finance": "Finance",
|
||||
"orderBy": "ترتيب حسب <%= item %>",
|
||||
"you": "(أنت)",
|
||||
"loading": "تحميل...",
|
||||
"userIdRequired": "مطلوب ID المستخدم (User ID)",
|
||||
"resetFilters": "امسح كل عوامل التصفية",
|
||||
"applyFilters": "تطبيق عوامل التصفية",
|
||||
"wantToWorkOn": "أريد العمل على:",
|
||||
"categories": "الفئات",
|
||||
"animals": "الحيوانات",
|
||||
"exercise": "التمرين",
|
||||
"creativity": "الإِبداع",
|
||||
"health_wellness": "الصحة & الراحة",
|
||||
"self_care": "العناية بالنفس",
|
||||
"habitica_official": "Habitica رسمي",
|
||||
"academics": "أكاديمي",
|
||||
"advocacy_causes": "تطوع + مجتمعات الاهتمام",
|
||||
"entertainment": "وسائل الترفيه",
|
||||
"finance": "الموارد المالية",
|
||||
"health_fitness": "الصحة واللياقة البدنية",
|
||||
"hobbies_occupations": "الهوايات والمهن",
|
||||
"location_based": "Location-based",
|
||||
"location_based": "معتمد على الموقع",
|
||||
"mental_health": "الصحة العقلية + العناية الذاتية",
|
||||
"getting_organized": "Getting Organized",
|
||||
"self_improvement": "Self-Improvement",
|
||||
"spirituality": "Spirituality",
|
||||
"time_management": "Time-Management + Accountability",
|
||||
"recovery_support_groups": "Recovery + Support Groups",
|
||||
"dismissAll": "Dismiss All",
|
||||
"messages": "Messages",
|
||||
"emptyMessagesLine1": "You don't have any messages",
|
||||
"getting_organized": "أن تصبح أكثر تنظيماً",
|
||||
"self_improvement": "تطوير الذات",
|
||||
"spirituality": "الروحانية",
|
||||
"time_management": "إدارة الوقت + المسؤولية",
|
||||
"recovery_support_groups": "مجموعات التجديد + الدعم",
|
||||
"dismissAll": "امسح الكل",
|
||||
"messages": "الرسائل",
|
||||
"emptyMessagesLine1": "ليس لديك أية رسائل",
|
||||
"emptyMessagesLine2": "يمكنك إرسال رسالة جديدة إلى مستخدم من خلال زيارة ملفه الشخصي والنقر على زر \"رسالة\".",
|
||||
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> sent you a message",
|
||||
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> أرسل لك رسالة",
|
||||
"letsgo": "لنذهب!",
|
||||
"selected": "Selected",
|
||||
"howManyToBuy": "How many would you like to buy?",
|
||||
"contactForm": "Contact the Moderation Team",
|
||||
"selected": "محدد",
|
||||
"howManyToBuy": "كم تريد أن تشتري؟",
|
||||
"contactForm": "تواصل مع فريق الإشراف",
|
||||
"congratulations": "تهانينا!",
|
||||
"finish": "نهاية",
|
||||
"onboardingAchievs": "إنجازات الإعداد",
|
||||
"onboardingAchievs": "الإنجازات الترحيبية",
|
||||
"reportBugHeaderDescribe": "يُرجى وصف الخطأ الذي تواجهه وسيتواصل معك فريقنا.",
|
||||
"reportEmailText": "سيتم استخدام هذا فقط للاتصال بك بخصوص تقرير الخطأ.",
|
||||
"reportEmailPlaceholder": "عنوان بريدك الإلكتروني",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"noItemsAvailableForType": "لا يوجد لديك <%= type %>",
|
||||
"noItemsAvailableForType": "لا يوجد لديك <%= type %>.",
|
||||
"foodItemType": "طعام الحيوانات الأليفة",
|
||||
"eggsItemType": "بيض",
|
||||
"hatchingPotionsItemType": "جرعات الفقس",
|
||||
"specialItemType": "حاجات خاصة",
|
||||
"lockedItem": "حاجة مقفلة",
|
||||
"hatchingPotionsItemType": "جرعات التلقيح",
|
||||
"specialItemType": "عناصر خاصة",
|
||||
"lockedItem": "عنصر مقفل",
|
||||
"petAndMount": "حيوان أليف وحيوان للركوب",
|
||||
"allItems": "كل العناصر"
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"unlockedReward": "You have received <%= reward %>",
|
||||
"earnedRewardForDevotion": "You have earned <%= reward %> for being committed to improving your life.",
|
||||
"nextRewardUnlocksIn": "Check-ins until your next prize: <%= numberOfCheckinsLeft %>",
|
||||
"awesome": "Awesome!",
|
||||
"unlockedReward": "لقد استلمت <%= reward %>",
|
||||
"earnedRewardForDevotion": "لقد حصلت على <%= reward %> لكونك ملتزماً بتحسين حياتك.",
|
||||
"nextRewardUnlocksIn": "تسجيلات دخول للحصول على جائزتك القادمة: <%= numberOfCheckinsLeft %>",
|
||||
"awesome": "رائع!",
|
||||
"countLeft": "Check-ins until next reward: <%= count %>",
|
||||
"incentivesDescription": "When it comes to building habits, consistency is key. Each day you check-in you get closer to a prize.",
|
||||
"checkinEarned": "Your Check-In Counter went up!",
|
||||
"unlockedCheckInReward": "You unlocked a Check-In Prize!",
|
||||
"checkinProgressTitle": "Progress until next",
|
||||
"incentiveBackgroundsUnlockedWithCheckins": "Locked Plain Backgrounds will unlock with Daily Check-Ins.",
|
||||
"oneOfAllPetEggs": "one of each standard Pet Egg",
|
||||
"twoOfAllPetEggs": "two of each standard Pet Egg",
|
||||
"threeOfAllPetEggs": "three of each standard Pet Egg",
|
||||
"oneOfAllHatchingPotions": "one of each standard Hatching Potion",
|
||||
"threeOfEachFood": "three of each standard Pet Food",
|
||||
"fourOfEachFood": "four of each standard Pet Food",
|
||||
"twoSaddles": "two Saddles",
|
||||
"incentivesDescription": "عندما يتعلق الأمر ببناء العادات ، فإن الاستمرار هو المفتاح. كل يوم تقوم بتسجيل الدخول تقترب من مكافأة.",
|
||||
"checkinEarned": "ازداد عدد تسجيلات الدخول الخاص بك!",
|
||||
"unlockedCheckInReward": "لقد حررت جائزة تسجيل دخول!",
|
||||
"checkinProgressTitle": "عملية التقدم للتالي",
|
||||
"incentiveBackgroundsUnlockedWithCheckins": "التقدم حتى يتم فتح الخلفيات العادية المقفلة التالية مع تسجيلات الدخول اليومية.",
|
||||
"oneOfAllPetEggs": "واحدة من بيض كل الحيوانات الأليفة القياسية",
|
||||
"twoOfAllPetEggs": "اثنين من بيض كل الحيوانات الأليفة القياسية",
|
||||
"threeOfAllPetEggs": "ثلاثة من بيض كل الحيوانات الأليفة القياسية",
|
||||
"oneOfAllHatchingPotions": "واحدة من كل جرعات التفقيس القياسية",
|
||||
"threeOfEachFood": "ثلاثة من كل جرعات التفقيس القياسية",
|
||||
"fourOfEachFood": "أربعة من غذاء كل الحيوانات الأليفة القياسية",
|
||||
"twoSaddles": "اثنين من السروج",
|
||||
"threeSaddles": "ثلاثة سروج",
|
||||
"incentiveAchievement": "the Royally Loyal achievement",
|
||||
"royallyLoyal": "Royally Loyal",
|
||||
"royallyLoyalText": "This user has checked in over 500 times, and has earned every Check-In Prize!",
|
||||
"checkInRewards": "Check-In Rewards",
|
||||
"backloggedCheckInRewards": "You received Check-In Prizes! Visit your Inventory and Equipment to see what's new."
|
||||
"incentiveAchievement": "إنجاز الولاء الملكي",
|
||||
"royallyLoyal": "الولاء الملكي",
|
||||
"royallyLoyalText": "هذا المستخدم قد قام بتسجيل الدخول أكثر من 500 مرة، وحصل على كل مكافآت تسجيل الدخول!",
|
||||
"checkInRewards": "مكافآت تسجيل الدخول",
|
||||
"backloggedCheckInRewards": "لقد استلمت مكافآت تسجيل دخول! ادخل على مخزنك ومعداتك لترى ما هو جديد."
|
||||
}
|
||||
|
||||
@@ -609,7 +609,7 @@
|
||||
"questSeaSerpentNotes": "Your streaks have you feeling lucky—it’s the perfect time for a trip to the seahorse racetrack. You board the submarine at Diligent Docks and settle in for the trip to Dilatory, but you’ve barely submerged when an impact rocks the sub, sending its occupants tumbling. “What’s going on?” @AriesFaries shouts.<br><br>You glance through a nearby porthole and are shocked by the wall of shimmering scales passing by it. “Sea serpent!” Captain @Witticaster calls through the intercom. “Brace yourselves, it’s coming ‘round again!” As you grip the arms of your seat, your unfinished tasks flash before your eyes. ‘Maybe if we work together and complete them,’ you think, ‘we can drive this monster away!’",
|
||||
"questSeaSerpentCompletion": "Battered by your commitment, the sea serpent flees, disappearing into the depths. When you arrive in Dilatory, you breathe a sigh of relief before noticing @*~Seraphina~ approaching with three translucent eggs cradled in her arms. “Here, you should have these,” she says. “You know how to handle a sea serpent!” As you accept the eggs, you vow anew to remain steadfast in completing your tasks to ensure that there’s not a repeat occurrence.",
|
||||
"questSeaSerpentBoss": "The Mighty Sea Serpent",
|
||||
"questSeaSerpentDropSeaSerpentEgg": "Sea Serpent (Egg)",
|
||||
"questSeaSerpentDropSeaSerpentEgg": "",
|
||||
"questSeaSerpentUnlockText": "Unlocks purchasable Sea Serpent eggs in the Market",
|
||||
"questKangarooText": "Kangaroo Catastrophe",
|
||||
"questKangarooNotes": "Maybe you should have finished that last task… you know, the one you keep avoiding, even though it always comes back around? But @Mewrose and @LilithofAlfheim invited you and @stefalupagus to see a rare kangaroo troop hopping through the Sloensteadi Savannah; how could you say no?! As the troop comes into view, something hits you on the back of the head with a mighty <em>whack!</em><br><br>Shaking the stars from your vision, you pick up the responsible object--a dark red boomerang, with the very task you continually push back etched into its surface. A quick glance around confirms the rest of your party met a similar fate. One larger kangaroo looks at you with a smug grin, like she’s daring you to face her and that dreaded task once and for all!",
|
||||
@@ -635,4 +635,4 @@
|
||||
"questVelociraptorBoss": "Veloci-Rapper",
|
||||
"questVelociraptorDropVelociraptorEgg": "Velociraptor (Egg)",
|
||||
"questVelociraptorUnlockText": "Unlocks purchasable Velociraptor eggs in the Market"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "и",
|
||||
"chores": "Домакинска работа",
|
||||
"clearBrowserData": "Изчистване на данните на браузъра",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Добавки и разширения</a>",
|
||||
"communityExtensions": "Добавки и разширения",
|
||||
"communityFacebook": "Фейсбук",
|
||||
"companyAbout": "Как работи",
|
||||
"companyBlog": "Блог",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "a",
|
||||
"chores": "Domácí práce",
|
||||
"clearBrowserData": "Vyčistit data v prohlížeči",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Doplňky & Rozšírení</a>",
|
||||
"communityExtensions": "Doplňky & Rozšírení",
|
||||
"communityFacebook": "Facebook",
|
||||
"companyAbout": "Jak to funguje",
|
||||
"companyBlog": "Blog",
|
||||
|
||||
@@ -2014,5 +2014,9 @@
|
||||
"weaponMystery202102Notes": "Zářivý růžový drahokem v této hůlce dokáže šířit radost a přátelství všude možně! Nepřináší žádné výhody. Předmět pro předplatitele, únor 2021.",
|
||||
"weaponMystery202104Notes": "Tvoji nepřátele by si měli dávat pozor - máš totiž mocnou a pichlavou obranu! Nepřináší žádné výhody. Předmět pro předplatitele duben 2021.",
|
||||
"weaponMystery202102Text": "Okouzlující hůlka",
|
||||
"weaponMystery202104Text": "Hůl trnitého bodláku"
|
||||
"weaponMystery202104Text": "Hůl trnitého bodláku",
|
||||
"weaponMystery202201Notes": "O silvestrovské půlnoci vypusť oblak zlatého a stříbrného třpytu. Štastný nový rok! Kdo to teď uklidí? Nepřináší žádné výhody. Předmět pro předplatitele leden 2022.",
|
||||
"weaponMystery202201Text": "Konfetové dělo půlnoci",
|
||||
"weaponMystery202111Text": "Chronomancerova hůl",
|
||||
"weaponMystery202111Notes": "Ohýbej tok času s touto tajemnou a mocnou holí. Nepřináší žádné výhody. Předmět pro předplatitele listopad 2021."
|
||||
}
|
||||
|
||||
@@ -492,5 +492,6 @@
|
||||
"backgroundParkWithStatueText": "Park med Statue",
|
||||
"backgroundDojoNotes": "Lær nye teknikker i en Dojo.",
|
||||
"backgroundDojoText": "Dojo",
|
||||
"backgrounds052019": "SET 60: Frigivet Maj 2019"
|
||||
"backgrounds052019": "SET 60: Frigivet Maj 2019",
|
||||
"hideLockedBackgrounds": "Skjul låste baggrunde"
|
||||
}
|
||||
|
||||
@@ -103,5 +103,6 @@
|
||||
"selectParticipant": "Vælg en deltager",
|
||||
"filters": "Filtre",
|
||||
"wonChallengeDesc": "<%= challengeName %> udvalgte dig som vinder! Din sejr er noteret i dine Præstationer.",
|
||||
"yourReward": "Din Belønning"
|
||||
"yourReward": "Din Belønning",
|
||||
"removeTasks": "Fjern opgaver"
|
||||
}
|
||||
|
||||
@@ -2,25 +2,25 @@
|
||||
"tavernCommunityGuidelinesPlaceholder": "Venlig påmindelse: Det her er en chat for alle aldre, så hold venligst en passende tone og vær opmærksom på indholdet af dine beskeder! Læs Retningslinjer for fællesskabet i sidepanelet, hvis du har spørgsmål.",
|
||||
"lastUpdated": "Sidst opdateret:",
|
||||
"commGuideHeadingWelcome": "Velkommen til Habitica!",
|
||||
"commGuidePara001": "Vær hilset, eventyrer! Velkommen til Habitica, et land af produktivitet, sund levemåde, og til tider en enkelt hærgende grif. Vi er et muntert fællesskab fuld af hjælpsomme folk der støtter op om hinanden på deres vej til at forbedre sig selv. For at passe ind har du kun brug for en positiv attitude, respektfuld opførsel, og forståelse for at alle har forskellige evner of begrænsninger -- inklusiv dig! Habiticanere er tålmodige med hinanden og forsøger at hjælpe hvor de kan.",
|
||||
"commGuidePara002": "For at sikre at alle er trygge, glade, og produktive i vores fællesskab, har vi nogle retningslinjer. Vi har omhyggeligt konstrueret dem så de er så venlige og letlæselige som muligt. Brug venligt et øjeblik på at læse dem inden du begynder at chatte.",
|
||||
"commGuidePara003": "Disse regler gælder alle de sociale områder vi bruger, inklusiv (men ikke nødvendigvis begrænset til) Trello, GitHub, Weblate og Wikia (wiki'en). Sommetider vil der opstå uforudsete situationer, eksempelvis en ny kilde til konflikt eller en ondskabsfuld åndemaner. Når det sker, kan moderatorer reagere ved at ændre disse retningslinjer for at beskytte fællesskabet mod ny trusler. Frygt ikke: Du vil blive gjort opmærksom på ændringer i retningslinjerne via en påmindelse fra Bailey.",
|
||||
"commGuidePara001": "Vær hilset, eventyrer! Velkommen til Habitica, et land af produktivitet, sund levemåde, og til tider en enkelt hærgende grif. Vi er et muntert fællesskab fuld af hjælpsomme folk der støtter op om hinanden på deres vej til at forbedre sig selv. For at passe ind har du kun brug for en positiv attitude, respektfuld opførsel, og forståelse for at alle har forskellige evner of begrænsninger - inklusiv dig! Habiticanere er tålmodige med hinanden og forsøger at hjælpe hvor de kan.",
|
||||
"commGuidePara002": "For at sikre at alle er trygge, glade, og produktive i vores fællesskab, har vi nogle retningslinjer. Vi har omhyggeligt konstrueret dem så de er så venlige og letlæselige som muligt. Brug venligst et øjeblik på at læse dem inden du begynder at chatte.",
|
||||
"commGuidePara003": "Disse regler gælder alle de sociale områder vi bruger, inklusiv (men ikke nødvendigvis begrænset til) Trello, GitHub, Weblate og Habitica wiki'en på fandom.com. Efterhånden som Habitica vokser og forandres, kan det ske at vores regler bliver ændret. Når der er sket bemærkelsesværdige ændringer af retningslinjerne for fællesskabet, vil du kunne høre om det i en meddelelse fra Bailey og/eller på vores sociale medier!",
|
||||
"commGuideHeadingInteractions": "Interaktioner i Habitica",
|
||||
"commGuidePara015": "Habitica har to slags sociale rum: offentlige og private. Offentlige rum inkluderer Værtshuset, Offentlige klaner, GitHub, Trello og Wiki'en. Private rum er Private klaner, Holdchatten og Private beskeder. Alle display names skal følge retningslinjerne for offentlige rum. Gå til Bruger > Indstillinger > Side for at ændre dit brugernavn.",
|
||||
"commGuidePara016": "Når du navigerer rundt i de offentlige steder af Habitica, er der nogle generelle regler for at sørge for, at alle er sikre og glade. De burde være lette for eventyrere som dig!",
|
||||
"commGuideList02A": "<strong>Respekter hinanden</strong>. Vær høflig, venlig og hjælpsom. Husk: Habiticanere kommer fra alle baggrunde og har haft vildt skiftende oplevelser og erfaringer. Det er en del af det, der gør Habitica så cool! At bygge et fællesskab betyder at vi respekterer og fejrer vores forskelle såvel som vores ligheder. Her er nogle nemme måder at vise respekt for hinanden på:",
|
||||
"commGuideList02B": "<strong>Adlyd alt i <a href='/static/terms' target='_blank'>Vilkår og betingelser</a></strong>.",
|
||||
"commGuideList02C": "<strong>Læg ikke billeder eller tekst op, der er voldeligt, truende eller seksuelt eksplicit/antydende, eller som promoverer diskrimination, fordomme, racisme, sexisme, had, chikane eller skade mod et individ eller en gruppe</strong>. Ikke engang som en joke. Dette inkluderer skældsord såvel som udtalelser. Ikke alle har den samme form for humor, så noget du anser som en joke er muligvis sårende for en anden. Angrib jeres Daglige opgaver, ikke hinanden.",
|
||||
"commGuideList02D": "<strong>Hold diskussioner passende for alle aldre</strong>. Vi har mange unge Habiticanere der bruger hjemmesiden! Lad os ikke genere nogen uskyldige eller forhindre nogen Habiticanere i at opnår deres mål.",
|
||||
"commGuideList02E": "<strong>Undgå bandeord. Dette inkluderer mildere, religiøst baserede bandeord der kan være acceptable andre steder</strong>. Vi har folk fra alle religiøse og kulturelle baggrunde, og vi vil gerne sørge for at de alle føler sig trygge i offentlige rum. <strong>Hvis en moderator eller medarbejder fortæller dig at et udtryk ikke er tilladt i Habitica, selvom det er et udtryk, du ikke vidste var problematisk, er den beslutning endegyldig</strong>. Der vil blive slået særlig hårdt ned på skældsord, da de også går imod vores Vilkår og betingelser.",
|
||||
"commGuideList02F": "<strong>Undgå lange diskussioner af opsplittende emner i Værtshuset og hvor det ellers ikke ville være et passende emne</strong>. Hvis du føler nogen har sagt noget uhøfligt eller sårende, så svar dem ikke. Hvis nogen nævner noget der er tilladt ifølge retningslinjerne, men sårende for dig, er det okay høfligt at sige det til dem. Hvis det er imod retningslinjerne eller Vilkår og betingelser, så rapporter det og lad en moderator håndtere det. Hvis du er i tvivl, så rapporter beskeden.",
|
||||
"commGuideList02G": "<strong>Overhold omgående enhver anmodning fra en Moderator.</strong>. Dette kan inkludere, men er ikke begrænset til, at bede dig begrænse antallet af dine beskeder i et bestemt rum, at fjerne upassende indhold fra din profil, at bede dig om at tage din diskussion et mere passende sted osv.",
|
||||
"commGuideList02J": "<strong>Spam ikke</strong>. Spam inkluderer, men er ikke begrænset til: at skrive den samme kommentar eller spørgsmål flere steder, at lægge links op uden forklaring eller kontekst, at skrive meningsløse beskeder, at skrive adskillige promoverende beskeder om en Klan, Hold eller Udfordring, eller at skrive mange beskeder på én gang. At tigge om ædelsten eller et abonnement i ethvert chatrum eller via Privatbesked betragtes også som spam.<br/><br/>Det er op til moderatorerne at beslutte om noget er spam eller kan føre til spam, selv hvis du ikke mener du har spammet. For eksempel er det i orden at reklamere for en Klan en enkelt eller to gange, men adskillige beskeder samme da ville sikkert blive betragtet som spam, uanset hvor nyttig Klanen er!",
|
||||
"commGuidePara015": "Habitica har to slags sociale rum: offentlige og private. Offentlige rum inkluderer Værtshuset, offentlige klaner, GitHub, Trello og wiki'en. Private rum tæller private klaner, Holdchatten og private beskeder. Alle displaynavne og @brugernavne skal følge retningslinjerne for offentlige rum. Gå til Menu > Indstillinger > Profil for at ændre dit displaynavn eller @brugernavn i app'en. På Habiticas hjemmeside skal du gå til Bruger > Indstillinger.",
|
||||
"commGuidePara016": "Når du navigerer rundt i de offentlige rum af Habitica, er der nogle generelle regler for at sørge for, at alle er sikre og glade.",
|
||||
"commGuideList02A": "<strong>Respekter hinanden</strong>. Vær høflig, venlig og hjælpsom. Husk: Habiticanere kommer fra alle baggrunde og har haft vildt skiftende oplevelser og erfaringer. Det er en del af det, der gør Habitica så cool! At bygge et fællesskab betyder at vi respekterer og fejrer vores forskelle såvel som vores ligheder.",
|
||||
"commGuideList02B": "<strong>Adlyd alt i <a href='/static/terms' target='_blank'>Vilkår og betingelser</a></strong> i både offentlige og private rum.",
|
||||
"commGuideList02C": "<strong>Læg ikke billeder eller tekst op, der er voldeligt, truende eller seksuelt eksplicit/antydende, eller som promoverer diskrimination, fordomme, racisme, sexisme, had, chikane eller skade mod et individ eller en gruppe</strong>. Ikke engang som en joke. Dette inkluderer skældsord såvel som udtalelser. Ikke alle har den samme form for humor, så noget du anser som en joke er muligvis sårende for en anden.",
|
||||
"commGuideList02D": "<strong>Hold diskussioner passende for alle aldre</strong>. Dette betyder at 18+ emner ikke bør diskuteres i offentlige rum. Vi har mange unge Habiticanere der bruger hjemmesiden, og vores brugere kommer fra mange steder i verden. Vi vil gerne have, at Habitica er så rart og inkluderende et sted som muligt.",
|
||||
"commGuideList02E": "<strong>Undgå bandeord. Dette inkluderer mildere, religiøst baserede bandeord der kan være acceptable andre steder, og forkortede eller forklædte bandeord.</strong> Vi har folk fra alle religiøse og kulturelle baggrunde, og vi vil gerne sørge for at de alle føler sig trygge i offentlige rum. <strong>Hvis en moderator eller medarbejder fortæller dig at et udtryk ikke er tilladt i Habitica, selvom det er et udtryk, du ikke vidste var problematisk, er den beslutning endegyldig.</strong> Der vil blive slået særlig hårdt ned på skældsord, da de også går imod vores Vilkår og betingelser.",
|
||||
"commGuideList02F": "Undgå lange diskussioner af opsplittende emner i Værtshuset og hvor det ellers ikke ville være et passende emne. Hvis nogen siger noget der er tilladt under vores retningslinjer, men som er sårende for dig, er det okay høfligt at sige det til dem. Hvis nogen siger til dig, at du har gjort dem ubehageligt til mode, så tag et øjeblik til at tænke over dine ord frem for at svare i vrede. Hvis du føler, at en samtale er ved at blive overophedet, følelsesladet eller sårende, <strong>så hold op med at svare. Rapportér i stedet de relevante beskeder for at sende besked til os.</strong> Moderatorerne vil se på det, så hurtigt de kan. Du kan også sende en email til <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> og er velkommen til at sende screenshots, hvis det ville hjælpe os med at forstå sagen.",
|
||||
"commGuideList02G": "<strong>Overhold omgående enhver anmodning fra en Moderator.</strong> Dette kan inkludere, men er ikke begrænset til, at bede dig begrænse antallet af dine beskeder i et bestemt rum, at fjerne upassende indhold fra din profil, at bede dig om at tage din diskussion et mere passende sted osv. Begynd ikke at diskutere med moderatorerne. Hvis du har kommentarer til Habiticas moderering, så send en email til <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> for at komme i kontakt med vores community manager.",
|
||||
"commGuideList02J": "<strong>Spam ikke</strong>. Spam inkluderer, men er ikke begrænset til: at skrive den samme kommentar eller spørgsmål flere steder, <strong>at lægge links op uden forklaring eller kontekst</strong>, at skrive meningsløse beskeder, at skrive adskillige promoverende beskeder om en Klan, Hold eller Udfordring, eller at skrive mange beskeder på én gang. Hvis det at andre brugere følger et link vil give nogen form for afkast eller fordel til dig, skal det stå i beskeden, ellers vil det også blive regnet for spam. Det er op til moderatorerne at beslutte om noget er spam.",
|
||||
"commGuideList02K": "<strong>Undgå at skrive store overskrifter i offentlige chatrum, især Værtshuset</strong>. Ligesom ALL CAPS læses det som om du råber, og forstyrrer den behagelige stemning.",
|
||||
"commGuideList02L": "<strong>Vi fraråder kraftigt deling af personlig information -- især information der kan bruges til at identificere dig - i offentlige chatrum</strong>. Identificerende personlig information inkluderer, men er ikke begrænset til: din adresse, emailadresse og din API token/password. Det er for din sikkerheds skyld! Medarbejdere eller moderatorer kan fjerne sådanne beskeder efter forgodtbefindende. Hvis du bliver bedt om personlig information i en privat Klan, Hold eller Besked, anbefaler vi kraftigt at du høfligt afviser og gør medarbejderne og moderatorerne opmærksomme ved enten 1) at rapportere beskeden hvis det er i chatten tilhørende et Hold eller privat Klan, eller 2) at udfylde <a href='https://contact.habitica.com/' target='_blank'>Moderatorkontaktformularen</a> og vedlægger screenshots.",
|
||||
"commGuideList02L": "<strong>Vi fraråder kraftigt deling af personlig information -- især information der kan bruges til at identificere dig - i offentlige chatrum</strong>. Identificerende personlig information inkluderer, men er ikke begrænset til: din adresse, emailadresse og din API token/password. Det er for din sikkerheds skyld! Medarbejdere eller moderatorer kan fjerne sådanne beskeder efter forgodtbefindende. Hvis du bliver bedt om personlig information i en privat Klan, Hold eller Besked, anbefaler vi kraftigt at du høfligt afviser og gør medarbejderne og moderatorerne opmærksomme ved enten 1) at rapportere beskeden, eller 2) at sende en email til <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> og vedhæfte screenshots.",
|
||||
"commGuidePara019": "<strong>I private rum</strong> har brugere mere frihed til at diskutere hvilke emner de har lyst til, men de må stadig ikke gå imod Vilkår og betingelser, inklusiv at skrive nedværdigende skældsord eller noget diskriminerende, voldeligt eller truende indhold. Bemærk, at fordi navne på Udfordringer kan ses i vinderens offentlige profil skal ALLE navne på Udfrodringer adlyde retningslinjerne for offentlige rum, selv hvis de foregår i et privat rum.",
|
||||
"commGuidePara020": "<strong>Privatbeskeder</strong> har nogle ekstra retningslinjer. Hvis nogen har blokeret dig må du ikke kontakte dem på andre måder for at bede dem om at fjerne blokeringen. Derudover må du ikke sende privatbeskeder til andre for at bede om hjælp (fordi offentlige svar til spørgsmål om hjælp også kan hjælpe resten af fællesskabet). Sidst men ikke mindst må du ikke sende privatbeskeder til nogen for at tigge om ædelsten eller et abonnement, da dette kan anses som spamming.",
|
||||
"commGuidePara020A": "<strong>Hvis du ser et indlæg eller en privatbesked, du mener går imod retningslinjerne for offenlige rum, beskrevet ovenfor, eller hvis du ser indlæg eller privatbeskeder, der bekymrer dig eller gør dig utryg, kan du gøre Moderatorer og Medarbejdere opmærksomme på den ved at klikke på flag-ikonet for at rapportere det</strong>. En Medarbejder eller Moderator vil tage sig af situationen, så snart de kan. Bemærk venligst, at det at rapportere uskyldige indlæg går imod disse Retningslinjer (se \"Overtrædelser\" nedenunder). Du kan også kontakte Moderatorerne via formularen “<a href='https://contact.habitica.com/' target='_blank'>Kontakt Moderatorerne</a>.” Det kan være det bedste at gøre dette hvis der er flere problematiske indlæg af den samme person i forskellige Klaner, eller hvis situationen kræver en forklaring. Du kan kontakte os på dit eget sprog hvis det er lettere for dig. Vi bliver muligvis nødt til at bruge Google Translate, men vi vil gerne have at du føler dig tryg ved at tage kontakt til os, hvis du har et problem.",
|
||||
"commGuidePara020": "<strong>Privatbeskeder</strong> har nogle ekstra retningslinjer. Hvis nogen har blokeret dig må du ikke kontakte dem på andre måder for at bede dem om at fjerne blokeringen. Derudover må du ikke sende privatbeskeder til andre for at bede om hjælp (fordi offentlige svar til spørgsmål om hjælp også kan hjælpe resten af fællesskabet). Sidst men ikke mindst må du ikke sende privatbeskeder til nogen for at tigge om nogen form for service, der koster rigtige penge.",
|
||||
"commGuidePara020A": "<strong>Hvis du ser et indlæg eller en privatbesked, du mener går imod retningslinjerne for offentlige rum, beskrevet ovenfor, eller hvis du ser indlæg eller privatbeskeder, der bekymrer dig eller gør dig utryg, kan du gøre Moderatorer og Medarbejdere opmærksomme på den ved at klikke på flag-ikonet for at rapportere det</strong>. En Medarbejder eller Moderator vil tage sig af situationen, så snart de kan. Bemærk venligst, at det at rapportere uskyldige indlæg går imod disse retningslinjer (se \"Overtrædelser\" nedenunder). Du kan også kontakte Moderatorerne ved at emaile <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>. Det kan være det bedste at gøre dette, hvis der er flere problematiske indlæg af den samme person i forskellige Klaner, eller hvis situationen kræver en forklaring. Du kan kontakte os på dit eget sprog hvis det er lettere for dig. Vi bliver muligvis nødt til at bruge Google Translate, men vi vil gerne have at du føler dig tryg ved at tage kontakt til os, hvis du har et problem.",
|
||||
"commGuidePara021": "Herudover har nogen offentlige steder i Habitica ekstra retningslinjer.",
|
||||
"commGuideHeadingTavern": "Værtshuset",
|
||||
"commGuidePara022": "Værtshuset er det primære sted Habiticanere hænger ud. Kroværten Daniel holder stedet funklende rent, og Lemoness vil med glæde fremtrylle dig et glas lemonade mens du sidder og snakker. Bare husk…",
|
||||
@@ -31,8 +31,8 @@
|
||||
"commGuidePara029": "<strong>Offentlige Klaner er meget ligesom Værtshuset, bortset fra at de i stedet for at være til generelle samtaler har et bestemt tema</strong>. Chat i offentlige Klaner bør have fokus på dette tema. For eksempel ville medlemmer af Klanen Wordsmiths måske blive fornærmede, hvis samtalen pludselig handler om havearbejde, og Klanen for Dragefans har nok ikke meget interesse i at tyde oldtidens runer. Nogle Klaner er meget afslappede om dette end andre, men forsøg generelt <strong>at holde dig til emnet</strong>!",
|
||||
"commGuidePara031": "I nogle offentlige Klaner omtales der følsomme emner som depression, religion, politik osv. Dette er helt i orden, så længe samtalerne i Klanen ikke bryder nogle Vilkår og betingelser eller Regler for offentlige rum, og så længe de holder sig til Klanens emne.",
|
||||
"commGuidePara033": "<strong>Offentlige Klaner må IKKE indeholde indhold for aldersgruppen 18+. Hvis de planlægger jævnligt at diskutere følsomt indhold, skal dette stå i Klanens beskrivelse</strong>. Dette er for at holde Habitica sikkert of trygt for alle.",
|
||||
"commGuidePara035": "<strong>Hvis en Klan omhandler flere forskellige følsomme emner, er det hensynsfuldt over for dine med-Habiticanere at skrive din kommentar efter en advarsel (fx \"Advarsel: Omtaler selvskade\")</strong>. Disse kan karakteriseres som trigger warnings og/eller noter om indholdet, og Klaner kan have deres egne regler om disse udover dem, der er givet her. Hvis det er muligt, så brug venligst <a href='http://habitica.fandom.com/wiki/Markdown_Cheat_Sheet' target='_blank'>markdown</a> for at gemme det potentielt følsomme indhold under flere linjeskift, så de, der ikke ønsker at læse det, kan scrolle forbi uden at se indholdet. Habiticas medarbejdere og moderatorer kan stadig fjerne dette indhold efter eget skøn.",
|
||||
"commGuidePara036": "Desuden bør følsomt indhold stadig være aktuelt for Klanens emne - at tale om selvskade i en Klan hvor fokus er på at kæmpe mod depression giver mening, men er mindre passende i en Klan for musik. Hvis du ser nogen, som gentagne gange går imod denne retningslinje, især efter at være blevet bedt om at stoppe flere gange, så rapportér venligst deres indlæg og gør moderatorerne opmærksom på dette via <a href='https://contact.habitica.com/' target='_blank'>Moderatorkontaktformularen</a>.",
|
||||
"commGuidePara035": "<strong>Hvis en Klan omhandler flere forskellige følsomme emner, er det hensynsfuldt over for dine med-Habiticanere at skrive din kommentar efter en advarsel (fx \"Advarsel: Omtaler selvskade\")</strong>. Disse kan karakteriseres som trigger warnings og/eller noter om indholdet, og Klaner kan have deres egne regler om disse udover dem, der er givet her. Hvis det er muligt, så brug venligst <a href='https://habitica.fandom.com/wiki/Markdown_Cheat_Sheet' target='_blank'>markdown</a> for at gemme det potentielt følsomme indhold under flere linjeskift, så de, der ikke ønsker at læse det, kan scrolle forbi uden at se indholdet. Habiticas medarbejdere og moderatorer kan stadig fjerne dette indhold efter eget skøn.",
|
||||
"commGuidePara036": "Desuden bør følsomt indhold stadig være aktuelt for Klanens emne - at tale om selvskade i en Klan hvor fokus er på at kæmpe mod depression giver mening, men er mindre passende i en Klan for musik. Hvis du ser nogen, som gentagne gange går imod denne retningslinje, især efter at være blevet bedt om at stoppe flere gange, så rapportér deres beskeder.",
|
||||
"commGuidePara037": "<strong>Ingen Klaner, hverken Offentlige eller Private, bør oprettes med det formål at angribe en gruppe eller et individ</strong>. At oprette en sådan Klan er grundlæg for øjeblikkelig bortvisning fra Habitica. Nedkæmp dårlige vaner, ikke dine med-eventyrere!",
|
||||
"commGuidePara038": "<strong>Alle Udfordringer i Værtshuset og Offentlige Klaner skal også følge disse regler</strong>.",
|
||||
"commGuideHeadingInfractionsEtc": "Overtrædelser, Konsekvenser og Genskabelse",
|
||||
@@ -44,24 +44,24 @@
|
||||
"commGuidePara053": "De følgende er eksempler på større overtrædelser. Listen er ikke fyldestgørende.",
|
||||
"commGuideList05A": "Brud på Betingelser og Vilkår",
|
||||
"commGuideList05B": "Hadtale/billeder, Chikane/stalking, Cyber-mobning, Flaming og Trolling",
|
||||
"commGuideList05C": "Brud på Prøvetid",
|
||||
"commGuideList05D": "At udgive sig for at være Ansat eller Moderator",
|
||||
"commGuideList05E": "Gentagne Moderate Overtrædelser",
|
||||
"commGuideList05C": "Brud på prøvetid",
|
||||
"commGuideList05D": "At udgive sig for at være Ansat eller Moderator - dette inkluderer at påstå, at brugerskabte platforme, der ikke at associerede med Habitica, er officielle og/eller modereret af Habitica eller deres mods/medarbejdere",
|
||||
"commGuideList05E": "Gentagne moderate overtrædelser",
|
||||
"commGuideList05F": "Oprettelse af en ekstra konto for at undgå konsekvenser (for eksempel at oprette en ny konto til at chatte med, efter at have fået frataget ens chat-privilegier)",
|
||||
"commGuideList05G": "Bevidst bedrag af Ansatte eller Moderatorer med det formål at undgå konsekvenser eller bringe en anden bruger i vanskeligheder",
|
||||
"commGuideHeadingModerateInfractions": "Moderate Overtrædelser",
|
||||
"commGuideHeadingModerateInfractions": "Moderate overtrædelser",
|
||||
"commGuidePara054": "Moderate overtrædelser gør ikke fællesskabet usikkert, men de gør det ubehageligt. Disse overtrædelser har moderate konsekvenser. Når de står sammen med andre overtrædelser, kan konsekvenserne blive større.",
|
||||
"commGuidePara055": "De følgende er eksempler på Moderate Overtrædelser. Listen er ikke endelig.",
|
||||
"commGuidePara055": "De følgende er eksempler på moderate overtrædelser. Listen er ikke fyldestgørende.",
|
||||
"commGuideList06A": "At ignorere, opføre respektløst overfor, eller skændes med en Moderator. Dette inkluderer offentlige at klage over moderatorer eller andre brugere, offentligt at forherlige eller forsvare bortviste brugere, eller at debatterer hvorvidt en moderators handlinger var passende. Hvis du er bekymret om en af reglerne eller en Moderators opførsel, så kontakt venligst de ansatte via email (<a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>).",
|
||||
"commGuideList06B": "Backseat Modding. For at tydeliggøre en relevant pointe: En venlig påmindelse om reglerne er helt fint. Backseat modding består i at fortælle, kræve, og/eller stærkt antyde at nogen bør gøre som du siger for at rette op på en fejl. Du kan gøre nogen opmærksom på at de har begået en overtrædelse, men forlang venligst ikke at de skal gøre noget - for eksempel er det bedre at sige \"Bare så du ved det er det ikke så godt at bande i Værtshuset, så det kan være du skulle slette det\" end \"Jeg er nødt til at bede dig slette det indlæg.\"",
|
||||
"commGuideList06C": "At rapportere uskyldige indlæg med vilje.",
|
||||
"commGuideList06D": "Gentagne gange at bryde Retningslinjerne for offentlige rum",
|
||||
"commGuideList06E": "Gentagne gange at begå mindre overtrædelser",
|
||||
"commGuideHeadingMinorInfractions": "Mindre Overtrædelser",
|
||||
"commGuideHeadingMinorInfractions": "Mindre overtrædelser",
|
||||
"commGuidePara056": "Mindre overtrædelser har kun mindre konsekvenser, men er stadig ikke anbefalede. Hvis de sker gentagne gange kan det føre til større konsekvenser.",
|
||||
"commGuidePara057": "De følgende er eksempler på Mindre Overtrædelser. Listen er ikke fyldestgørende.",
|
||||
"commGuidePara057": "De følgende er eksempler på mindre overtrædelser. Listen er ikke fyldestgørende.",
|
||||
"commGuideList07A": "Førstegangsbrud på Retningslinjer for Offentlige Steder",
|
||||
"commGuideList07B": "Alle udsagn eller handlinger, som udløser et \"Lad venligst være\". Når en Moderator er nødt til at sige \"Lad venligst være med det\" til en bruger, kan det tælle som en meget lille overtrædelse for den bruger. Et eksempel kunne være \"Lad venligst være med at blive ved med at argumentere for indførslen af den funktion, når vi har sgat til dig adskillige gange at det ikke kan lade sig gøre.\" I mange tilfælde vil 'Lad venligst være' blot være konsekvensen af overtrædelsen, men hvis Moderatorerne er nødt til at bede den samme bruger flere gange om at holde op, vil de Mindre Overtrædelser begynde at tælle som Moderate Overtrædelser.",
|
||||
"commGuideList07B": "Alle udsagn eller handlinger, som udløser et \"lad venligst være\" fra en moderator. Når du offentligt bliver bedt om at stoppe en handling, kan dette i sig selv tælle som en mindre overtrædelse. Hvis mods er nødt til gentagne gange at irettesætte den samme person, kan det komme til at tælle som en grovere overtrædelse",
|
||||
"commGuidePara057A": "Nogle indlæg kan blive skjult fordi de indeholder følsom information eller kan give folk det forkerte indtryk. Typisk gælder dette ikke som en overtrædelser, især ikke den første gang det sker!",
|
||||
"commGuideHeadingConsequences": "Konsekvenser",
|
||||
"commGuidePara058": "I Habitica - som i virkeligheden - har alle handlinger også konsekvenser, hvad enten det er at komme i bedre form fordi du har løbet, få huller i tænderne fordi du har spist for meget sukker, eller bestå et fag fordi du har studeret.",
|
||||
@@ -71,53 +71,63 @@
|
||||
"commGuideList08B": "hvad konsekvensen er",
|
||||
"commGuideList08C": "hvad der skal til for at rette fejlen og genoprette din status, hvis muligt.",
|
||||
"commGuidePara060A": "Hvis situationen påkræver det kan du også modtage en PM eller email plus et indlæg i det forum, hvor overtrædelsen blev begået. I nogle tilfælde bliver du slet ikke irettesat offentligt.",
|
||||
"commGuidePara060B": "Hvis din konto bortvises (en alvorlig konsekvens), vil du ikke være i stand til at logge på Habitica, og vil få en fejl-besked når du prøver. <strong>Hvis du ønsker at undskylde eller argumentere for genoprettelse af din konto, så skriv venligst en email til de ansatte på <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> med dit UUID (unikke bruger-ID)</strong> (som vil blive oplyst i fejl-beskeden). Det er <strong>dit</strong> ansvar at tage kontakt, hvis du ønsker en genovervejelse af situationen, eller genoprettelse.",
|
||||
"commGuideHeadingSevereConsequences": "Eksempler på Større Konsekvenser",
|
||||
"commGuidePara060B": "Hvis din konto bortvises (en alvorlig konsekvens), vil du ikke være i stand til at logge på Habitica, og vil få en fejl-besked når du prøver. <strong>Hvis du ønsker at undskylde eller argumentere for genoprettelse af din konto, så skriv venligst en email til de ansatte på <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> med dit bruger-ID</strong> (som vil blive oplyst i fejlbeskeden) eller @brugernavn. Det er <strong>dit</strong> ansvar at tage kontakt, hvis du ønsker en genovervejelse af situationen, eller genoprettelse.",
|
||||
"commGuideHeadingSevereConsequences": "Eksempler på større konsekvenser",
|
||||
"commGuideList09A": "Kontoudelukkelser (se ovenstående)",
|
||||
"commGuideList09C": "Permanent deaktivering (\"indefrysning\") af fremskridt i Bidragsyder-niveauer",
|
||||
"commGuideHeadingModerateConsequences": "Eksempler på Moderate Konsekvenser",
|
||||
"commGuideHeadingModerateConsequences": "Eksempler på moderate konsekvenser",
|
||||
"commGuideList10A": "Begrænsede offentlige og/eller private chatprivilegier",
|
||||
"commGuideList10A1": "Hvis dine handlinger resulterer i fradragelse af dine rettigheder til chatten, vil en Moderator eller Ansat sende dig en privatbesked og/eller et indlæg i det forum du blev suspenderet fra for at fortælle dig grunden til og længden af din suspendering. Efter denne periode vil du få dine chatrettigheder tilbage, forudsat at du er villig til at ændre ved den opførsel du blev suspenderet for og overholde Fællesskabets Retningslinjer.",
|
||||
"commGuideList10A1": "Hvis dine handlinger resulterer i fradragelse af dine rettigheder til chatten, vil en Moderator eller Ansat sende dig en privatbesked og/eller et indlæg i det forum du blev suspenderet fra for at fortælle dig grunden til og længden af din suspendering, og/eller hvad du skal gøre for at få dine chatprivilegier tilbage. Du vil få dem igen, hvis du høfligt følger de anvisninger du får, og erklærer dig villig til at følge vores Retningslinjer for Fællesskabet og Betingelser & Vilkår",
|
||||
"commGuideList10C": "Begrænsede Klan/Udfordringsoprettelsesprivilegier",
|
||||
"commGuideList10D": "Midlertidig deaktivering (\"indefrysning\") af fremskridt i Bidragsyder-niveauer",
|
||||
"commGuideList10E": "Degradering af Bidragsyder-niveauer",
|
||||
"commGuideList10F": "Sætte brugere på \"Prøvetid\"",
|
||||
"commGuideHeadingMinorConsequences": "Eksempler på Mindre Konsekvenser",
|
||||
"commGuideList10F": "At sætte brugere på \"prøvetid\"",
|
||||
"commGuideHeadingMinorConsequences": "Eksempler på mindre konsekvenser",
|
||||
"commGuideList11A": "Påmindelser om Retningslinjer for Offentlige Steder",
|
||||
"commGuideList11B": "Advarsler",
|
||||
"commGuideList11C": "Anmodninger",
|
||||
"commGuideList11D": "Slettelser (Moderatorer/Ansatte kan slette problematisk indhold)",
|
||||
"commGuideList11E": "Rettelser (Moderatorer/Ansatte kan slette problematisk indhold)",
|
||||
"commGuideList11E": "Rettelser (Moderatorer/Ansatte kan redigere problematisk indhold)",
|
||||
"commGuideHeadingRestoration": "Genoprettelse",
|
||||
"commGuidePara061": "Habitica er en land dedikeret til forbedring, og vi tror på at give en chance til <strong>Hvis du begår en overtrædelse og bliver udsat for en konsekvens som følge, så se det som en mulighed for at evaluere dine handlinger og forbedre din opførsel som medlem af fællesskabet</strong>.",
|
||||
"commGuidePara062": "Den bekendtgørelse, besked og/eller email du modtager, der forklarer konsekvenserne af dine handlinger, er en god kilde til information. Hold dig til de begrænsninger der er blevet påført, og bestræb dig på at møde de krav, der kan få eventuelle straffe ophævet.",
|
||||
"commGuidePara063": "Hvis du ikke forstår konsekvenserne eller arten af din overtrædelse, så bed Medarbejderne/Moderatorerne om hjælp, så du kan undgå at begå overtrædelser i fremtiden. Hvis du føler at en bestemt beslutning var uretfærdig, kan du kontakte de ansatte for at diskutere det på <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
|
||||
"commGuideHeadingMeet": "Mød de Ansatte og Moderatorerne!",
|
||||
"commGuidePara006": "Habitica har nogle utrættelige omvandrende riddere, der kæmper sammen med de ansatta for at holde fællesskabet roligt, tilfreds, og frit for trolde. Hver har et specifikt domæne, men vil sommetider blive kaldt ind for at hjælpe i andre sociale sfærer.",
|
||||
"commGuidePara006": "Habitica har nogle utrættelige omvandrende riddere, der kæmper sammen med de ansatte for at holde fællesskabet roligt, tilfreds, og frit for trolde. Hver har et specifikt domæne, men vil sommetider blive kaldt ind for at hjælpe i andre sociale sfærer.",
|
||||
"commGuidePara007": "Ansatte har lilla tags markeret med kroner. Deres titel er \"Heltemodig\".",
|
||||
"commGuidePara008": "Moderatorer har mørkeblå tags markeret med stjerner. Deres titel er \"Beskytter\". Den eneste undtagelse er Bailey, der som NPC har et sort og grønt tag markeret med en stjerne.",
|
||||
"commGuidePara009": "De nuværende Ansatte er (fra venstre mod højre):",
|
||||
"commGuideAKA": "<%= habitName %> aka <%= realName %>",
|
||||
"commGuidePara008": "Moderatorer har mørkeblå tags markeret med stjerner. Deres titel er \"Beskytter\".",
|
||||
"commGuidePara009": "De nuværende ansatte er (fra venstre mod højre):",
|
||||
"commGuideAKA": "<%= habitName %>, aka <%= realName %>",
|
||||
"commGuideOnTrello": "<%= trelloName %> på Trello",
|
||||
"commGuideOnGitHub": "<%= gitHubName %> på GitHub",
|
||||
"commGuidePara010": "Der er også flere Moderatorer, der hjælper de ansatte. Disse er omhyggeligt udvalgt, så vis dem respekt og lyt til deres forslag.",
|
||||
"commGuidePara011": "De nuværende Moderatorer er (fra venstre mod højre):",
|
||||
"commGuidePara011b": "På GitHub/Wikia",
|
||||
"commGuidePara011c": "på Wikia",
|
||||
"commGuidePara011": "De nuværende moderatorer er (fra venstre mod højre):",
|
||||
"commGuidePara011b": "på GitHub/Fandom",
|
||||
"commGuidePara011c": "på wiki'en",
|
||||
"commGuidePara011d": "på GitHub",
|
||||
"commGuidePara012": "Hvis du har et problem eller bekymring, der drejer sig om en bestemt Moderator, så send venligst en email til vores Medarbejdere (<a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>).",
|
||||
"commGuidePara013": "Brugere kommer og går i et fællesskab så stort som Habitica. Sommetider bliver en medarbejder eller moderator nødt til at fralægge sig deres ædle kappe, og slappe lidt af. De følgende er Ansatte og Moderatorer Emeritus. De løfter ikke længere et ansvar som Ansat eller Moderator, men vi vil stadig gerne mindes deres indsats!",
|
||||
"commGuidePara014": "Ansatte og Moderatorer Emeritus:",
|
||||
"commGuideHeadingFinal": "Den Sidste Sektion",
|
||||
"commGuidePara067": "Det var så det, modige Habiticaner - Retningslinjerne for fællesskabet! Tør sveden af panden og giv dig selv nogle Erfaringpoint for at læse det hele. Hvis du har nogle spørgsmål om disse Retningslinjer for fællesskabet, så tag venligst fat i os via <a href='https://contact.habitica.com/' target='_blank'>Moderatorkontaktformularen</a>, og vi vil med glæde forsøge at gøre tingene klart for dig.",
|
||||
"commGuidePara068": "Tag afsted, modige eventyrer, og bekæmp nogle Daglige!",
|
||||
"commGuidePara014": "Ansatte og Moderatorer emeritus:",
|
||||
"commGuideHeadingFinal": "Den sidste sektion",
|
||||
"commGuidePara067": "Det var så det, modige Habiticaner - Retningslinjerne for fællesskabet! Tør sveden af panden og giv dig selv nogle Erfaringpoint for at læse det hele. Hvis du har nogle spørgsmål om disse Retningslinjer for fællesskabet, så tag venligst fat i os via <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>, og vi vil med glæde forsøge at gøre tingene klart for dig.",
|
||||
"commGuidePara068": "Tag afsted, modige eventyrer, og nedkæmp nogle Daglige!",
|
||||
"commGuideHeadingLinks": "Nyttige links",
|
||||
"commGuideLink01": "<a href='/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a' target='_blank'>Habitica Help: Ask a Question</a>: en Klan hvor brugere kan stille spørgsmål!",
|
||||
"commGuideLink02": "<a href='http://habitica.fandom.com/wiki/Habitica_Wiki' target='_blank'>Wiki'en</a>: den største samling af information om Habitica.",
|
||||
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: til bug-rapporter eller hjælp med kodning!",
|
||||
"commGuideLink02": "<a href='https://habitica.fandom.com/wiki/Habitica_Wiki' target='_blank'>Wiki'en</a>: den største samling af information om Habitica.",
|
||||
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: for at hjælpe med kodning!",
|
||||
"commGuideLink04": "<a href='https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link' target='_blank'>Feedbackformularen</a>: til forslag til hjemmesiden og app'en.",
|
||||
"commGuideLink05": "<a href='https://trello.com/b/mXK3Eavg/' target='_blank'>Den mobile Trello</a>: til at bede om funktioner til vores apps.",
|
||||
"commGuideLink06": "<a href='https://trello.com/b/vwuE9fbO/' target='_blank'>Kunst-Trello</a>: til at indsende pixel art.",
|
||||
"commGuideLink07": "<a href='https://trello.com/b/nnv4QIRX/' target='_blank'>Quest-Trello</a>: til at indsende tekst til quests.",
|
||||
"commGuidePara069": "Følgende talentfulde kunstnere har bidraget med disse illustrationer:"
|
||||
"commGuidePara069": "Følgende talentfulde kunstnere har bidraget med disse illustrationer:",
|
||||
"commGuidePara017": "Her er den hurtige version, men vi opfordrer dig til at læse den mere detaljerede udgave nedenunder:",
|
||||
"commGuideList01A": "Vores Betingelser & Vilkår gælder alle steder i Habitica, inklusiv private klaner, holdchatten og private beskeder.",
|
||||
"commGuideList02M": "Bed eller tig ikke andre om at give dig ædelsten, et abonnement eller medlemskab i gruppeplaner. Dette er ikke tilladt at gøre i hverken Værtshuset, offentlige eller private rum, eller i privatbeskeder. Hvis du får en besked med en anmodning om ting, der koster rigtige penge, så rapportér dem venligst. Gentaget eller groft tiggeri, især efter en advarsel er blevet udstedt, kan resulterer i en blokering af din konto.",
|
||||
"commGuideList01B": "Forbudt: Al kommunikation der er voldeligt, truende, opfordrer til diskrimination osv., inklusiv memes, billeder og jokes.",
|
||||
"commGuideList01C": "Al samtale skal være passende for enhver aldersgruppe og ikke indeholde skælds- ellers bandeord.",
|
||||
"commGuideList01D": "Følg venligst moderatorernes anvisninger.",
|
||||
"commGuideList01E": "Start og deltag ikke i diskussioner i Værtshuset, der kan føre til skænderier.",
|
||||
"commGuideList01F": "Bed ikke andre om at give dig ting der koster rigtige penge, spam ikke, og skriv ikke beskeder i all caps eller stor overskriftstekst.",
|
||||
"commGuideList05H": "Grove eller gentagne forsøg på at bedrage eller presse andre spillere til at give dig genstande/services, der koster rigtige penge",
|
||||
"commGuideList09D": "Fjernelse af Bidragsyder-niveauer"
|
||||
}
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
"hatchingPotionEmber": "Glødende",
|
||||
"hatchingPotionThunderstorm": "Tordenvejr",
|
||||
"hatchingPotionGhost": "Spøgelse",
|
||||
"hatchingPotionRoyalPurple": "Royal lilla",
|
||||
"hatchingPotionRoyalPurple": "Purpur",
|
||||
"hatchingPotionHolly": "Kristtorn",
|
||||
"hatchingPotionCupid": "Amor",
|
||||
"hatchingPotionShimmer": "Glimmer",
|
||||
|
||||
@@ -49,9 +49,10 @@
|
||||
"balance": "Balance",
|
||||
"playerTiers": "Spillertrin",
|
||||
"tier": "Trin",
|
||||
"conRewardsURL": "http://habitica.fandom.com/wiki/Contributor_Rewards",
|
||||
"conRewardsURL": "https://habitica.fandom.com/wiki/Contributor_Rewards",
|
||||
"surveysSingle": "Hjalp Habitica med at vokse ved at udfylde et spørgeskema eller var en stor hjælp ved test. Tusind tak!",
|
||||
"surveysMultiple": "Hjalp Habitica med at vokse ved <%= count %> lejligheder, enten ved at udfylde et spørgeskema eller hjalp med et større test-arbejde. Tusind tak!",
|
||||
"blurbHallPatrons": "Dette er Protektorernes Sal, hvor vi ærer de ædle eventyrere, der støttede Habiticas originale Kickstarter. Vi takker dem for at hjælpe os med at vække Habitica til live!",
|
||||
"blurbHallContributors": "Dette er Bidragsydernes Sal, hvor dem, der har bidraget med open-source materiale til Habitica, bliver æret. Om det er gennem kode, grafik, musik, tekst eller bare generel hjælpsomhed, har de modtaget <a href='http://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> ædelsten, eksklusivt udstyr</a>, og <a href='http://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'>prestigefyldte titler</a>. Du kan også bidrage til Habitica! <a href='http://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Find ud af mere her. </a>"
|
||||
"blurbHallContributors": "Dette er Bidragsydernes Sal, hvor dem, der har bidraget med open-source materiale til Habitica, bliver æret. Om det er gennem kode, grafik, musik, tekst eller bare generel hjælpsomhed, har de modtaget <a href='https://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> ædelsten, eksklusivt udstyr</a>, og <a href='https://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'>prestigefyldte titler</a>. Du kan også bidrage til Habitica! <a href='https://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Find ud af mere her. </a>",
|
||||
"noPrivAccess": "Du har ikke de påkrævede rettigheder."
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"dontDespair": "Bare rolig!",
|
||||
"deathPenaltyDetails": "Du mistede et Niveau, dit Guld og et stykke Udstyr, men du kan få det hele igen med hårdt arbejde! Held og lykke - du skal nok klare den.",
|
||||
"refillHealthTryAgain": "Genfyld Liv og Prøv Igen",
|
||||
"dyingOftenTips": "Sker dette ofte? <a href='http://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Her er nogle fif!</a>",
|
||||
"dyingOftenTips": "Sker dette ofte? <a href='https://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Her er nogle fif!</a>",
|
||||
"losingHealthWarning": "Pas på - du mister Liv!",
|
||||
"losingHealthWarning2": "Lad ikke dit Liv falde til nul! Hvis du gør det vil du tabe et niveau, alt dit guld og et stykke udstyr.",
|
||||
"toRegainHealth": "For at genopfylde Liv:",
|
||||
@@ -14,4 +14,4 @@
|
||||
"lowHealthTips4": "Hvis en Daglig ikke er forfalden på en given dag, kan du deaktivere den ved at klikke på blyanten.",
|
||||
"goodLuck": "Held og lykke!",
|
||||
"cannotRevive": "Du kan ikke genoplive hvis du ikke er død"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
"defaultHabit2Text": "Spis junk food (Klik på blyanten for at redigere)",
|
||||
"defaultHabit3Text": "Tag trapperne/elevatoren (Klik på blyanten for at redigere)",
|
||||
"defaultHabit4Text": "Tilføj en opgave til Habitica",
|
||||
"defaultHabit4Notes": "Enten en Vane, en Daglig eller en To-Do",
|
||||
"defaultHabit4Notes": "Enten en Vane, en Daglig eller en To Do",
|
||||
"defaultTodo1Text": "Begynd at bruge Habitica (Markér mig som færdig!)",
|
||||
"defaultTodoNotes": "Du kan enten færdiggøre denne To-Do, ændre den, eller fjerne den.",
|
||||
"defaultTodoNotes": "Du kan enten færdiggøre denne To Do, ændre den eller fjerne den.",
|
||||
"defaultReward1Text": "15 minutters pause",
|
||||
"defaultReward2Text": "Beløn dig selv",
|
||||
"defaultReward2Notes": "Se fjernsyn, spil et spil, spis noget guf, det er op til dig!",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "og",
|
||||
"chores": "Pligter",
|
||||
"clearBrowserData": "Ryd browserdata",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Tilføjelser og udvidelser</a>",
|
||||
"communityExtensions": "Tilføjelser og udvidelser",
|
||||
"communityFacebook": "Facebook",
|
||||
"companyAbout": "Hvordan det virker",
|
||||
"companyBlog": "Blog",
|
||||
@@ -13,7 +13,7 @@
|
||||
"companyDonate": "Donér",
|
||||
"forgotPassword": "Glemt kodeord?",
|
||||
"emailNewPass": "E-mail et nulstillings-link til kodeord",
|
||||
"forgotPasswordSteps": "Skriv den e-mail adresse du benyttede til at registrere din Habitica-konto.",
|
||||
"forgotPasswordSteps": "Skriv dit @brugernavn eller den e-mail adresse, du benyttede til at registrere din Habitica-konto.",
|
||||
"sendLink": "Send link",
|
||||
"featuredIn": "Omtalt i",
|
||||
"footerDevs": "Udviklere",
|
||||
@@ -44,7 +44,7 @@
|
||||
"marketing3Header": "Apps og Udvidelser",
|
||||
"marketing3Lead1": "**iPhone & Android** apps lader dig klare dine ting på farten. Vi ved, at det nogen gange er for meget at skulle logge ind på websiden for at klikke på knapper.",
|
||||
"marketing3Lead2Title": "Integrationer",
|
||||
"marketing3Lead2": "Andre **tredjepartsværktøjer** kan binde Habitica sammen med andre dele af dit liv. Vores API muliggør integrationer som [Chrome Extension](https://chrome.google.com/webstore/detail/habitica/pidkmpibnnnhneohdgjclfdjpijggmjj?hl=en-US), med hvilken du mister point ved at bruge unyttige hjemmesider, og optjener point når du browser de nyttige i stedet. [Se mere her](http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations).",
|
||||
"marketing3Lead2": "Andre **tredjepartsværktøjer** kan binde Habitica sammen med andre dele af dit liv. Vores API muliggør integrationer som [Chrome Extension](https://chrome.google.com/webstore/detail/habitica/pidkmpibnnnhneohdgjclfdjpijggmjj?hl=en-US), med hvilken du mister point ved at bruge unyttige hjemmesider, og optjener point når du browser de nyttige i stedet. [Se mere her](https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations).",
|
||||
"marketing4Header": "Organisatorisk brug",
|
||||
"marketing4Lead1": "Uddannelse er en af de bedste områder at bruge spilelementer. Vi ved alle, hvordan studerende nærmest er limet til deres telefon disse dage, så brug dette! Sæt dine elever til at kæmpe mod hinanden som hyggelig konkurrence. Beløn god opførsel med sjældne præmier. Se deres karakterer og opførsel blive forbedret.",
|
||||
"marketing4Lead1Title": "Brug af Spilelementer i Undervisning",
|
||||
@@ -184,5 +184,6 @@
|
||||
"mobileApps": "Mobile apps",
|
||||
"learnMore": "Lær mere",
|
||||
"communityInstagram": "Instagram",
|
||||
"minPasswordLength": "Kodeord skal bestå af 8 eller flere tegn."
|
||||
"minPasswordLength": "Kodeord skal bestå af 8 eller flere tegn.",
|
||||
"enterHabitica": "Spil Habitica"
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"sortByStr": "STY",
|
||||
"sortByInt": "INT",
|
||||
"weapon": "våben",
|
||||
"weaponCapitalized": "Main-Hand Item",
|
||||
"weaponCapitalized": "Primær hånd",
|
||||
"weaponBase0Text": "Intet våben",
|
||||
"weaponBase0Notes": "Intet våben.",
|
||||
"weaponWarrior0Text": "Træningssværd",
|
||||
@@ -892,7 +892,7 @@
|
||||
"headSpecialDandyHatNotes": "Sikke en herlig hat! Den vil klæde dig så nydeligt på en gåtur. Forøger Konstitution med <%= con %>.",
|
||||
"headSpecialKabutoText": "Samuraihjelm",
|
||||
"headSpecialKabutoNotes": "Denne hjelm er funktionel og smuk! Dine fjender vil være helt distraherede af den. Forøger Intelligens med <%= int %>.",
|
||||
"headSpecialNamingDay2017Text": "Royal lilla grifhjelm",
|
||||
"headSpecialNamingDay2017Text": "Purpurfarvet grifhjelm",
|
||||
"headSpecialNamingDay2017Notes": "Glædelig Navngivningsdag! Ifør dig denne truende og fjerklædte hjelm for at fejre Habitica. Giver ingen bonusser.",
|
||||
"headSpecialTurkeyHelmBaseText": "Kalkunhjelm",
|
||||
"headSpecialTurkeyHelmBaseNotes": "Dit Thanksgiving-look vil være fuldendt med denne næbbede hjelm! Giver ingen bonusser.",
|
||||
@@ -1599,7 +1599,7 @@
|
||||
"bodySpecialSummer2015MageNotes": "Dette spænde giver ingen krafter overhovedet, men det er pænt. Giver ingen bonusser. Specielt 2015 Sommerudstyr.",
|
||||
"bodySpecialSummer2015HealerText": "Matrostørklæde",
|
||||
"bodySpecialSummer2015HealerNotes": "Hiv Ohøj? Nej nej nej! Giver ingen bonusser. Specielt 2015 Sommerudstyr.",
|
||||
"bodySpecialNamingDay2018Text": "Royal Purple Gryphon Cloak",
|
||||
"bodySpecialNamingDay2018Text": "Purpurfarvet grif-kappe",
|
||||
"bodySpecialNamingDay2018Notes": "Happy Naming Day! Wear this fancy and feathery cloak as you celebrate Habitica. Confers no benefit.",
|
||||
"bodyMystery201705Text": "Folded Feathered Fighter Wings",
|
||||
"bodyMystery201705Notes": "These folded wings don't just look snazzy: they will give you the speed and agility of a gryphon! Confers no benefit. May 2017 Subscriber Item.",
|
||||
@@ -1873,5 +1873,6 @@
|
||||
"headSpecialNye2020Notes": "Du har modtaget en Ekstravagant Festhat! Bær den med stolthed imens du byder det nye år velkommen! Giver ingen fordele.",
|
||||
"headSpecialNye2020Text": "Ekstravagant Festhat",
|
||||
"weaponSpecialWinter2021MageNotes": "Dette mægtige våben er bestemt mere end en fase. Kanalisér din energi, fokusér på en måneds flow, og studér tid og rum. Øger Intelligens med <%= int %> og Opfattelse med <%= per %>. Begrænset 2020-2021 Vinterudstyr.",
|
||||
"weaponSpecialWinter2021MageText": "Magisk Måne-faser"
|
||||
"weaponSpecialWinter2021MageText": "Magisk Måne-faser",
|
||||
"backSpecialNamingDay2020Text": "Purpurfarvet grifhale"
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"contributing": "Sådan bidrager du",
|
||||
"faq": "FAQ",
|
||||
"tutorial": "Vejledning",
|
||||
"glossary": "<a target='_blank' href='http://habitica.fandom.com/wiki/Glossary'>Ordliste (EN)</a>",
|
||||
"glossary": "<a target='_blank' href='https://habitica.fandom.com/wiki/Glossary'>Ordliste (EN)</a>",
|
||||
"wiki": "Wiki",
|
||||
"requestAF": "Anmod om en funktion",
|
||||
"dataTool": "Datavisningsværktøj",
|
||||
@@ -324,7 +324,7 @@
|
||||
"gettingStarted": "Kom i gang",
|
||||
"congratsOnGroupPlan": "Tillykke med oprettelsen af din nye Gruppe! Her er nogle svar på flere af de mest almindelige spørgsmål.",
|
||||
"whatsIncludedGroup": "Hvad er inkluderet i abonnementet",
|
||||
"whatsIncludedGroupDesc": "Alle medlemmer af Gruppen får alle fordele ved et abonnement, inklusiv de månedlige abonnentgenstande, evnen til at købe Ædelsten for Guld, og det Royale Lilla Jackalope-ridedyr, som er en eksklusiv belønning for medlemmer af en Gruppeplan.",
|
||||
"whatsIncludedGroupDesc": "Alle medlemmer af Gruppen får alle fordele ved et abonnement, inklusiv de månedlige abonnentgenstande, evnen til at købe Ædelsten for Guld, og det purpur Jackalope-ridedyr, som er en eksklusiv belønning for medlemmer af en Gruppeplan.",
|
||||
"howDoesBillingWork": "Hvordan fungerer betalingen?",
|
||||
"howDoesBillingWorkDesc": "Gruppeledere faktureres baseret på antallet af gruppemedlemmer på en månedlig basis. Regningen omfatter prisen for Gruppelederens abonnement ($9 USD) plus $3 USD for hvert ekstra gruppemedlem. Fx: En gruppe af fire brugere vil koste $18 USD om måneden, da gruppen består af 1 Gruppeleder + 3 gruppemedlemmer.",
|
||||
"howToAssignTask": "Hvordan tildeler du en Opgave?",
|
||||
@@ -339,5 +339,6 @@
|
||||
"recurringCompletion": "Ingen - Gruppeopgave kan ikke udføres",
|
||||
"singleCompletion": "Single - Completes when any assigned user finishes",
|
||||
"allAssignedCompletion": "All - Completes when all assigned users finish",
|
||||
"pmReported": "Tak, fordi du rapporterede denne besked."
|
||||
"pmReported": "Tak, fordi du rapporterede denne besked.",
|
||||
"features": "Funktioner"
|
||||
}
|
||||
|
||||
@@ -27,10 +27,10 @@
|
||||
"seasonalShopClosedTitle": "<%= linkStart %>Leslie<%= linkEnd %>",
|
||||
"seasonalShopTitle": "<%= linkStart %>Sæson-heksen<%= linkEnd %>",
|
||||
"seasonalShopClosedText": "Sæson-markedet er lukket lige nu!! Det er kun åbent under Habiticas fire Grandiøse Gallaer.",
|
||||
"seasonalShopSummerText": "Glædeligt Sommerplask!! Vil du købe nogle sjældne genstande? De vil kun være tilgængelige indtil 31. juli!",
|
||||
"seasonalShopFallText": "Glædelig Efterårsfestival!! Vil du købe nogle sjældne genstande? De vil kun være tilgængelige indtil 31. oktober!",
|
||||
"seasonalShopWinterText": "Velkommen til Vintereventyret!! Vil du købe nogle sjældne genstande? De vil kun være tilgængelige indtil 31. januar!",
|
||||
"seasonalShopSpringText": "Glædelig Forårsfest!! Vil du købe nogle sjældne genstande? De vil kun være tilgængelige indtil 30. april!",
|
||||
"seasonalShopSummerText": "Glædeligt Sommerplask!! Vil du købe nogle sjældne genstande? Sørg for at købe dem før Gallaen slutter!",
|
||||
"seasonalShopFallText": "Glædelig Efterårsfestival!! Vil du købe nogle sjældne genstande? Sørg for at købe dem før Gallaen slutter!",
|
||||
"seasonalShopWinterText": "Velkommen til Vintereventyret!! Vil du købe nogle sjældne genstande? Sørg for at købe dem før Gallaen slutter!",
|
||||
"seasonalShopSpringText": "Glædelig Forårsfest!! Vil du købe nogle sjældne genstande? Sørg for at købe dem før Gallaen slutter!",
|
||||
"seasonalShopFallTextBroken": "Åh.... Velkommen til Sæson-markedet... Vi har efterårs-sæson varer, eller noget... Alting her kan købes under Efterårsfestival-eventet hvert år, men vi har kun åbent indtil den 31. oktober... Du burde nok købe ind nu, ellers vil du skulle vente... og vente... og vente... <strong>*suk*</strong>",
|
||||
"seasonalShopBrokenText": "Min pavillon!!!!!!! Mine dekorationer!!!! Åh, den Dysheartener har ødelagt det hele :( Hjælp med at bekæmpe den i Værtshuset, så jeg kan genopbygge!",
|
||||
"seasonalShopRebirth": "Hvis du har købt noget af detteudstyr før, men ikke ejer det i øjeblikket, kan du genkøbe det i Belønningskolonnen. I starten vil du kun kunne købe de ting der passer til din nuværende klasse (Kriger som standard), men frygt ej, de andre klasse-specifikke varer bliver tilgængelige hvis du skifter til den klasse.",
|
||||
@@ -45,7 +45,7 @@
|
||||
"snowDaySet": "Snedagskriger (Kriger)",
|
||||
"snowboardingSet": "Snowboardende Sortkunstner (Magiker)",
|
||||
"festiveFairySet": "Festlig Fe (Helbreder)",
|
||||
"cocoaSet": "Kakao Slyngel (Slyngel)",
|
||||
"cocoaSet": "Kakao (Slyngel)",
|
||||
"toAndFromCard": "Til: <%= toName %>, Fra: <%= fromName %>",
|
||||
"nyeCard": "Nytårskort",
|
||||
"nyeCardExplanation": "Da I har fejret nytår sammen, modtager I begge \"Gammel Kending\"-emblemet!",
|
||||
@@ -56,7 +56,7 @@
|
||||
"nye0": "Godt Nytår! Må du overvinde mange dårlige Vaner.",
|
||||
"nye1": "Godt Nytår! Må du modtage mange Belønninger.",
|
||||
"nye2": "Godt Nytår! Må du udføre mange Perfekte Dage.",
|
||||
"nye3": "Godt Nytår! Må din To-Do-liste forblive kort og overskuelig.",
|
||||
"nye3": "Godt nytår! Må din To-Do-liste forblive kort og overskuelig.",
|
||||
"nye4": "Godt nytår! Må du undgå at blive angrebet af vrede Hippogriffer.",
|
||||
"mightyBunnySet": "Kraftfuld Kanin (Kriger)",
|
||||
"magicMouseSet": "Magisk Mus (Magiker)",
|
||||
@@ -74,11 +74,11 @@
|
||||
"magicianBunnySet": "Tryllekunstners Kanin (Magiker)",
|
||||
"comfortingKittySet": "Trøstende Kat (Helbreder)",
|
||||
"sneakySqueakerSet": "Pibende Sniger (Slyngel)",
|
||||
"sunfishWarriorSet": "Solfiskekriger (Kriger)",
|
||||
"sunfishWarriorSet": "Solfisk (Kriger)",
|
||||
"shipSoothsayerSet": "Skibs-sandsigerske (Magiker)",
|
||||
"strappingSailorSet": "Spændstig Sømand (Helbreder)",
|
||||
"reefRenegadeSet": "Røver på Revet (Slyngel)",
|
||||
"scarecrowWarriorSet": "Fægtende Fugleskræmsel (Kriger)",
|
||||
"scarecrowWarriorSet": "Fugleskræmsel (Kriger)",
|
||||
"stitchWitchSet": "Skrædderheks (Magiker)",
|
||||
"potionerSet": "Eleksirmager (Helbreder)",
|
||||
"battleRogueSet": "Flager-Fusker (Slyngel)",
|
||||
@@ -86,40 +86,40 @@
|
||||
"grandMalkinSet": "Mester-malkin (Magiker)",
|
||||
"cleverDogSet": "Kløgtig Hund (Slyngel)",
|
||||
"braveMouseSet": "Modig Mus (Kriger)",
|
||||
"summer2016SharkWarriorSet": "Hajkriger (Kriger)",
|
||||
"summer2016DolphinMageSet": "Delfinmagiker (Magiker)",
|
||||
"summer2016SeahorseHealerSet": "Søhesthelbreder (Helbreder)",
|
||||
"summer2016EelSet": "Åleslyngel (Slyngel)",
|
||||
"summer2016SharkWarriorSet": "Haj (Kriger)",
|
||||
"summer2016DolphinMageSet": "Delfin (Magiker)",
|
||||
"summer2016SeahorseHealerSet": "Søhest (Helbreder)",
|
||||
"summer2016EelSet": "Ål (Slyngel)",
|
||||
"fall2016SwampThingSet": "Sump-ting (Kriger)",
|
||||
"fall2016WickedSorcererSet": "Skummel Sortkunstner (Magiker)",
|
||||
"fall2016GorgonHealerSet": "Gorgon-helbreder (Helbreder)",
|
||||
"fall2016BlackWidowSet": "Sort Enke-slyngel (Slyngel)",
|
||||
"fall2016GorgonHealerSet": "Gorgon (Helbreder)",
|
||||
"fall2016BlackWidowSet": "Sort enke (Slyngel)",
|
||||
"winter2017IceHockeySet": "Ishockey (Kriger)",
|
||||
"winter2017WinterWolfSet": "Vinterulv (Magiker)",
|
||||
"winter2017SugarPlumSet": "Sukkerblomme-helbreder (Helbreder)",
|
||||
"winter2017FrostyRogueSet": "Sukkerslyngel (Slyngel)",
|
||||
"spring2017FelineWarriorSet": "Kattekriger (Kriger)",
|
||||
"winter2017SugarPlumSet": "Sukkerblomme (Helbreder)",
|
||||
"winter2017FrostyRogueSet": "Frost (Slyngel)",
|
||||
"spring2017FelineWarriorSet": "Kattedyr (Kriger)",
|
||||
"spring2017CanineConjurorSet": "Hundehekser (Magiker)",
|
||||
"spring2017FloralMouseSet": "Blomstermus (Helbreder)",
|
||||
"spring2017SneakyBunnySet": "Krybende Kanin (Slyngel)",
|
||||
"summer2017SandcastleWarriorSet": "Sandslotskriger (Kriger)",
|
||||
"summer2017WhirlpoolMageSet": "Malstrømsmagiker (Magiker)",
|
||||
"summer2017SandcastleWarriorSet": "Sandslot (Kriger)",
|
||||
"summer2017WhirlpoolMageSet": "Malstrøm(Magiker)",
|
||||
"summer2017SeashellSeahealerSet": "Havmuslingehelbreder (Helbreder)",
|
||||
"summer2017SeaDragonSet": "Sødrage (Slyngel)",
|
||||
"fall2017HabitoweenSet": "Habitoweenkriger (Kriger)",
|
||||
"fall2017MasqueradeSet": "Maskerademagiker (Magiker)",
|
||||
"fall2017HauntedHouseSet": "Spøgelseshuslæge (Helbreder)",
|
||||
"fall2017TrickOrTreatSet": "Ballademagerbandit (Slyngel)",
|
||||
"winter2018ConfettiSet": "Konfettimagiker (Magiker)",
|
||||
"winter2018GiftWrappedSet": "Indpakket Kriger (Kriger)",
|
||||
"winter2018MistletoeSet": "Misteltenshelbreder (Helbreder)",
|
||||
"winter2018ReindeerSet": "Rendsdyrslyngel (Slyngel)",
|
||||
"spring2018SunriseWarriorSet": "Solopgangskriger (Kriger)",
|
||||
"spring2018TulipMageSet": "Tulipanmagiker (Magiker)",
|
||||
"spring2018GarnetHealerSet": "Granatrød Helbreder (Helbreder)",
|
||||
"spring2018DucklingRogueSet": "Ællingeslyngel (Slyngel)",
|
||||
"summer2018BettaFishWarriorSet": "Kampfiskkriger (Kriger)",
|
||||
"summer2018LionfishMageSet": "Dragefiskmagiker (Magiker)",
|
||||
"fall2017HabitoweenSet": "Habitoween (Kriger)",
|
||||
"fall2017MasqueradeSet": "Maskerade(Magiker)",
|
||||
"fall2017HauntedHouseSet": "Spøgelseshus (Helbreder)",
|
||||
"fall2017TrickOrTreatSet": "Ballademager (Slyngel)",
|
||||
"winter2018ConfettiSet": "Konfetti (Magiker)",
|
||||
"winter2018GiftWrappedSet": "Gavepapir (Kriger)",
|
||||
"winter2018MistletoeSet": "Mistelten (Helbreder)",
|
||||
"winter2018ReindeerSet": "Rensdyr (Slyngel)",
|
||||
"spring2018SunriseWarriorSet": "Solopgang (Kriger)",
|
||||
"spring2018TulipMageSet": "Tulipan (Magiker)",
|
||||
"spring2018GarnetHealerSet": "Granatrød (Helbreder)",
|
||||
"spring2018DucklingRogueSet": "Ælling (Slyngel)",
|
||||
"summer2018BettaFishWarriorSet": "Kampfisk (Kriger)",
|
||||
"summer2018LionfishMageSet": "Dragefisk (Magiker)",
|
||||
"summer2018MerfolkMonarchSet": "Havfruehertug(inde) (Helbreder)",
|
||||
"summer2018FisherRogueSet": "Fiskerslyngel (Slyngel)",
|
||||
"fall2018MinotaurWarriorSet": "Minotaur (Kriger)",
|
||||
@@ -131,21 +131,98 @@
|
||||
"winter2019WinterStarSet": "Vinterstjerne (Helbreder)",
|
||||
"winter2019PoinsettiaSet": "Julestjerne (Slyngel)",
|
||||
"eventAvailability": "Tilgændelig til køb indtil <%= date(locale) %>.",
|
||||
"dateEndMarch": "April 30",
|
||||
"dateEndApril": "19. april",
|
||||
"dateEndMay": "May 31",
|
||||
"dateEndJune": "Juni 14",
|
||||
"dateEndJuly": "July 31",
|
||||
"dateEndAugust": "August 31",
|
||||
"dateEndSeptember": "September 21",
|
||||
"dateEndOctober": "October 31",
|
||||
"dateEndNovember": "December 3",
|
||||
"dateEndJanuary": "January 31",
|
||||
"dateEndFebruary": "February 28",
|
||||
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION AND GET ONE FREE!",
|
||||
"winterPromoGiftDetails1": "Til og med 15. januar vil du få det samme abonnement med til dig selv, når du køber et abonnement til nogen i gave!",
|
||||
"dateEndMarch": "31. marts",
|
||||
"dateEndApril": "30. april",
|
||||
"dateEndMay": "31. maj",
|
||||
"dateEndJune": "30. juni",
|
||||
"dateEndJuly": "31. juli",
|
||||
"dateEndAugust": "31. august",
|
||||
"dateEndSeptember": "30. september",
|
||||
"dateEndOctober": "31. oktober",
|
||||
"dateEndNovember": "30. november",
|
||||
"dateEndJanuary": "31. januar",
|
||||
"dateEndFebruary": "28. februar",
|
||||
"winterPromoGiftHeader": "GIV ET ABONNEMENT I GAVE, OG FÅ ET GRATIS!",
|
||||
"winterPromoGiftDetails1": "Til og med 6. januar vil du få det samme abonnement med til dig selv, når du køber et abonnement til nogen i gave!",
|
||||
"winterPromoGiftDetails2": "Bemærk venligst, at hvis du eller modtageren af din gave allerede har et tilbagevendende abonnement, vil gave-abonnementet kun starte efter det tilbagevendende er blevet opsagt eller er udløbet. Tusind tak for din støtte! <3",
|
||||
"discountBundle": "pakke",
|
||||
"g1g1Announcement": "<strong>Giv et abonnement, få et abonnement gratis!</strong> Tilbuddet gælder lige nu!",
|
||||
"g1g1Details": "Send et gave-abonnement til en ven fra deres profil, og du vil få det samme abonnement til dig selv gratis!"
|
||||
"g1g1Announcement": "<strong>Giv et abonnement og få et abonnement gratis!</strong> Tilbuddet gælder lige nu!",
|
||||
"g1g1Details": "Send et gave-abonnement til en ven, og du vil få det samme abonnement til dig selv gratis!",
|
||||
"g1g1": "Send et, få et",
|
||||
"winter2020EvergreenSet": "Stedsegrøn (Kriger)",
|
||||
"winter2020CarolOfTheMageSet": "Magisk julesang (Magiker)",
|
||||
"winter2020WinterSpiceSet": "Vinterkrydderi (Helbreder)",
|
||||
"spring2020IrisHealerSet": "Iris (Helbreder)",
|
||||
"spring2019OrchidWarriorSet": "Orkidé (Kriger)",
|
||||
"spring2019AmberMageSet": "Rav (Magiker)",
|
||||
"summer2020OarfishMageSet": "Sildekonge (Magiker)",
|
||||
"spring2019RobinHealerSet": "Rødhals (Helbreder)",
|
||||
"summer2020SeaGlassHealerSet": "Havglas (Helbreder)",
|
||||
"spring2019CloudRogueSet": "Sky (Slyngel)",
|
||||
"fall2020DeathsHeadMothHealerSet": "Dødningehovednatsværmer (Helbreder)",
|
||||
"summer2019SeaTurtleWarriorSet": "Havskildpadde (Kriger)",
|
||||
"winter2021IceFishingWarriorSet": "Isfisker (Kriger)",
|
||||
"summer2019WaterLilyMageSet": "Åkande (Magiker)",
|
||||
"winter2021WinterMoonMageSet": "Vintermåne (Magiker)",
|
||||
"summer2019ConchHealerSet": "Konkylie (Helbreder)",
|
||||
"spring2021SwanMageSet": "Svane (Magiker)",
|
||||
"summer2019HammerheadRogueSet": "Hammerhaj (Slyngel)",
|
||||
"fall2019CyclopsSet": "Kyklop (Magiker)",
|
||||
"summer2021NautilusMageSet": "Nautilus (Magiker)",
|
||||
"summer2021ParrotHealerSet": "Papegøje (Helbreder)",
|
||||
"summer2021ClownfishRogueSet": "Klovnefisk (Slyngel)",
|
||||
"fall2020TwoHeadedRogueSet": "Tohovedet (Slyngel)",
|
||||
"spring2020PuddleMageSet": "Vandpyt (Magiker)",
|
||||
"fall2020WraithWarriorSet": "Genfærd (Kriger)",
|
||||
"summer2021FlyingFishWarriorSet": "Flyvefisk (Kriger)",
|
||||
"spring2021SunstoneWarriorSet": "Solsten (Kriger)",
|
||||
"summer2020RainbowTroutWarriorSet": "Regnbueørred (Kriger)",
|
||||
"fall2020ThirdEyeMageSet": "Treøjet (Magiker)",
|
||||
"fall2019RavenSet": "Ravn (Kriger)",
|
||||
"spring2021TwinFlowerRogueSet": "Kaprifolie (Slyngel)",
|
||||
"spring2021WillowHealerSet": "Piletræ (Helbreder)",
|
||||
"winter2020LanternSet": "Lanterne (Slyngel)",
|
||||
"spring2020BeetleWarriorSet": "Næsehornsbille (Kriger)",
|
||||
"summer2020CrocodileRogueSet": "Krokodille (Slyngel)",
|
||||
"winter2021HollyIvyRogueSet": "Kristtjørn og vedbend (Slyngel)",
|
||||
"winter2021ArcticExplorerHealerSet": "Arktisk udforsker (Helbreder)",
|
||||
"spring2020LapisLazuliRogueSet": "Lapis lazuli (Slyngel)",
|
||||
"fall2019OperaticSpecterSet": "Operaspøgelse (Slyngel)",
|
||||
"g1g1Limitations": "Dette er et tidsbegrænset tilbud der begynder d. 16. december kl. 14:00 (UTC+1), og slutter d. 6. januar kl. 02:00 (UTC+1). Dette tilbud gælder kun, når du giver et gave-abonnement til en anden Habiticaner. Hvis du eller modtageren allerede har et abonnement, vil gave-abonnementet tilføje yderligere tid, der kun vil blive brugt så snart det nuværende abonnement opsiges eller udløber.",
|
||||
"mayYYYY": "maj <%= year %>",
|
||||
"limitations": "Begrænsninger",
|
||||
"summer2022CrabRogueSet": "Krabbe (Slyngel)",
|
||||
"summer2022WaterspoutWarriorSet": "Vandsøjle (Kriger)",
|
||||
"summer2022MantaRayMageSet": "Djævlerokke (Magiker)",
|
||||
"summer2022AngelfishHealerSet": "Englefisk (Helbreder)",
|
||||
"dateEndDecember": "31. december",
|
||||
"februaryYYYY": "februar <%= year %>",
|
||||
"julyYYYY": "juli <%= year %>",
|
||||
"octoberYYYY": "oktober <%= year %>",
|
||||
"howItWorks": "Sådan virker det",
|
||||
"noLongerAvailable": "Denne genstand er ikke længere tilgængelig.",
|
||||
"spring2022MagpieRogueSet": "Skade (Slyngel)",
|
||||
"spring2022RainstormWarriorSet": "Uvejr (Kriger)",
|
||||
"spring2022ForsythiaMageSet": "Forsythia (Magiker)",
|
||||
"g1g1HowItWorks": "Skriv brugernavnet på den konto, du vil sende gave-abonnementet til. Derefter skal du vælge længden på abonnementet, og så checke ud. Din konto vil automatisk få tildelt den samme type abonnement, du lige har givet en anden.",
|
||||
"fall2021OozeRogueSet": "Slim (Slyngel)",
|
||||
"fall2021HeadlessWarriorSet": "Hovedløs (Kriger)",
|
||||
"fall2021BrainEaterMageSet": "Hjerneæder (Magiker)",
|
||||
"fall2021FlameSummonerHealerSet": "Flammehidkalder (Helbreder)",
|
||||
"eventAvailabilityReturning": "Kan købes indtil <%= availableDate(locale) %>. Denne eliksir var sidst tilgængelig <%= previousDate(locale) %>.",
|
||||
"septemberYYYY": "september <%= year %>",
|
||||
"marchYYYY": "marts <%= year %>",
|
||||
"juneYYYY": "juni <%= year %>",
|
||||
"novemberYYYY": "november <%= year %>",
|
||||
"decemberYYYY": "december <%= year %>",
|
||||
"augustYYYY": "august <%= year %>",
|
||||
"winter2022FireworksRogueSet": "Fyrværkeri (Slyngel)",
|
||||
"winter2022StockingWarriorSet": "Julesok (Kriger)",
|
||||
"winter2022PomegranateMageSet": "Granatæble (Magiker)",
|
||||
"winter2022IceCrystalHealerSet": "Iskrystal (Helbreder)",
|
||||
"g1g1Event": "Send et, få et - tilbuddet gælder nu!",
|
||||
"g1g1Returning": "For at fejre nytåret bringer vi et ganske særligt tilbud tilbage. Lige nu, når du køber et abonnement som gave, får du det samme abonnement selv!",
|
||||
"januaryYYYY": "januar <%= year %>",
|
||||
"aprilYYYY": "april <%= year %>",
|
||||
"royalPurpleJackolantern": "Purpur Græskarlygte"
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
"mattBochText1": "Velkommen til Stalden! Jeg er Staldmesteren Matt. Hver gang du færdiggør en opgave, vil du have en chance for at modtage et tilfældigt Æg eller Udklækningseliksir til at udklække Kæledyr. Når du udruger et Kæledyr, vil det dukke op her! Klik på billedet af Kæledyret for at føje det til din Avatar. Giv dem det Dyrefoder du finder, og de vil vokse sig til kraftfulde Ridedyr.",
|
||||
"welcomeToTavern": "Velkommen til Værtshuset!",
|
||||
"sleepDescription": "Har du brug for en pause? Check ind i Daniels Værtshus for at sætte nogle af Habiticas svære elementer på pause:",
|
||||
"sleepBullet1": "Missede Daglige vil ikke skade dig",
|
||||
"sleepBullet2": "Opgavers stribe-præstation vil ikke blive tabt",
|
||||
"sleepBullet3": "Bosser vil ikke skade dig på grund af dine egne missede Daglige",
|
||||
"sleepBullet1": "Dine missede Daglige vil ikke skade dig (bosser vil stadig kunne skade dig baseret på andre Holdmedlemmers missede Daglige)",
|
||||
"sleepBullet2": "Dagliges stribe-præstation og Vanetæller vil ikke blive nulstillet",
|
||||
"sleepBullet3": "Den skade, du vil påføre bossen, eller dine indsamlede questgenstande, vil først tælle med i questen, når du checker ud af Værtshuset",
|
||||
"sleepBullet4": "Du vil beholde din afventende skade til bosser eller indsamlede questgenstande indtil du checker ud",
|
||||
"pauseDailies": "Sæt skade på pause",
|
||||
"unpauseDailies": "Skade er ikke længere på pause",
|
||||
@@ -129,5 +129,6 @@
|
||||
"cannotUnpinItem": "Denne genstand kan ikke frigøres.",
|
||||
"nMonthsSubscriptionGift": "<%= nMonths %> Måned(ers) Abonnement (Gave)",
|
||||
"nGemsGift": "<%= nGems %> Ædelsten (Gave)",
|
||||
"nGems": "<%= nGems %> Ædelsten"
|
||||
"nGems": "<%= nGems %> Ædelsten",
|
||||
"amountExp": "<%= amount %> Exp"
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"needTips": "Brug for noget hjælp til at starte? Her er en enkel guide!",
|
||||
"step1": "Trin 1: Indtast opgaver",
|
||||
"webStep1Text": "Habitica er intet uden mål i det virkelige liv, så opret et par opgaver. Du kan altid tilføje flere! Alle opgaver kan tilføjes ved at klikke på den grønne 'Opret' knap.\n* **Opret [To-Dos](http://habitica.fandom.com/wiki/To-Dos):** Tilføj opgaver, du kun skal gøre én gang, eller sjældent, i kolonnen 'To-Dos', en af gangen. Du kan klikke på opgaverne for at redigere dem og tilføje checklister, forfaldsdag og mere!\n* **Opret [Daglige](http://habitica.fandom.com/wiki/Dailies):** Tilføj aktiviteter, du skal klare hver dag, eller på en bestemt dag i ugen, måneden, eller året i kolonnen 'Daglige'. Klik på en opgaver for at ændre, hvornår den skal være forfalden og/eller fastsætte en startdato. Du kan også sætte den til at være forfalden med jævne mellemrum, for eksempel hver tredje dag.\n* **Opret [Vaner](http://habitica.fandom.com/wiki/Habits):** Tilføj vaner, du gerne vil tillægge dig, i kolonnen 'Vaner'. Du kan ændre Vanen for kun at gøre den til en god vane :heavy_plus_sign: eller en dårlig vane :heavy_minus_sign:\n* **Opret [Belønninger](http://habitica.fandom.com/wiki/Rewards):** Udover de Belønninger, der tilbydes i spillet, kan du tilføje aktiviteter eller små gaver/lækkerier, du kan bruge som motivation, i kolonnen 'Belønninger'. Det er vigtigt at give dig selv en pause eller tillade en lille luksus sommetider!\n* Hvis du har brug for inspiration til dine opgaver, kan du se [eksempler på Vaner](http://habitica.fandom.com/wiki/Sample_Habits), [eksempler på Daglige](http://habitica.fandom.com/wiki/Sample_Dailies), [eksempler på To-Dos](http://habitica.fandom.com/wiki/Sample_To-Dos), og [eksempler på Belønninger](http://habitica.fandom.com/wiki/Sample_Custom_Rewards) på wiki'en (engelsk).",
|
||||
"webStep1Text": "Habitica er intet uden mål i det virkelige liv, så opret et par opgaver. Du kan altid tilføje flere! Alle opgaver kan tilføjes ved at klikke på den grønne 'Opret' knap.\n* **Opret [To Do's](https://habitica.fandom.com/wiki/To_Do%27s):** Tilføj opgaver, du kun skal gøre én gang, eller sjældent, i kolonnen To Do's, en af gangen. Du kan klikke på opgaverne for at redigere dem og tilføje checklister, forfaldsdag og mere!\n* **Opret [Daglige](https://habitica.fandom.com/wiki/Dailies):** Tilføj aktiviteter, du skal klare hver dag, eller på en bestemt dag i ugen, måneden, eller året i kolonnen 'Daglige'. Klik på en opgaver for at ændre, hvornår den skal være forfalden og/eller fastsætte en startdato. Du kan også sætte den til at være forfalden med jævne mellemrum, for eksempel hver tredje dag.\n* **Opret [Vaner](https://habitica.fandom.com/wiki/Habits):** Tilføj vaner, du gerne vil tillægge dig, i kolonnen 'Vaner'. Du kan ændre Vanen for kun at gøre den til en god vane :heavy_plus_sign: eller en dårlig vane :heavy_minus_sign:\n* **Opret [Belønninger](https://habitica.fandom.com/wiki/Rewards):** Udover de Belønninger, der tilbydes i spillet, kan du tilføje aktiviteter eller små gaver/lækkerier, du kan bruge som motivation, i kolonnen 'Belønninger'. Det er vigtigt at give dig selv en pause eller tillade en lille luksus sommetider!\n* Hvis du har brug for inspiration til dine opgaver, kan du se [eksempler på Vaner](https://habitica.fandom.com/wiki/Sample_Habits), [eksempler på Daglige](https://habitica.fandom.com/wiki/Sample_Dailies), [eksempler på To Do's](https://habitica.fandom.com/wiki/Sample_To_Do%27s), og [eksempler på Belønninger](https://habitica.fandom.com/wiki/Sample_Custom_Rewards) på wiki'en (engelsk).",
|
||||
"step2": "Trin 2: Optjen Point ved at gøre ting i det virkelig liv",
|
||||
"webStep2Text": "Begynd nu på dine mål fra listen! Efterhånden som du fuldfører opgaver og krydser dem af i Habitica vil du få [Erfaring](http://habitica.fandom.com/wiki/Experience_Points), som vil lade dig stige i niveau, og [Guld](http://habitica.fandom.com/wiki/Gold_Points), som du kan købe Belønninger for. Hvis du giver efter for dårlige vaner eller misser dine Daglige, vil du miste [Liv](http://habitica.fandom.com/wiki/Health_Points). På denne måde vil Habiticas Erfarings- og Helbredsbjælker være en morsom indikater for fremskridt mod dine mål. Du vil begynde at se forbedringer i dit virkelige liv mens din karakter avancerer i spillet.",
|
||||
"webStep2Text": "Begynd nu på dine mål fra listen! Efterhånden som du fuldfører opgaver og krydser dem af i Habitica vil du få [Erfaring](https://habitica.fandom.com/wiki/Experience_Points), som vil lade dig stige i niveau, og [Guld](https://habitica.fandom.com/wiki/Gold_Points), som du kan købe Belønninger for. Hvis du giver efter for dårlige vaner eller misser dine Daglige, vil du miste [Liv](https://habitica.fandom.com/wiki/Health_Points). På denne måde vil Habiticas Erfarings- og Helbredsbjælker være en morsom indikator for fremskridt mod dine mål. Du vil begynde at se forbedringer i dit virkelige liv, mens din karakter avancerer i spillet.",
|
||||
"step3": "Trin 3: Brugerdefiner og udforsk Habitica",
|
||||
"webStep3Text": "Når du er blevet tryg ved nøglefunktionerne, kan du få endnu mere ud af Habitica med de følgende fikse detaljer:\n * Hold styr på dine opgaver med [tags](http://habitica.fandom.com/wiki/Tags) (rediger en opgave for at tilføje dem).\n * Tilpas din [avatar](http://habitica.fandom.com/wiki/Avatar) ved at klikke på brugerikonet i øverste højre hjørne.\n * Køb [Udstyr](http://habitica.fandom.com/wiki/Equipment) under Belønninger eller fra [Butikkerne](<%= shopUrl %>), og skift det ud under [Inventar > Udstyr](<%= equipUrl %>).\n * Sig hej til andre brugere i [Værtshuset](http://habitica.fandom.com/wiki/Tavern).\n * Fra niveau 3 kan du udklække [Kæledyr](http://habitica.fandom.com/wiki/Pets) ved at samle [æg](http://habitica.fandom.com/wiki/Eggs) og [udrugningseliksirer](http://habitica.fandom.com/wiki/Hatching_Potions). [Fodr](http://habitica.fandom.com/wiki/Food) dem for at få [Ridedyr](http://habitica.fandom.com/wiki/Mounts).\n * Fra niveau 10 kan du vælge en [klasse](http://habitica.fandom.com/wiki/Class_System), og får adgang til specielle [evner](http://habitica.fandom.com/wiki/Skills) (låses op fra niveau 11 til 14).\n * Lav et hold med dine venner (ved at klikke på [Hold](<%= partyUrl %>) i navigationsbarren), for at blive holdt ansvarlig og få en Questskriftrulle.\n * Du kan besejre monstre og indsamle genstande på [quests](http://habitica.fandom.com/wiki/Quests) (du vil få en quest på niveau 15).",
|
||||
"webStep3Text": "Når du er blevet tryg ved nøglefunktionerne, kan du få endnu mere ud af Habitica med de følgende fikse detaljer:\n * Hold styr på dine opgaver med [tags](https://habitica.fandom.com/wiki/Tags) (rediger en opgave for at tilføje dem).\n * Tilpas din [avatar](https://habitica.fandom.com/wiki/Avatar) ved at klikke på brugerikonet i øverste højre hjørne.\n * Køb [udstyr](https://habitica.fandom.com/wiki/Equipment) under Belønninger eller fra [Butikkerne](<%= shopUrl %>), og skift det ud under [Inventar > Udstyr](<%= equipUrl %>).\n * Sig hej til andre brugere i [Værtshuset](https://habitica.fandom.com/wiki/Tavern).\n * Udklæk [kæledyr](https://habitica.fandom.com/wiki/Pets) ved at samle [æg](https://habitica.fandom.com/wiki/Eggs) og [udrugningseliksirer](https://habitica.fandom.com/wiki/Hatching_Potions). [Fodr](https://habitica.fandom.com/wiki/Food) dem for at få [ridedyr](https://habitica.fandom.com/wiki/Mounts).\n * Fra niveau 10 kan du vælge en [klasse](https://habitica.fandom.com/wiki/Class_System), og får adgang til specielle [evner](https://habitica.fandom.com/wiki/Skills) (låses op fra niveau 11 til 14).\n * Lav et hold med dine venner (ved at klikke på [Hold](<%= partyUrl %>) i navigationsbarren), for at blive holdt ansvarlig og få en Questskriftrulle.\n * Du kan besejre monstre og indsamle genstande på [quests](https://habitica.fandom.com/wiki/Quests) (du vil få en quest på niveau 15).",
|
||||
"overviewQuestions": "Har du flere spørgsmål? Læs vores [FAQ](<%= faqUrl %>)! Hvis du ikke kan finde et svar der, kan du bede om hjælp i Klanen [Habitica Help](<%= helpGuildUrl %>).\n\nHeld og lykke med dine opgaver!"
|
||||
}
|
||||
|
||||
@@ -23,12 +23,12 @@
|
||||
"mantisShrimp": "Knælerreje",
|
||||
"mammoth": "Ulden mammut",
|
||||
"orca": "Spækhugger",
|
||||
"royalPurpleGryphon": "Royal Lilla Grif",
|
||||
"royalPurpleGryphon": "Purpur Grif",
|
||||
"phoenix": "Føniks",
|
||||
"magicalBee": "Magisk bi",
|
||||
"hopefulHippogriffPet": "Håbefuld hippogrif",
|
||||
"hopefulHippogriffMount": "Håbefuld hippogrif",
|
||||
"royalPurpleJackalope": "Royal Lilla Jackalope",
|
||||
"royalPurpleJackalope": "Purpur Jackalope",
|
||||
"invisibleAether": "Usynlig æter",
|
||||
"potion": "<%= potionType %> eliksir",
|
||||
"egg": "<%= eggType %> æg",
|
||||
@@ -44,8 +44,8 @@
|
||||
"noFoodAvailable": "Du har ikke noget Dyrefoder.",
|
||||
"noSaddlesAvailable": "Du har ikke nogle sadler.",
|
||||
"noFood": "Du har hverken mad eller sadler.",
|
||||
"dropsExplanation": "Du kan få fat i disse ting hurtigere med ædelsten, hvis du ikke længere vil vente på at finde dem når du gennemfører en opgave. <a href=\"http://habitica.fandom.com/wiki/Drops\">Lær mere om drop-systemet.</a>",
|
||||
"dropsExplanationEggs": "Brug Ædelsten for hurtigere at få æg, hvis du ikke vil vente på at få standard-æg som drops, eller gentage Quests for at vinde Quest-æg. <a href=\"http://habitica.fandom.com/wiki/Drops\">Læs mere om dropsystemet her.</a>",
|
||||
"dropsExplanation": "Du kan få fat i disse ting hurtigere med ædelsten, hvis du ikke længere vil vente på at finde dem når du gennemfører en opgave. <a href=\"https://habitica.fandom.com/wiki/Drops\">Lær mere om drop-systemet.</a>",
|
||||
"dropsExplanationEggs": "Brug Ædelsten for hurtigere at få æg, hvis du ikke vil vente på at få standard-æg som drops, eller gentage Quests for at vinde Quest-æg. <a href=\"https://habitica.fandom.com/wiki/Drops\">Læs mere om dropsystemet her.</a>",
|
||||
"premiumPotionNoDropExplanation": "Magiske udrugningseliksirer kan ikke blive brugt på æg, der er modtaget fra quests. Den eneste måde at få en magisk udrugningseliksir på, er ved at købe dem nedenfor, ikke fra tilfældige drop.",
|
||||
"beastMasterProgress": "Dyretæmmerfremskridt",
|
||||
"beastAchievement": "Du har opnået \"Dyretæmmer\"-præstationen ved at samle alle kæledyr!",
|
||||
|
||||