Compare commits
1 Commits
v4.263.1
...
phillip/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a018588021 |
@@ -1,108 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
const MIGRATION_NAME = '20221213_pet_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['BearCub-Base']
|
|
||||||
&& pets['BearCub-CottonCandyBlue']
|
|
||||||
&& pets['BearCub-CottonCandyPink']
|
|
||||||
&& pets['BearCub-Desert']
|
|
||||||
&& pets['BearCub-Golden']
|
|
||||||
&& pets['BearCub-Red']
|
|
||||||
&& pets['BearCub-Shade']
|
|
||||||
&& pets['BearCub-Skeleton']
|
|
||||||
&& pets['BearCub-White']
|
|
||||||
&& pets['BearCub-Zombie']
|
|
||||||
&& pets['Fox-Base']
|
|
||||||
&& pets['Fox-CottonCandyBlue']
|
|
||||||
&& pets['Fox-CottonCandyPink']
|
|
||||||
&& pets['Fox-Desert']
|
|
||||||
&& pets['Fox-Golden']
|
|
||||||
&& pets['Fox-Red']
|
|
||||||
&& pets['Fox-Shade']
|
|
||||||
&& pets['Fox-Skeleton']
|
|
||||||
&& pets['Fox-White']
|
|
||||||
&& pets['Fox-Zombie']
|
|
||||||
&& pets['Penguin-Base']
|
|
||||||
&& pets['Penguin-CottonCandyBlue']
|
|
||||||
&& pets['Penguin-CottonCandyPink']
|
|
||||||
&& pets['Penguin-Desert']
|
|
||||||
&& pets['Penguin-Golden']
|
|
||||||
&& pets['Penguin-Red']
|
|
||||||
&& pets['Penguin-Shade']
|
|
||||||
&& pets['Penguin-Skeleton']
|
|
||||||
&& pets['Penguin-White']
|
|
||||||
&& pets['Penguin-Zombie']
|
|
||||||
&& pets['Whale-Base']
|
|
||||||
&& pets['Whale-CottonCandyBlue']
|
|
||||||
&& pets['Whale-CottonCandyPink']
|
|
||||||
&& pets['Whale-Desert']
|
|
||||||
&& pets['Whale-Golden']
|
|
||||||
&& pets['Whale-Red']
|
|
||||||
&& pets['Whale-Shade']
|
|
||||||
&& pets['Whale-Skeleton']
|
|
||||||
&& pets['Whale-White']
|
|
||||||
&& pets['Whale-Zombie']
|
|
||||||
&& pets['Wolf-Base']
|
|
||||||
&& pets['Wolf-CottonCandyBlue']
|
|
||||||
&& pets['Wolf-CottonCandyPink']
|
|
||||||
&& pets['Wolf-Desert']
|
|
||||||
&& pets['Wolf-Golden']
|
|
||||||
&& pets['Wolf-Red']
|
|
||||||
&& pets['Wolf-Shade']
|
|
||||||
&& pets['Wolf-Skeleton']
|
|
||||||
&& pets['Wolf-White']
|
|
||||||
&& pets['Wolf-Zombie'] {
|
|
||||||
set['achievements.polarPro'] = 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-11-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,144 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
const MIGRATION_NAME = '20221227_nye';
|
|
||||||
import { model as User } from '../../../website/server/models/user';
|
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
|
|
||||||
const progressCount = 1000;
|
|
||||||
let count = 0;
|
|
||||||
|
|
||||||
async function updateUser (user) {
|
|
||||||
count++;
|
|
||||||
|
|
||||||
const set = { migration: MIGRATION_NAME };
|
|
||||||
let push;
|
|
||||||
|
|
||||||
if (typeof user.items.gear.owned.head_special_nye2021 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2022'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2022',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye2020 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2021'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2021',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye2019 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2020'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2020',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye2018 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2019'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2019',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye2017 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2018'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2018',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye2016 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2017'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2017',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2016'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2016',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2015'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2015',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') {
|
|
||||||
set['items.gear.owned.head_special_nye2014'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye2014',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
} else {
|
|
||||||
set['items.gear.owned.head_special_nye'] = false;
|
|
||||||
push = [
|
|
||||||
{
|
|
||||||
type: 'marketGear',
|
|
||||||
path: 'gear.flat.head_special_nye',
|
|
||||||
_id: uuid(),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
|
||||||
|
|
||||||
return await User.update({_id: user._id}, {$set: set, $push: {pinnedItems: {$each: push}}}).exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async function processUsers () {
|
|
||||||
let query = {
|
|
||||||
'auth.timestamps.loggedin': {$gt: new Date('2022-12-01')},
|
|
||||||
migration: {$ne: MIGRATION_NAME},
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
import { model as User } from '../../../website/server/models/user';
|
|
||||||
|
|
||||||
const MIGRATION_NAME = '20230123_habit_birthday';
|
|
||||||
const progressCount = 1000;
|
|
||||||
let count = 0;
|
|
||||||
|
|
||||||
async function updateUser (user) {
|
|
||||||
count += 1;
|
|
||||||
|
|
||||||
const inc = { 'balance': 5 };
|
|
||||||
const set = {};
|
|
||||||
const push = {};
|
|
||||||
|
|
||||||
set.migration = MIGRATION_NAME;
|
|
||||||
|
|
||||||
if (typeof user.items.gear.owned.armor_special_birthday2022 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2023'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday2021 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2022'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday2020 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2021'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday2019 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2020'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday2018 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2019'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday2017 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2018'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday2016 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2017'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday2015 !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2016'] = true;
|
|
||||||
} else if (typeof user.items.gear.owned.armor_special_birthday !== 'undefined') {
|
|
||||||
set['items.gear.owned.armor_special_birthday2015'] = true;
|
|
||||||
} else {
|
|
||||||
set['items.gear.owned.armor_special_birthday'] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
push.notifications = {
|
|
||||||
type: 'ITEM_RECEIVED',
|
|
||||||
data: {
|
|
||||||
icon: 'notif_head_special_nye',
|
|
||||||
title: 'Birthday Bash Day 1!',
|
|
||||||
text: 'Enjoy your new Birthday Robe and 20 Gems on us!',
|
|
||||||
destination: 'equipment',
|
|
||||||
},
|
|
||||||
seen: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
|
||||||
|
|
||||||
return await User.update({_id: user._id}, {$inc: inc, $set: set, $push: push}).exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async function processUsers () {
|
|
||||||
let query = {
|
|
||||||
migration: {$ne: MIGRATION_NAME},
|
|
||||||
'auth.timestamps.loggedin': {$gt: new Date('2022-12-23')},
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
import { model as User } from '../../../website/server/models/user';
|
|
||||||
|
|
||||||
const MIGRATION_NAME = '20230127_habit_birthday_day5';
|
|
||||||
const progressCount = 1000;
|
|
||||||
let count = 0;
|
|
||||||
|
|
||||||
async function updateUser (user) {
|
|
||||||
count += 1;
|
|
||||||
|
|
||||||
const set = {};
|
|
||||||
const push = {};
|
|
||||||
|
|
||||||
set.migration = MIGRATION_NAME;
|
|
||||||
|
|
||||||
set['items.gear.owned.back_special_anniversary'] = true;
|
|
||||||
set['items.gear.owned.body_special_anniversary'] = true;
|
|
||||||
set['items.gear.owned.eyewear_special_anniversary'] = true;
|
|
||||||
|
|
||||||
push.notifications = {
|
|
||||||
type: 'ITEM_RECEIVED',
|
|
||||||
data: {
|
|
||||||
icon: 'notif_head_special_nye',
|
|
||||||
title: 'Birthday Bash Day 5!',
|
|
||||||
text: 'Come celebrate by wearing your new Habitica Hero Cape, Collar, and Mask!',
|
|
||||||
destination: 'equipment',
|
|
||||||
},
|
|
||||||
seen: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
|
||||||
|
|
||||||
return await User.update({_id: user._id}, {$set: set, $push: push}).exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async function processUsers () {
|
|
||||||
let query = {
|
|
||||||
migration: {$ne: MIGRATION_NAME},
|
|
||||||
'auth.timestamps.loggedin': {$gt: new Date('2022-12-23')},
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
import { model as User } from '../../../website/server/models/user';
|
|
||||||
|
|
||||||
const MIGRATION_NAME = '20230201_habit_birthday_day10';
|
|
||||||
const progressCount = 1000;
|
|
||||||
let count = 0;
|
|
||||||
|
|
||||||
async function updateUser (user) {
|
|
||||||
count += 1;
|
|
||||||
|
|
||||||
const set = {
|
|
||||||
migration: MIGRATION_NAME,
|
|
||||||
'purchased.background.birthday_bash': true,
|
|
||||||
};
|
|
||||||
const push = {
|
|
||||||
notifications: {
|
|
||||||
type: 'ITEM_RECEIVED',
|
|
||||||
data: {
|
|
||||||
icon: 'notif_head_special_nye',
|
|
||||||
title: 'Birthday Bash Day 10!',
|
|
||||||
text: 'Join in for the end of our birthday celebrations with 10th Birthday background, Cake, and achievement!',
|
|
||||||
destination: 'backgrounds',
|
|
||||||
},
|
|
||||||
seen: false,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
const inc = {
|
|
||||||
'items.food.Cake_Skeleton': 1,
|
|
||||||
'items.food.Cake_Base': 1,
|
|
||||||
'items.food.Cake_CottonCandyBlue': 1,
|
|
||||||
'items.food.Cake_CottonCandyPink': 1,
|
|
||||||
'items.food.Cake_Shade': 1,
|
|
||||||
'items.food.Cake_White': 1,
|
|
||||||
'items.food.Cake_Golden': 1,
|
|
||||||
'items.food.Cake_Zombie': 1,
|
|
||||||
'items.food.Cake_Desert': 1,
|
|
||||||
'items.food.Cake_Red': 1,
|
|
||||||
'achievements.habitBirthdays': 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
|
|
||||||
|
|
||||||
return await User.update({_id: user._id}, {$set: set, $push: push, $inc: inc }).exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async function processUsers () {
|
|
||||||
let query = {
|
|
||||||
migration: {$ne: MIGRATION_NAME},
|
|
||||||
'auth.timestamps.loggedin': {$gt: new Date('2022-12-23')},
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -3,7 +3,7 @@ import { v4 as uuid } from 'uuid';
|
|||||||
|
|
||||||
import { model as User } from '../../website/server/models/user';
|
import { model as User } from '../../website/server/models/user';
|
||||||
|
|
||||||
const MIGRATION_NAME = '20230314_pi_day';
|
const MIGRATION_NAME = '20220314_pi_day';
|
||||||
|
|
||||||
const progressCount = 1000;
|
const progressCount = 1000;
|
||||||
let count = 0;
|
let count = 0;
|
||||||
@@ -54,7 +54,7 @@ async function updateUser (user) {
|
|||||||
export default async function processUsers () {
|
export default async function processUsers () {
|
||||||
const query = {
|
const query = {
|
||||||
migration: { $ne: MIGRATION_NAME },
|
migration: { $ne: MIGRATION_NAME },
|
||||||
'auth.timestamps.loggedin': { $gt: new Date('2023-02-15') },
|
'auth.timestamps.loggedin': { $gt: new Date('2022-02-15') },
|
||||||
};
|
};
|
||||||
|
|
||||||
const fields = {
|
const fields = {
|
||||||
|
|||||||
808
package-lock.json
generated
24
package.json
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "habitica",
|
"name": "habitica",
|
||||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||||
"version": "4.263.1",
|
"version": "4.251.0",
|
||||||
"main": "./website/server/index.js",
|
"main": "./website/server/index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^7.20.12",
|
"@babel/core": "^7.19.6",
|
||||||
"@babel/preset-env": "^7.20.2",
|
"@babel/preset-env": "^7.20.2",
|
||||||
"@babel/register": "^7.18.9",
|
"@babel/register": "^7.18.9",
|
||||||
"@google-cloud/trace-agent": "^7.1.2",
|
"@google-cloud/trace-agent": "^7.1.2",
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"accepts": "^1.3.8",
|
"accepts": "^1.3.8",
|
||||||
"amazon-payments": "^0.2.9",
|
"amazon-payments": "^0.2.9",
|
||||||
"amplitude": "^6.0.0",
|
"amplitude": "^6.0.0",
|
||||||
"apidoc": "^0.54.0",
|
"apidoc": "^0.53.1",
|
||||||
"apple-auth": "^1.0.7",
|
"apple-auth": "^1.0.7",
|
||||||
"bcrypt": "^5.1.0",
|
"bcrypt": "^5.1.0",
|
||||||
"body-parser": "^1.20.1",
|
"body-parser": "^1.20.1",
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"express-basic-auth": "^1.2.1",
|
"express-basic-auth": "^1.2.1",
|
||||||
"express-validator": "^5.2.0",
|
"express-validator": "^5.2.0",
|
||||||
"glob": "^8.1.0",
|
"glob": "^8.0.3",
|
||||||
"got": "^11.8.3",
|
"got": "^11.8.3",
|
||||||
"gulp": "^4.0.0",
|
"gulp": "^4.0.0",
|
||||||
"gulp-babel": "^8.0.0",
|
"gulp-babel": "^8.0.0",
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
"nconf": "^0.12.0",
|
"nconf": "^0.12.0",
|
||||||
"node-gcm": "^1.0.5",
|
"node-gcm": "^1.0.5",
|
||||||
"on-headers": "^1.0.2",
|
"on-headers": "^1.0.2",
|
||||||
"passport": "^0.5.0",
|
"passport": "^0.6.0",
|
||||||
"passport-facebook": "^3.0.0",
|
"passport-facebook": "^3.0.0",
|
||||||
"passport-google-oauth2": "^0.2.0",
|
"passport-google-oauth2": "^0.2.0",
|
||||||
"passport-google-oauth20": "2.0.0",
|
"passport-google-oauth20": "2.0.0",
|
||||||
@@ -67,12 +67,12 @@
|
|||||||
"remove-markdown": "^0.5.0",
|
"remove-markdown": "^0.5.0",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"short-uuid": "^4.2.2",
|
"short-uuid": "^4.2.2",
|
||||||
"stripe": "^11.10.0",
|
"stripe": "^10.13.0",
|
||||||
"superagent": "^8.0.6",
|
"superagent": "^8.0.5",
|
||||||
"universal-analytics": "^0.5.3",
|
"universal-analytics": "^0.5.3",
|
||||||
"useragent": "^2.1.9",
|
"useragent": "^2.1.9",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^8.3.2",
|
||||||
"validator": "^13.9.0",
|
"validator": "^13.7.0",
|
||||||
"vinyl-buffer": "^1.0.1",
|
"vinyl-buffer": "^1.0.1",
|
||||||
"winston": "^3.8.2",
|
"winston": "^3.8.2",
|
||||||
"winston-loggly-bulk": "^3.2.1",
|
"winston-loggly-bulk": "^3.2.1",
|
||||||
@@ -110,11 +110,11 @@
|
|||||||
"apidoc": "gulp apidoc"
|
"apidoc": "gulp apidoc"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"axios": "^1.2.2",
|
"axios": "^0.27.2",
|
||||||
"chai": "^4.3.7",
|
"chai": "^4.3.7",
|
||||||
"chai-as-promised": "^7.1.1",
|
"chai-as-promised": "^7.1.1",
|
||||||
"chai-moment": "^0.1.0",
|
"chai-moment": "^0.1.0",
|
||||||
"chalk": "^5.2.0",
|
"chalk": "^5.1.2",
|
||||||
"cross-spawn": "^7.0.3",
|
"cross-spawn": "^7.0.3",
|
||||||
"expect.js": "^0.3.1",
|
"expect.js": "^0.3.1",
|
||||||
"istanbul": "^1.1.0-alpha.1",
|
"istanbul": "^1.1.0-alpha.1",
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
"monk": "^7.3.4",
|
"monk": "^7.3.4",
|
||||||
"require-again": "^2.0.0",
|
"require-again": "^2.0.0",
|
||||||
"run-rs": "^0.7.7",
|
"run-rs": "^0.7.7",
|
||||||
"sinon": "^15.0.1",
|
"sinon": "^14.0.2",
|
||||||
"sinon-chai": "^3.7.0",
|
"sinon-chai": "^3.7.0",
|
||||||
"sinon-stub-promise": "^4.0.0"
|
"sinon-stub-promise": "^4.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ describe('Amazon Payments - Checkout', () => {
|
|||||||
let closeOrderReferenceSpy;
|
let closeOrderReferenceSpy;
|
||||||
|
|
||||||
let paymentBuyGemsStub;
|
let paymentBuyGemsStub;
|
||||||
let paymentCreateSubscriptionStub;
|
let paymentCreateSubscritionStub;
|
||||||
let amount = gemsBlock.price / 100;
|
let amount = gemsBlock.price / 100;
|
||||||
|
|
||||||
function expectOrderReferenceSpy () {
|
function expectOrderReferenceSpy () {
|
||||||
@@ -85,8 +85,8 @@ describe('Amazon Payments - Checkout', () => {
|
|||||||
paymentBuyGemsStub = sinon.stub(payments, 'buyGems');
|
paymentBuyGemsStub = sinon.stub(payments, 'buyGems');
|
||||||
paymentBuyGemsStub.resolves({});
|
paymentBuyGemsStub.resolves({});
|
||||||
|
|
||||||
paymentCreateSubscriptionStub = sinon.stub(payments, 'createSubscription');
|
paymentCreateSubscritionStub = sinon.stub(payments, 'createSubscription');
|
||||||
paymentCreateSubscriptionStub.resolves({});
|
paymentCreateSubscritionStub.resolves({});
|
||||||
|
|
||||||
sinon.stub(common, 'uuid').returns('uuid-generated');
|
sinon.stub(common, 'uuid').returns('uuid-generated');
|
||||||
sandbox.stub(gems, 'validateGiftMessage');
|
sandbox.stub(gems, 'validateGiftMessage');
|
||||||
@@ -109,7 +109,6 @@ describe('Amazon Payments - Checkout', () => {
|
|||||||
user,
|
user,
|
||||||
paymentMethod,
|
paymentMethod,
|
||||||
headers,
|
headers,
|
||||||
sku: undefined,
|
|
||||||
};
|
};
|
||||||
if (gift) {
|
if (gift) {
|
||||||
expectedArgs.gift = gift;
|
expectedArgs.gift = gift;
|
||||||
@@ -216,14 +215,13 @@ describe('Amazon Payments - Checkout', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
gift.member = receivingUser;
|
gift.member = receivingUser;
|
||||||
expect(paymentCreateSubscriptionStub).to.be.calledOnce;
|
expect(paymentCreateSubscritionStub).to.be.calledOnce;
|
||||||
expect(paymentCreateSubscriptionStub).to.be.calledWith({
|
expect(paymentCreateSubscritionStub).to.be.calledWith({
|
||||||
user,
|
user,
|
||||||
paymentMethod: amzLib.constants.PAYMENT_METHOD_GIFT,
|
paymentMethod: amzLib.constants.PAYMENT_METHOD_GIFT,
|
||||||
headers,
|
headers,
|
||||||
gift,
|
gift,
|
||||||
gemsBlock: undefined,
|
gemsBlock: undefined,
|
||||||
sku: undefined,
|
|
||||||
});
|
});
|
||||||
expectAmazonStubs();
|
expectAmazonStubs();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ const { i18n } = common;
|
|||||||
describe('Apple Payments', () => {
|
describe('Apple Payments', () => {
|
||||||
const subKey = 'basic_3mo';
|
const subKey = 'basic_3mo';
|
||||||
|
|
||||||
describe('verifyPurchase', () => {
|
describe('verifyGemPurchase', () => {
|
||||||
let sku; let user; let token; let receipt; let
|
let sku; let user; let token; let receipt; let
|
||||||
headers;
|
headers;
|
||||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let paymentBuySkuStub; let
|
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let paymentBuyGemsStub; let
|
||||||
iapGetPurchaseDataStub; let validateGiftMessageStub;
|
iapGetPurchaseDataStub; let validateGiftMessageStub;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@@ -36,7 +36,7 @@ describe('Apple Payments', () => {
|
|||||||
productId: 'com.habitrpg.ios.Habitica.21gems',
|
productId: 'com.habitrpg.ios.Habitica.21gems',
|
||||||
transactionId: token,
|
transactionId: token,
|
||||||
}]);
|
}]);
|
||||||
paymentBuySkuStub = sinon.stub(payments, 'buySkuItem').resolves({});
|
paymentBuyGemsStub = sinon.stub(payments, 'buyGems').resolves({});
|
||||||
validateGiftMessageStub = sinon.stub(gems, 'validateGiftMessage');
|
validateGiftMessageStub = sinon.stub(gems, 'validateGiftMessage');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ describe('Apple Payments', () => {
|
|||||||
iap.validate.restore();
|
iap.validate.restore();
|
||||||
iap.isValidated.restore();
|
iap.isValidated.restore();
|
||||||
iap.getPurchaseData.restore();
|
iap.getPurchaseData.restore();
|
||||||
payments.buySkuItem.restore();
|
payments.buyGems.restore();
|
||||||
gems.validateGiftMessage.restore();
|
gems.validateGiftMessage.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ describe('Apple Payments', () => {
|
|||||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||||
.returns(false);
|
.returns(false);
|
||||||
|
|
||||||
await expect(applePayments.verifyPurchase({ user, receipt, headers }))
|
await expect(applePayments.verifyGemPurchase({ user, receipt, headers }))
|
||||||
.to.eventually.be.rejected.and.to.eql({
|
.to.eventually.be.rejected.and.to.eql({
|
||||||
httpCode: 401,
|
httpCode: 401,
|
||||||
name: 'NotAuthorized',
|
name: 'NotAuthorized',
|
||||||
@@ -66,7 +66,7 @@ describe('Apple Payments', () => {
|
|||||||
iapGetPurchaseDataStub.restore();
|
iapGetPurchaseDataStub.restore();
|
||||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData').returns([]);
|
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData').returns([]);
|
||||||
|
|
||||||
await expect(applePayments.verifyPurchase({ user, receipt, headers }))
|
await expect(applePayments.verifyGemPurchase({ user, receipt, headers }))
|
||||||
.to.eventually.be.rejected.and.to.eql({
|
.to.eventually.be.rejected.and.to.eql({
|
||||||
httpCode: 401,
|
httpCode: 401,
|
||||||
name: 'NotAuthorized',
|
name: 'NotAuthorized',
|
||||||
@@ -76,7 +76,7 @@ describe('Apple Payments', () => {
|
|||||||
|
|
||||||
it('errors if the user cannot purchase gems', async () => {
|
it('errors if the user cannot purchase gems', async () => {
|
||||||
sinon.stub(user, 'canGetGems').resolves(false);
|
sinon.stub(user, 'canGetGems').resolves(false);
|
||||||
await expect(applePayments.verifyPurchase({ user, receipt, headers }))
|
await expect(applePayments.verifyGemPurchase({ user, receipt, headers }))
|
||||||
.to.eventually.be.rejected.and.to.eql({
|
.to.eventually.be.rejected.and.to.eql({
|
||||||
httpCode: 401,
|
httpCode: 401,
|
||||||
name: 'NotAuthorized',
|
name: 'NotAuthorized',
|
||||||
@@ -94,16 +94,14 @@ describe('Apple Payments', () => {
|
|||||||
productId: 'badProduct',
|
productId: 'badProduct',
|
||||||
transactionId: token,
|
transactionId: token,
|
||||||
}]);
|
}]);
|
||||||
paymentBuySkuStub.restore();
|
|
||||||
|
|
||||||
await expect(applePayments.verifyPurchase({ user, receipt, headers }))
|
await expect(applePayments.verifyGemPurchase({ user, receipt, headers }))
|
||||||
.to.eventually.be.rejected.and.to.eql({
|
.to.eventually.be.rejected.and.to.eql({
|
||||||
httpCode: 400,
|
httpCode: 401,
|
||||||
name: 'BadRequest',
|
name: 'NotAuthorized',
|
||||||
message: applePayments.constants.RESPONSE_INVALID_ITEM,
|
message: applePayments.constants.RESPONSE_INVALID_ITEM,
|
||||||
});
|
});
|
||||||
|
|
||||||
paymentBuySkuStub = sinon.stub(payments, 'buySkuItem').resolves({});
|
|
||||||
user.canGetGems.restore();
|
user.canGetGems.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -140,7 +138,7 @@ describe('Apple Payments', () => {
|
|||||||
}]);
|
}]);
|
||||||
|
|
||||||
sinon.stub(user, 'canGetGems').resolves(true);
|
sinon.stub(user, 'canGetGems').resolves(true);
|
||||||
await applePayments.verifyPurchase({ user, receipt, headers });
|
await applePayments.verifyGemPurchase({ user, receipt, headers });
|
||||||
|
|
||||||
expect(iapSetupStub).to.be.calledOnce;
|
expect(iapSetupStub).to.be.calledOnce;
|
||||||
expect(iapValidateStub).to.be.calledOnce;
|
expect(iapValidateStub).to.be.calledOnce;
|
||||||
@@ -150,13 +148,13 @@ describe('Apple Payments', () => {
|
|||||||
expect(iapGetPurchaseDataStub).to.be.calledOnce;
|
expect(iapGetPurchaseDataStub).to.be.calledOnce;
|
||||||
expect(validateGiftMessageStub).to.not.be.called;
|
expect(validateGiftMessageStub).to.not.be.called;
|
||||||
|
|
||||||
expect(paymentBuySkuStub).to.be.calledOnce;
|
expect(paymentBuyGemsStub).to.be.calledOnce;
|
||||||
expect(paymentBuySkuStub).to.be.calledWith({
|
expect(paymentBuyGemsStub).to.be.calledWith({
|
||||||
user,
|
user,
|
||||||
gift: undefined,
|
|
||||||
paymentMethod: applePayments.constants.PAYMENT_METHOD_APPLE,
|
paymentMethod: applePayments.constants.PAYMENT_METHOD_APPLE,
|
||||||
sku: gemTest.productId,
|
gemsBlock: common.content.gems[gemTest.gemsBlock],
|
||||||
headers,
|
headers,
|
||||||
|
gift: undefined,
|
||||||
});
|
});
|
||||||
expect(user.canGetGems).to.be.calledOnce;
|
expect(user.canGetGems).to.be.calledOnce;
|
||||||
user.canGetGems.restore();
|
user.canGetGems.restore();
|
||||||
@@ -175,7 +173,7 @@ describe('Apple Payments', () => {
|
|||||||
}]);
|
}]);
|
||||||
|
|
||||||
const gift = { uuid: receivingUser._id };
|
const gift = { uuid: receivingUser._id };
|
||||||
await applePayments.verifyPurchase({
|
await applePayments.verifyGemPurchase({
|
||||||
user, gift, receipt, headers,
|
user, gift, receipt, headers,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -189,16 +187,18 @@ describe('Apple Payments', () => {
|
|||||||
expect(validateGiftMessageStub).to.be.calledOnce;
|
expect(validateGiftMessageStub).to.be.calledOnce;
|
||||||
expect(validateGiftMessageStub).to.be.calledWith(gift, user);
|
expect(validateGiftMessageStub).to.be.calledWith(gift, user);
|
||||||
|
|
||||||
expect(paymentBuySkuStub).to.be.calledOnce;
|
expect(paymentBuyGemsStub).to.be.calledOnce;
|
||||||
expect(paymentBuySkuStub).to.be.calledWith({
|
expect(paymentBuyGemsStub).to.be.calledWith({
|
||||||
user,
|
user,
|
||||||
gift: {
|
|
||||||
uuid: receivingUser._id,
|
|
||||||
member: sinon.match({ _id: receivingUser._id }),
|
|
||||||
},
|
|
||||||
paymentMethod: applePayments.constants.PAYMENT_METHOD_APPLE,
|
paymentMethod: applePayments.constants.PAYMENT_METHOD_APPLE,
|
||||||
sku: 'com.habitrpg.ios.Habitica.4gems',
|
|
||||||
headers,
|
headers,
|
||||||
|
gift: {
|
||||||
|
type: 'gems',
|
||||||
|
gems: { amount: 4 },
|
||||||
|
member: sinon.match({ _id: receivingUser._id }),
|
||||||
|
uuid: receivingUser._id,
|
||||||
|
},
|
||||||
|
gemsBlock: common.content.gems['4gems'],
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ const { i18n } = common;
|
|||||||
describe('Google Payments', () => {
|
describe('Google Payments', () => {
|
||||||
const subKey = 'basic_3mo';
|
const subKey = 'basic_3mo';
|
||||||
|
|
||||||
describe('verifyPurchase', () => {
|
describe('verifyGemPurchase', () => {
|
||||||
let sku; let user; let token; let receipt; let signature; let
|
let sku; let user; let token; let receipt; let signature; let
|
||||||
headers;
|
headers; const gemsBlock = common.content.gems['21gems'];
|
||||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let
|
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let
|
||||||
paymentBuySkuStub; let validateGiftMessageStub;
|
paymentBuyGemsStub; let validateGiftMessageStub;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
sku = 'com.habitrpg.android.habitica.iap.21gems';
|
sku = 'com.habitrpg.android.habitica.iap.21gems';
|
||||||
@@ -27,10 +27,11 @@ describe('Google Payments', () => {
|
|||||||
|
|
||||||
iapSetupStub = sinon.stub(iap, 'setup')
|
iapSetupStub = sinon.stub(iap, 'setup')
|
||||||
.resolves();
|
.resolves();
|
||||||
iapValidateStub = sinon.stub(iap, 'validate').resolves({ productId: sku });
|
iapValidateStub = sinon.stub(iap, 'validate')
|
||||||
|
.resolves({});
|
||||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||||
.returns(true);
|
.returns(true);
|
||||||
paymentBuySkuStub = sinon.stub(payments, 'buySkuItem').resolves({});
|
paymentBuyGemsStub = sinon.stub(payments, 'buyGems').resolves({});
|
||||||
validateGiftMessageStub = sinon.stub(gems, 'validateGiftMessage');
|
validateGiftMessageStub = sinon.stub(gems, 'validateGiftMessage');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ describe('Google Payments', () => {
|
|||||||
iap.setup.restore();
|
iap.setup.restore();
|
||||||
iap.validate.restore();
|
iap.validate.restore();
|
||||||
iap.isValidated.restore();
|
iap.isValidated.restore();
|
||||||
payments.buySkuItem.restore();
|
payments.buyGems.restore();
|
||||||
gems.validateGiftMessage.restore();
|
gems.validateGiftMessage.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -47,7 +48,7 @@ describe('Google Payments', () => {
|
|||||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||||
.returns(false);
|
.returns(false);
|
||||||
|
|
||||||
await expect(googlePayments.verifyPurchase({
|
await expect(googlePayments.verifyGemPurchase({
|
||||||
user, receipt, signature, headers,
|
user, receipt, signature, headers,
|
||||||
}))
|
}))
|
||||||
.to.eventually.be.rejected.and.to.eql({
|
.to.eventually.be.rejected.and.to.eql({
|
||||||
@@ -59,25 +60,21 @@ describe('Google Payments', () => {
|
|||||||
|
|
||||||
it('should throw an error if productId is invalid', async () => {
|
it('should throw an error if productId is invalid', async () => {
|
||||||
receipt = `{"token": "${token}", "productId": "invalid"}`;
|
receipt = `{"token": "${token}", "productId": "invalid"}`;
|
||||||
iapValidateStub.restore();
|
|
||||||
iapValidateStub = sinon.stub(iap, 'validate').resolves({});
|
|
||||||
|
|
||||||
paymentBuySkuStub.restore();
|
await expect(googlePayments.verifyGemPurchase({
|
||||||
await expect(googlePayments.verifyPurchase({
|
|
||||||
user, receipt, signature, headers,
|
user, receipt, signature, headers,
|
||||||
}))
|
}))
|
||||||
.to.eventually.be.rejected.and.to.eql({
|
.to.eventually.be.rejected.and.to.eql({
|
||||||
httpCode: 400,
|
httpCode: 401,
|
||||||
name: 'BadRequest',
|
name: 'NotAuthorized',
|
||||||
message: googlePayments.constants.RESPONSE_INVALID_ITEM,
|
message: googlePayments.constants.RESPONSE_INVALID_ITEM,
|
||||||
});
|
});
|
||||||
paymentBuySkuStub = sinon.stub(payments, 'buySkuItem').resolves({});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if user cannot purchase gems', async () => {
|
it('should throw an error if user cannot purchase gems', async () => {
|
||||||
sinon.stub(user, 'canGetGems').resolves(false);
|
sinon.stub(user, 'canGetGems').resolves(false);
|
||||||
|
|
||||||
await expect(googlePayments.verifyPurchase({
|
await expect(googlePayments.verifyGemPurchase({
|
||||||
user, receipt, signature, headers,
|
user, receipt, signature, headers,
|
||||||
}))
|
}))
|
||||||
.to.eventually.be.rejected.and.to.eql({
|
.to.eventually.be.rejected.and.to.eql({
|
||||||
@@ -91,7 +88,7 @@ describe('Google Payments', () => {
|
|||||||
|
|
||||||
it('purchases gems', async () => {
|
it('purchases gems', async () => {
|
||||||
sinon.stub(user, 'canGetGems').resolves(true);
|
sinon.stub(user, 'canGetGems').resolves(true);
|
||||||
await googlePayments.verifyPurchase({
|
await googlePayments.verifyGemPurchase({
|
||||||
user, receipt, signature, headers,
|
user, receipt, signature, headers,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -104,17 +101,15 @@ describe('Google Payments', () => {
|
|||||||
signature,
|
signature,
|
||||||
});
|
});
|
||||||
expect(iapIsValidatedStub).to.be.calledOnce;
|
expect(iapIsValidatedStub).to.be.calledOnce;
|
||||||
expect(iapIsValidatedStub).to.be.calledWith(
|
expect(iapIsValidatedStub).to.be.calledWith({});
|
||||||
{ productId: sku },
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(paymentBuySkuStub).to.be.calledOnce;
|
expect(paymentBuyGemsStub).to.be.calledOnce;
|
||||||
expect(paymentBuySkuStub).to.be.calledWith({
|
expect(paymentBuyGemsStub).to.be.calledWith({
|
||||||
user,
|
user,
|
||||||
gift: undefined,
|
|
||||||
paymentMethod: googlePayments.constants.PAYMENT_METHOD_GOOGLE,
|
paymentMethod: googlePayments.constants.PAYMENT_METHOD_GOOGLE,
|
||||||
sku,
|
gemsBlock,
|
||||||
headers,
|
headers,
|
||||||
|
gift: undefined,
|
||||||
});
|
});
|
||||||
expect(user.canGetGems).to.be.calledOnce;
|
expect(user.canGetGems).to.be.calledOnce;
|
||||||
user.canGetGems.restore();
|
user.canGetGems.restore();
|
||||||
@@ -125,7 +120,7 @@ describe('Google Payments', () => {
|
|||||||
await receivingUser.save();
|
await receivingUser.save();
|
||||||
|
|
||||||
const gift = { uuid: receivingUser._id };
|
const gift = { uuid: receivingUser._id };
|
||||||
await googlePayments.verifyPurchase({
|
await googlePayments.verifyGemPurchase({
|
||||||
user, gift, receipt, signature, headers,
|
user, gift, receipt, signature, headers,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -139,20 +134,20 @@ describe('Google Payments', () => {
|
|||||||
signature,
|
signature,
|
||||||
});
|
});
|
||||||
expect(iapIsValidatedStub).to.be.calledOnce;
|
expect(iapIsValidatedStub).to.be.calledOnce;
|
||||||
expect(iapIsValidatedStub).to.be.calledWith(
|
expect(iapIsValidatedStub).to.be.calledWith({});
|
||||||
{ productId: sku },
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(paymentBuySkuStub).to.be.calledOnce;
|
expect(paymentBuyGemsStub).to.be.calledOnce;
|
||||||
expect(paymentBuySkuStub).to.be.calledWith({
|
expect(paymentBuyGemsStub).to.be.calledWith({
|
||||||
user,
|
user,
|
||||||
gift: {
|
|
||||||
uuid: receivingUser._id,
|
|
||||||
member: sinon.match({ _id: receivingUser._id }),
|
|
||||||
},
|
|
||||||
paymentMethod: googlePayments.constants.PAYMENT_METHOD_GOOGLE,
|
paymentMethod: googlePayments.constants.PAYMENT_METHOD_GOOGLE,
|
||||||
sku,
|
gemsBlock,
|
||||||
headers,
|
headers,
|
||||||
|
gift: {
|
||||||
|
type: 'gems',
|
||||||
|
gems: { amount: 21 },
|
||||||
|
member: sinon.match({ _id: receivingUser._id }),
|
||||||
|
uuid: receivingUser._id,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
import {
|
|
||||||
canBuySkuItem,
|
|
||||||
} from '../../../../../website/server/libs/payments/skuItem';
|
|
||||||
import { model as User } from '../../../../../website/server/models/user';
|
|
||||||
|
|
||||||
describe('payments/skuItems', () => {
|
|
||||||
let user;
|
|
||||||
let clock;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
user = new User();
|
|
||||||
clock = null;
|
|
||||||
});
|
|
||||||
afterEach(() => {
|
|
||||||
if (clock !== null) clock.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#canBuySkuItem', () => {
|
|
||||||
it('returns true for random sku', () => {
|
|
||||||
expect(canBuySkuItem('something', user)).to.be.true;
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#gryphatrice', () => {
|
|
||||||
const sku = 'Pet-Gryphatrice-Jubilant';
|
|
||||||
it('returns true during birthday week', () => {
|
|
||||||
clock = sinon.useFakeTimers(new Date('2023-01-31'));
|
|
||||||
expect(canBuySkuItem(sku, user)).to.be.true;
|
|
||||||
});
|
|
||||||
it('returns false outside of birthday week', () => {
|
|
||||||
clock = sinon.useFakeTimers(new Date('2023-01-20'));
|
|
||||||
expect(canBuySkuItem(sku, user)).to.be.false;
|
|
||||||
});
|
|
||||||
it('returns false if user already owns it', () => {
|
|
||||||
clock = sinon.useFakeTimers(new Date('2023-02-01'));
|
|
||||||
user.items.pets['Gryphatrice-Jubilant'] = 5;
|
|
||||||
expect(canBuySkuItem(sku, user)).to.be.false;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1359,7 +1359,6 @@ describe('Group Model', () => {
|
|||||||
describe('#sendChat', () => {
|
describe('#sendChat', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
sandbox.spy(User, 'update');
|
sandbox.spy(User, 'update');
|
||||||
sandbox.spy(User, 'updateMany');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('formats message', () => {
|
it('formats message', () => {
|
||||||
@@ -1414,8 +1413,8 @@ describe('Group Model', () => {
|
|||||||
it('updates users about new messages in party', () => {
|
it('updates users about new messages in party', () => {
|
||||||
party.sendChat({ message: 'message' });
|
party.sendChat({ message: 'message' });
|
||||||
|
|
||||||
expect(User.updateMany).to.be.calledOnce;
|
expect(User.update).to.be.calledOnce;
|
||||||
expect(User.updateMany).to.be.calledWithMatch({
|
expect(User.update).to.be.calledWithMatch({
|
||||||
'party._id': party._id,
|
'party._id': party._id,
|
||||||
_id: { $ne: '' },
|
_id: { $ne: '' },
|
||||||
});
|
});
|
||||||
@@ -1428,8 +1427,8 @@ describe('Group Model', () => {
|
|||||||
|
|
||||||
group.sendChat({ message: 'message' });
|
group.sendChat({ message: 'message' });
|
||||||
|
|
||||||
expect(User.updateMany).to.be.calledOnce;
|
expect(User.update).to.be.calledOnce;
|
||||||
expect(User.updateMany).to.be.calledWithMatch({
|
expect(User.update).to.be.calledWithMatch({
|
||||||
guilds: group._id,
|
guilds: group._id,
|
||||||
_id: { $ne: '' },
|
_id: { $ne: '' },
|
||||||
});
|
});
|
||||||
@@ -1438,8 +1437,8 @@ describe('Group Model', () => {
|
|||||||
it('does not send update to user that sent the message', () => {
|
it('does not send update to user that sent the message', () => {
|
||||||
party.sendChat({ message: 'message', user: { _id: 'user-id', profile: { name: 'user' } } });
|
party.sendChat({ message: 'message', user: { _id: 'user-id', profile: { name: 'user' } } });
|
||||||
|
|
||||||
expect(User.updateMany).to.be.calledOnce;
|
expect(User.update).to.be.calledOnce;
|
||||||
expect(User.updateMany).to.be.calledWithMatch({
|
expect(User.update).to.be.calledWithMatch({
|
||||||
'party._id': party._id,
|
'party._id': party._id,
|
||||||
_id: { $ne: 'user-id' },
|
_id: { $ne: 'user-id' },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -541,35 +541,6 @@ describe('POST /chat', () => {
|
|||||||
.to.eql(userWithStyle.preferences.background);
|
.to.eql(userWithStyle.preferences.background);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('creates equipped to user styles', async () => {
|
|
||||||
const userWithStyle = await generateUser({
|
|
||||||
'preferences.costume': false,
|
|
||||||
'auth.timestamps.created': new Date('2022-01-01'),
|
|
||||||
});
|
|
||||||
await userWithStyle.sync();
|
|
||||||
|
|
||||||
const message = await userWithStyle.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
|
||||||
|
|
||||||
expect(message.message.id).to.exist;
|
|
||||||
expect(message.message.userStyles.items.gear.equipped)
|
|
||||||
.to.eql(userWithStyle.items.gear.equipped);
|
|
||||||
expect(message.message.userStyles.items.gear.costume).to.not.exist;
|
|
||||||
});
|
|
||||||
|
|
||||||
it('creates costume to user styles', async () => {
|
|
||||||
const userWithStyle = await generateUser({
|
|
||||||
'preferences.costume': true,
|
|
||||||
'auth.timestamps.created': new Date('2022-01-01'),
|
|
||||||
});
|
|
||||||
await userWithStyle.sync();
|
|
||||||
|
|
||||||
const message = await userWithStyle.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage });
|
|
||||||
|
|
||||||
expect(message.message.id).to.exist;
|
|
||||||
expect(message.message.userStyles.items.gear.costume).to.eql(userWithStyle.items.gear.costume);
|
|
||||||
expect(message.message.userStyles.items.gear.equipped).to.not.exist;
|
|
||||||
});
|
|
||||||
|
|
||||||
it('adds backer info to chat', async () => {
|
it('adds backer info to chat', async () => {
|
||||||
const backerInfo = {
|
const backerInfo = {
|
||||||
npc: 'Town Crier',
|
npc: 'Town Crier',
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
|
|||||||
type: 'party',
|
type: 'party',
|
||||||
privacy: 'private',
|
privacy: 'private',
|
||||||
},
|
},
|
||||||
members: 2,
|
members: 1,
|
||||||
});
|
});
|
||||||
|
|
||||||
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') });
|
||||||
@@ -76,17 +76,12 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
|
|||||||
await admin.post(`/groups/${group._id}/chat/${privateMessage.id}/flag`);
|
await admin.post(`/groups/${group._id}/chat/${privateMessage.id}/flag`);
|
||||||
|
|
||||||
// first test that the flag was actually successful
|
// first test that the flag was actually successful
|
||||||
// author always sees own message; flag count is hidden from non-admins
|
|
||||||
let messages = await members[0].get(`/groups/${group._id}/chat`);
|
let messages = await members[0].get(`/groups/${group._id}/chat`);
|
||||||
expect(messages[0].flagCount).to.eql(0);
|
expect(messages[0].flagCount).to.eql(5);
|
||||||
messages = await members[1].get(`/groups/${group._id}/chat`);
|
|
||||||
expect(messages.length).to.eql(0);
|
|
||||||
|
|
||||||
// admin cannot directly request private group chat, but after unflag,
|
|
||||||
// message should be revealed again and still have flagCount of 0
|
|
||||||
await admin.post(`/groups/${group._id}/chat/${privateMessage.id}/clearflags`);
|
await admin.post(`/groups/${group._id}/chat/${privateMessage.id}/clearflags`);
|
||||||
messages = await members[1].get(`/groups/${group._id}/chat`);
|
|
||||||
expect(messages.length).to.eql(1);
|
messages = await members[0].get(`/groups/${group._id}/chat`);
|
||||||
expect(messages[0].flagCount).to.eql(0);
|
expect(messages[0].flagCount).to.eql(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -48,19 +48,6 @@ describe('Post /groups/:groupId/invite', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns error when recipient has blocked the senders', async () => {
|
|
||||||
const inviterNoBlocks = await inviter.update({ 'inbox.blocks': [] });
|
|
||||||
const userWithBlockedInviter = await generateUser({ 'inbox.blocks': [inviter._id] });
|
|
||||||
await expect(inviterNoBlocks.post(`/groups/${group._id}/invite`, {
|
|
||||||
usernames: [userWithBlockedInviter.auth.local.lowerCaseUsername],
|
|
||||||
}))
|
|
||||||
.to.eventually.be.rejected.and.eql({
|
|
||||||
code: 401,
|
|
||||||
error: 'NotAuthorized',
|
|
||||||
message: t('notAuthorizedToSendMessageToThisUser'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('invites a user to a group by username', async () => {
|
it('invites a user to a group by username', async () => {
|
||||||
const userToInvite = await generateUser();
|
const userToInvite = await generateUser();
|
||||||
|
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ describe('payments : apple #verify', () => {
|
|||||||
let verifyStub;
|
let verifyStub;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
verifyStub = sinon.stub(applePayments, 'verifyPurchase').resolves({});
|
verifyStub = sinon.stub(applePayments, 'verifyGemPurchase').resolves({});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
applePayments.verifyPurchase.restore();
|
applePayments.verifyGemPurchase.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('makes a purchase', async () => {
|
it('makes a purchase', async () => {
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ describe('payments : google #verify', () => {
|
|||||||
let verifyStub;
|
let verifyStub;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
verifyStub = sinon.stub(googlePayments, 'verifyPurchase').resolves({});
|
verifyStub = sinon.stub(googlePayments, 'verifyGemPurchase').resolves({});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
googlePayments.verifyPurchase.restore();
|
googlePayments.verifyGemPurchase.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('makes a purchase', async () => {
|
it('makes a purchase', async () => {
|
||||||
|
|||||||
@@ -96,20 +96,6 @@ describe('PUT /user/auth/update-password', async () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns an error when newPassword is too long', async () => {
|
|
||||||
const body = {
|
|
||||||
password,
|
|
||||||
newPassword: '12345678910111213141516171819202122232425262728293031323334353637383940',
|
|
||||||
confirmPassword: '12345678910111213141516171819202122232425262728293031323334353637383940',
|
|
||||||
};
|
|
||||||
|
|
||||||
await expect(user.put(ENDPOINT, body)).to.eventually.be.rejected.and.eql({
|
|
||||||
code: 400,
|
|
||||||
error: 'BadRequest',
|
|
||||||
message: t('invalidReqParams'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns an error when confirmPassword is missing', async () => {
|
it('returns an error when confirmPassword is missing', async () => {
|
||||||
const body = {
|
const body = {
|
||||||
password,
|
password,
|
||||||
|
|||||||
@@ -35,6 +35,13 @@ describe('GET /world-state', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns a string representing the current season for NPC sprites', async () => {
|
||||||
|
const res = await requester().get('/world-state');
|
||||||
|
|
||||||
|
expect(res).to.have.nested.property('npcImageSuffix');
|
||||||
|
expect(res.npcImageSuffix).to.be.a('string');
|
||||||
|
});
|
||||||
|
|
||||||
context('no current event', () => {
|
context('no current event', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
sinon.stub(worldState, 'getCurrentEvent').returns(null);
|
sinon.stub(worldState, 'getCurrentEvent').returns(null);
|
||||||
|
|||||||
@@ -37,8 +37,6 @@ describe('GET /faq', () => {
|
|||||||
|
|
||||||
expect(res).to.have.property('questions');
|
expect(res).to.have.property('questions');
|
||||||
expect(res.questions[0]).to.eql({
|
expect(res.questions[0]).to.eql({
|
||||||
exclusions: [],
|
|
||||||
heading: 'overview',
|
|
||||||
question: translate('faqQuestion0'),
|
question: translate('faqQuestion0'),
|
||||||
ios: translate('iosFaqAnswer0'),
|
ios: translate('iosFaqAnswer0'),
|
||||||
});
|
});
|
||||||
@@ -59,8 +57,6 @@ describe('GET /faq', () => {
|
|||||||
|
|
||||||
expect(res).to.have.property('questions');
|
expect(res).to.have.property('questions');
|
||||||
expect(res.questions[0]).to.eql({
|
expect(res.questions[0]).to.eql({
|
||||||
exclusions: [],
|
|
||||||
heading: 'overview',
|
|
||||||
question: translate('faqQuestion0'),
|
question: translate('faqQuestion0'),
|
||||||
android: translate('androidFaqAnswer0'),
|
android: translate('androidFaqAnswer0'),
|
||||||
});
|
});
|
||||||
|
|||||||
12347
website/client/package-lock.json
generated
@@ -18,44 +18,44 @@
|
|||||||
"@storybook/addon-links": "6.5.8",
|
"@storybook/addon-links": "6.5.8",
|
||||||
"@storybook/addon-notes": "5.3.21",
|
"@storybook/addon-notes": "5.3.21",
|
||||||
"@storybook/addons": "6.5.9",
|
"@storybook/addons": "6.5.9",
|
||||||
"@storybook/vue": "6.5.14",
|
"@storybook/vue": "6.3.13",
|
||||||
"@vue/cli-plugin-babel": "^5.0.8",
|
"@vue/cli-plugin-babel": "^4.5.15",
|
||||||
"@vue/cli-plugin-eslint": "^4.5.19",
|
"@vue/cli-plugin-eslint": "^4.5.19",
|
||||||
"@vue/cli-plugin-router": "^5.0.8",
|
"@vue/cli-plugin-router": "^5.0.8",
|
||||||
"@vue/cli-plugin-unit-mocha": "^5.0.8",
|
"@vue/cli-plugin-unit-mocha": "^4.5.15",
|
||||||
"@vue/cli-service": "^4.5.15",
|
"@vue/cli-service": "^4.5.15",
|
||||||
"@vue/test-utils": "1.0.0-beta.29",
|
"@vue/test-utils": "1.0.0-beta.29",
|
||||||
"amplitude-js": "^8.21.3",
|
"amplitude-js": "^8.21.1",
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
"axios-progress-bar": "^1.2.0",
|
"axios-progress-bar": "^1.2.0",
|
||||||
"babel-eslint": "^10.1.0",
|
"babel-eslint": "^10.1.0",
|
||||||
"bootstrap": "^4.6.0",
|
"bootstrap": "^4.6.0",
|
||||||
"bootstrap-vue": "^2.23.1",
|
"bootstrap-vue": "^2.22.0",
|
||||||
"chai": "^4.3.7",
|
"chai": "^4.3.6",
|
||||||
"core-js": "^3.27.2",
|
"core-js": "^3.26.0",
|
||||||
"dompurify": "^2.4.3",
|
"dompurify": "^2.4.1",
|
||||||
"eslint": "^6.8.0",
|
"eslint": "^6.8.0",
|
||||||
"eslint-config-habitrpg": "^6.2.0",
|
"eslint-config-habitrpg": "^6.2.0",
|
||||||
"eslint-plugin-mocha": "^5.3.0",
|
"eslint-plugin-mocha": "^5.3.0",
|
||||||
"eslint-plugin-vue": "^6.2.2",
|
"eslint-plugin-vue": "^6.2.2",
|
||||||
"habitica-markdown": "^3.0.0",
|
"habitica-markdown": "^3.0.0",
|
||||||
"hellojs": "^1.20.0",
|
"hellojs": "^1.19.5",
|
||||||
"inspectpack": "^4.7.1",
|
"inspectpack": "^4.7.1",
|
||||||
"intro.js": "^6.0.0",
|
"intro.js": "^6.0.0",
|
||||||
"jquery": "^3.6.3",
|
"jquery": "^3.6.1",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.29.4",
|
||||||
"nconf": "^0.12.0",
|
"nconf": "^0.12.0",
|
||||||
"sass": "^1.34.0",
|
"sass": "^1.34.0",
|
||||||
"sass-loader": "^8.0.2",
|
"sass-loader": "^8.0.2",
|
||||||
"smartbanner.js": "^1.19.1",
|
"smartbanner.js": "^1.19.1",
|
||||||
"stopword": "^2.0.7",
|
"stopword": "^2.0.5",
|
||||||
"svg-inline-loader": "^0.8.2",
|
"svg-inline-loader": "^0.8.2",
|
||||||
"svg-url-loader": "^7.1.1",
|
"svg-url-loader": "^7.1.1",
|
||||||
"svgo": "^1.3.2",
|
"svgo": "^1.3.2",
|
||||||
"svgo-loader": "^2.2.1",
|
"svgo-loader": "^2.2.1",
|
||||||
"uuid": "^8.3.2",
|
"uuid": "^8.3.2",
|
||||||
"validator": "^13.9.0",
|
"validator": "^13.7.0",
|
||||||
"vue": "^2.7.10",
|
"vue": "^2.7.10",
|
||||||
"vue-cli-plugin-storybook": "2.1.0",
|
"vue-cli-plugin-storybook": "2.1.0",
|
||||||
"vue-mugen-scroll": "^0.2.6",
|
"vue-mugen-scroll": "^0.2.6",
|
||||||
@@ -66,6 +66,6 @@
|
|||||||
"webpack": "^4.46.0"
|
"webpack": "^4.46.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.20.7"
|
"@babel/plugin-proposal-optional-chaining": "^7.18.9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
<sub-canceled-modal v-if="isUserLoaded" />
|
<sub-canceled-modal v-if="isUserLoaded" />
|
||||||
<bug-report-modal v-if="isUserLoaded" />
|
<bug-report-modal v-if="isUserLoaded" />
|
||||||
<bug-report-success-modal v-if="isUserLoaded" />
|
<bug-report-success-modal v-if="isUserLoaded" />
|
||||||
<birthday-modal />
|
|
||||||
<snackbars />
|
<snackbars />
|
||||||
<router-view v-if="!isUserLoggedIn || isStaticPage" />
|
<router-view v-if="!isUserLoggedIn || isStaticPage" />
|
||||||
<template v-else>
|
<template v-else>
|
||||||
@@ -43,7 +42,6 @@
|
|||||||
<damage-paused-banner />
|
<damage-paused-banner />
|
||||||
<gems-promo-banner />
|
<gems-promo-banner />
|
||||||
<gift-promo-banner />
|
<gift-promo-banner />
|
||||||
<birthday-banner />
|
|
||||||
<notifications-display />
|
<notifications-display />
|
||||||
<app-menu />
|
<app-menu />
|
||||||
<div
|
<div
|
||||||
@@ -155,13 +153,11 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { loadProgressBar } from 'axios-progress-bar';
|
import { loadProgressBar } from 'axios-progress-bar';
|
||||||
|
|
||||||
import birthdayModal from '@/components/news/birthdayModal';
|
|
||||||
import AppMenu from './components/header/menu';
|
import AppMenu from './components/header/menu';
|
||||||
import AppHeader from './components/header/index';
|
import AppHeader from './components/header/index';
|
||||||
import DamagePausedBanner from './components/header/banners/damagePaused';
|
import DamagePausedBanner from './components/header/banners/damagePaused';
|
||||||
import GemsPromoBanner from './components/header/banners/gemsPromo';
|
import GemsPromoBanner from './components/header/banners/gemsPromo';
|
||||||
import GiftPromoBanner from './components/header/banners/giftPromo';
|
import GiftPromoBanner from './components/header/banners/giftPromo';
|
||||||
import BirthdayBanner from './components/header/banners/birthdayBanner';
|
|
||||||
import AppFooter from './components/appFooter';
|
import AppFooter from './components/appFooter';
|
||||||
import notificationsDisplay from './components/notifications';
|
import notificationsDisplay from './components/notifications';
|
||||||
import snackbars from './components/snackbars/notifications';
|
import snackbars from './components/snackbars/notifications';
|
||||||
@@ -195,11 +191,9 @@ export default {
|
|||||||
AppMenu,
|
AppMenu,
|
||||||
AppHeader,
|
AppHeader,
|
||||||
AppFooter,
|
AppFooter,
|
||||||
birthdayModal,
|
|
||||||
DamagePausedBanner,
|
DamagePausedBanner,
|
||||||
GemsPromoBanner,
|
GemsPromoBanner,
|
||||||
GiftPromoBanner,
|
GiftPromoBanner,
|
||||||
BirthdayBanner,
|
|
||||||
notificationsDisplay,
|
notificationsDisplay,
|
||||||
snackbars,
|
snackbars,
|
||||||
BuyModal,
|
BuyModal,
|
||||||
|
|||||||
@@ -156,12 +156,6 @@
|
|||||||
height: 99px;
|
height: 99px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Pet-Gryphatrice-Jubilant {
|
|
||||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Gryphatrice-Jubilant.gif") no-repeat;
|
|
||||||
width: 81px;
|
|
||||||
height: 96px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Mount_Head_Gryphon-Gryphatrice, .Mount_Body_Gryphon-Gryphatrice {
|
.Mount_Head_Gryphon-Gryphatrice, .Mount_Body_Gryphon-Gryphatrice {
|
||||||
width: 135px;
|
width: 135px;
|
||||||
height: 135px;
|
height: 135px;
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 332 B |
|
Before Width: | Height: | Size: 358 B |
|
Before Width: | Height: | Size: 850 B |
|
Before Width: | Height: | Size: 1.2 KiB |
@@ -50,7 +50,10 @@ h3.markdown {
|
|||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
|
color: $blue-10;
|
||||||
|
|
||||||
&:hover, &:active, &:focus {
|
&:hover, &:active, &:focus {
|
||||||
|
color: $blue-10;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,17 +26,19 @@ a:not([href]), a:not([href]):hover {
|
|||||||
|
|
||||||
a, a:not([href]):not([tabindex]) {
|
a, a:not([href]):not([tabindex]) {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
color: $purple-300;
|
|
||||||
|
|
||||||
&:hover, &:active, &:focus {
|
&.standard-link {
|
||||||
text-decoration: underline;
|
color: $blue-10;
|
||||||
color: $purple-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
&[disabled="disabled"] {
|
&:hover, &:active, &:focus {
|
||||||
color: $gray-300;
|
text-decoration: underline;
|
||||||
text-decoration: none;
|
}
|
||||||
cursor: default;
|
|
||||||
|
&[disabled="disabled"] {
|
||||||
|
color: $gray-300;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.small-link {
|
&.small-link {
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
<svg width="199" height="24" viewBox="0 0 199 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g filter="url(#c19w6aye5a)" fill="#fff">
|
|
||||||
<path d="M56.47 18.83V6.003L56 3.662l.47-1.405h8.942c1.773 0 3.193.344 4.26 1.03 1.066.687 1.6 1.733 1.6 3.137 0 .765-.142 1.397-.424 1.896a4.175 4.175 0 0 1-1.035 1.24 4.14 4.14 0 0 1 1.505.703c.471.327.855.772 1.154 1.334.297.546.447 1.225.447 2.036 0 1.639-.487 2.918-1.46 3.839-.956.905-2.502 1.358-4.635 1.358H56.471zm5.177-10.136h2.777c.533 0 .918-.078 1.153-.234.235-.171.353-.429.353-.772 0-.359-.173-.609-.518-.75-.345-.155-.753-.233-1.223-.233h-2.542v1.99zm0 5.688h4c.628 0 1.067-.093 1.318-.28a.974.974 0 0 0 .377-.796c0-.75-.486-1.124-1.46-1.124h-4.235v2.2zM75.515 18.83V6.003l-.236-2.341.236-1.405h5.2V18.83h-5.2zM84 18.83V6.026l-.471-2.364.47-1.405h8.472c1.27 0 2.36.203 3.27.61.91.405 1.608 1.06 2.095 1.965.486.89.73 2.068.73 3.535 0 1.357-.228 2.473-.683 3.347a4.552 4.552 0 0 1-2 1.99l.4.327 1.623 2.2 1.341 1.194v1.405h-6.235l-2.588-4.284h-1.248v.515l.236 2.34-.236 1.429H84zm5.176-8.66h1.365c.55 0 1.02-.024 1.412-.071.408-.047.722-.187.941-.421.22-.25.33-.648.33-1.194 0-.578-.118-.991-.353-1.24-.236-.25-.565-.399-.989-.446a9.614 9.614 0 0 0-1.435-.093h-1.506l.235 3.464zM104.666 18.83V6.728l-4.706.234V2.257h14.707v4.705l-4.824-.234v8.357l.259 2.34-.259 1.405h-5.177zM116.785 18.83V6.026l-.235-2.34.235-1.429h5.177v6.344h4.918V2.257h5.177v8.802l.235 1.615v6.156h-5.412v-5.946h-4.918v1.639l.235 4.307h-5.412zM135.588 18.83V6.026l-.471-2.34.471-1.429h7.977c1.114 0 2.188.11 3.223.328 1.051.203 1.985.593 2.801 1.17.831.578 1.49 1.405 1.976 2.482.486 1.076.73 2.473.73 4.19 0 1.716-.251 3.128-.753 4.236-.487 1.092-1.146 1.943-1.977 2.552a7.477 7.477 0 0 1-2.8 1.264 14.463 14.463 0 0 1-3.2.35h-7.977zm5.224-4.448h1.788c.926 0 1.702-.101 2.33-.304a2.498 2.498 0 0 0 1.458-1.147c.33-.577.495-1.412.495-2.504 0-1.108-.173-1.92-.518-2.435-.33-.53-.816-.874-1.459-1.03-.628-.171-1.396-.257-2.306-.257h-1.788v7.677zM153.013 18.83l1.13-3.956V11.9l1.741-.702 3.294-8.918h7.083l4.024 10.486 1.812 3.324v2.739h-5.106l-1.177-3.488h-6.377l-1.012 3.488h-5.412zm7.977-7.584h3.53l-1.553-4.658h-.494l-1.483 4.658zM176.04 18.83v-6.788l-5.835-8.38V2.257h5.906l2.353 4.822h.47l2.33-4.822h5.883v1.405l-6.001 8.52.141 2.364v4.284h-5.247zM191.923 12.72l-2.07-8.847L192.676 2l2.8 1.896-2.141 8.824h-1.412zm.518 7.28-3.059-3.043 3.059-3.043 3.059 3.043L192.441 20z"/>
|
|
||||||
</g>
|
|
||||||
<g filter="url(#s1alkvv8kb)">
|
|
||||||
<path d="M5.87 18.825V7.601H3V3.17l8.228-.937.239 1.406-.24 2.344v12.841H5.87z" fill="url(#xidihnl5xc)"/>
|
|
||||||
<path d="M21.258 19.06a9.043 9.043 0 0 1-2.87-.446 6.484 6.484 0 0 1-2.369-1.453c-.67-.671-1.195-1.546-1.578-2.624-.383-1.094-.574-2.43-.574-4.007 0-1.562.191-2.883.574-3.96.382-1.094.909-1.977 1.578-2.648a6.092 6.092 0 0 1 2.368-1.453A8.63 8.63 0 0 1 21.257 2c1.356 0 2.584.281 3.684.844 1.116.562 2.001 1.468 2.655 2.718.67 1.234 1.004 2.89 1.004 4.968s-.335 3.741-1.004 4.991c-.654 1.25-1.539 2.156-2.655 2.718-1.1.547-2.328.82-3.683.82zm0-5.039c.701 0 1.187-.25 1.459-.75.27-.5.406-1.413.406-2.741 0-1.313-.136-2.219-.407-2.719-.27-.515-.757-.773-1.459-.773-.685 0-1.18.258-1.483.773-.287.516-.43 1.422-.43 2.719 0 1.312.143 2.226.43 2.742.303.5.798.75 1.483.75z" fill="url(#9hqzmmkygd)"/>
|
|
||||||
<path d="M32.721 12.014V4.745l-2.87.14V2.06h8.97v2.826l-2.943-.141v5.02l.158 1.405-.158.844h-3.157z" fill="url(#bzq8gpt5ve)"/>
|
|
||||||
<path d="M40.543 12.014v-7.69l-.144-1.407.144-.857H43.7v3.81h3V2.06h3.156v5.286l.144.97v3.698h-3.3V8.443h-3v.984l.143 2.587h-3.3z" fill="url(#4t6arxwa4f)"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<linearGradient id="xidihnl5xc" x1="3" y1="2" x2="29.822" y2="35.308" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop stop-color="#6133B4"/>
|
|
||||||
<stop offset="1" stop-color="#4F2A93"/>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient id="9hqzmmkygd" x1="3" y1="2" x2="29.822" y2="35.308" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop stop-color="#6133B4"/>
|
|
||||||
<stop offset="1" stop-color="#4F2A93"/>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient id="bzq8gpt5ve" x1="3" y1="2" x2="29.822" y2="35.308" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop stop-color="#6133B4"/>
|
|
||||||
<stop offset="1" stop-color="#4F2A93"/>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient id="4t6arxwa4f" x1="3" y1="2" x2="29.822" y2="35.308" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop stop-color="#6133B4"/>
|
|
||||||
<stop offset="1" stop-color="#4F2A93"/>
|
|
||||||
</linearGradient>
|
|
||||||
<filter id="c19w6aye5a" x="53" y="0" width="145.5" height="24" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
||||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
||||||
<feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
||||||
<feOffset dy="1"/>
|
|
||||||
<feGaussianBlur stdDeviation="1.5"/>
|
|
||||||
<feComposite in2="hardAlpha" operator="out"/>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.101961 0 0 0 0 0.0941176 0 0 0 0 0.113725 0 0 0 0.12 0"/>
|
|
||||||
<feBlend in2="BackgroundImageFix" result="effect1_dropShadow_45_799"/>
|
|
||||||
<feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
||||||
<feOffset dy="1"/>
|
|
||||||
<feGaussianBlur stdDeviation="1"/>
|
|
||||||
<feComposite in2="hardAlpha" operator="out"/>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.101961 0 0 0 0 0.0941176 0 0 0 0 0.113725 0 0 0 0.24 0"/>
|
|
||||||
<feBlend in2="effect1_dropShadow_45_799" result="effect2_dropShadow_45_799"/>
|
|
||||||
<feBlend in="SourceGraphic" in2="effect2_dropShadow_45_799" result="shape"/>
|
|
||||||
</filter>
|
|
||||||
<filter id="s1alkvv8kb" x="0" y="0" width="53" height="23.059" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
||||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
||||||
<feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
||||||
<feOffset dy="1"/>
|
|
||||||
<feGaussianBlur stdDeviation="1.5"/>
|
|
||||||
<feComposite in2="hardAlpha" operator="out"/>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.101961 0 0 0 0 0.0941176 0 0 0 0 0.113725 0 0 0 0.12 0"/>
|
|
||||||
<feBlend in2="BackgroundImageFix" result="effect1_dropShadow_45_799"/>
|
|
||||||
<feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
||||||
<feOffset dy="1"/>
|
|
||||||
<feGaussianBlur stdDeviation="1"/>
|
|
||||||
<feComposite in2="hardAlpha" operator="out"/>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.101961 0 0 0 0 0.0941176 0 0 0 0 0.113725 0 0 0 0.24 0"/>
|
|
||||||
<feBlend in2="effect1_dropShadow_45_799" result="effect2_dropShadow_45_799"/>
|
|
||||||
<feBlend in="SourceGraphic" in2="effect2_dropShadow_45_799" result="shape"/>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -1,22 +0,0 @@
|
|||||||
<svg width="58" height="48" viewBox="0 0 58 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m16.853 4.36 7.959-1.453-2.71 7.556-2.708 7.557-5.25-6.103-5.25-6.103 7.959-1.453z" fill="#5DDEAB"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.771 1.454 40.731 0l-2.71 7.556-2.709 7.556-5.25-6.102-5.25-6.103 7.96-1.453z" fill="#5DDEAB"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m43.272 13.659-7.96 1.453 2.71-7.556L40.73 0l5.25 6.103 5.25 6.102-7.96 1.454z" fill="#38C38D"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m27.353 16.566-7.96 1.453 2.71-7.556 2.709-7.556 5.25 6.103 5.25 6.102-7.96 1.454zM11.434 19.473l-7.959 1.453 2.71-7.556 2.708-7.556 5.25 6.103 5.25 6.102-7.959 1.454z" fill="#B0F1D7"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m3.475 20.926 28.05 18.662L19.394 18.02 3.475 20.926z" fill="#38C38D"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M51.249 12.202 31.525 39.588l3.805-24.48 15.919-2.906z" fill="#B0F1D7"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m19.394 18.02 12.131 21.568 3.787-24.476-15.918 2.907z" fill="#5DDEAB"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m51.904 26.44-3.832-.897 1.132 3.736 1.132 3.737 2.7-2.84 2.7-2.84-3.832-.896zM44.24 24.647l-3.832-.897 1.132 3.736 1.132 3.736 2.7-2.84 2.7-2.839-3.832-.896z" fill="#87E3E1"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m38.84 30.326 3.832.896-1.132-3.736-1.132-3.736-2.7 2.84-2.7 2.839 3.832.897zM46.504 32.12l3.832.896-1.132-3.736-1.132-3.737-2.7 2.84-2.7 2.84 3.832.896z" fill="#C0FBFA"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.168 33.912 58 34.81l-1.132-3.736-1.133-3.736-2.7 2.84-2.7 2.839 3.833.896z" fill="#5EC5C2"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m58 34.81-14.084 8.395 6.42-10.19L58 34.81z" fill="#C0FBFA"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m35 29.427 8.916 13.779-1.252-11.986L35 29.427z" fill="#5EC5C2"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m50.336 33.016-6.42 10.19-1.244-11.984 7.664 1.794z" fill="#87E3E1"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m16.877 22.666-5.078 1.971 4.262 3.372 4.262 3.37.816-5.341.816-5.343-5.078 1.971zM6.721 26.609l-5.078 1.97 4.262 3.372 4.262 3.371.816-5.342.816-5.343-5.078 1.972z" fill="#7BE3CF"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m5.09 37.294 5.077-1.972-4.262-3.371-4.261-3.371-.817 5.342-.816 5.343 5.078-1.971z" fill="#C5F3EA"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m15.245 33.351 5.078-1.971-4.262-3.371-4.262-3.371-.816 5.342-.816 5.342 5.078-1.97z" fill="#C5F3EA"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m25.4 29.41 5.078-1.972-4.262-3.371-4.261-3.372-.816 5.343-.816 5.342 5.078-1.97z" fill="#41C7AF"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.478 27.438 21.117 48l-.794-16.62 10.155-3.942z" fill="#C5F3EA"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m0 39.269 21.117 8.73-10.961-12.672L0 39.269z" fill="#41C7AF"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.323 31.38 21.117 48l-10.95-12.678 10.156-3.942z" fill="#7BE3CF"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,22 +0,0 @@
|
|||||||
<svg width="518" height="152" viewBox="0 0 518 152" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M144.48 65.487v5.042h-1.772v-5.042h1.772zm1.621 6.671h5.013v1.782h-5.013v-1.782zm-10.027 0h5.013v1.782h-5.013v-1.782zm8.406 3.412v5.041h-1.772V75.57h1.772z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".5"/>
|
|
||||||
<path opacity=".92" fill-rule="evenodd" clip-rule="evenodd" d="m9.504 29.894 2.707-4.715 1.658.962-2.707 4.715-1.658-.962zm2.066-7.12-4.689-2.722.958-1.667 4.688 2.723-.957 1.667zm9.378 5.445-4.689-2.722.957-1.667 4.69 2.722-.958 1.667zm-6.03-7.755 2.707-4.715 1.658.962-2.707 4.715-1.658-.962z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m60.85 11.508.708-3.662 1.288.251-.708 3.662-1.288-.252zm-.24-5.076-3.642-.712.25-1.295 3.642.712-.25 1.295zm7.283 1.423-3.642-.711.25-1.295 3.642.712-.25 1.294zm-5.627-3.671.708-3.662 1.287.251-.708 3.662-1.287-.251z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".81"/>
|
|
||||||
<path opacity=".76" fill-rule="evenodd" clip-rule="evenodd" d="m107.034 22.162.493 5.675-1.995.175-.494-5.674 1.996-.176zm2.477 7.349 5.643-.497.175 2.007-5.644.496-.174-2.006zm-11.287.993 5.644-.497.174 2.007-5.643.496-.175-2.006zm9.797 3.008.494 5.675-1.996.175-.493-5.675 1.995-.175z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m16.191 92.492-5.006 1.636-.575-1.78 5.006-1.636.575 1.78zm-6.098 3.792 1.626 5.034-1.77.578-1.626-5.034 1.77-.578zM6.839 86.215l1.627 5.035-1.77.578-1.627-5.034 1.77-.579zm-.66 9.549-5.006 1.635-.576-1.78 5.007-1.635.575 1.78z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".91"/>
|
|
||||||
<path opacity=".92" fill-rule="evenodd" clip-rule="evenodd" d="m35.176 59.176 5.102-1.97.692 1.814-5.101 1.97-.693-1.814zm6.118-4.264-1.958-5.13 1.803-.696 1.958 5.13-1.803.696zm3.916 10.26-1.958-5.13 1.804-.696 1.958 5.13-1.804.696zm.17-9.935 5.1-1.969.693 1.814-5.101 1.969-.693-1.814z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m95.733 86.583-4.383 2.649-.931-1.559 4.383-2.648.93 1.558zm-4.949 4.93 2.634 4.407-1.55.936-2.633-4.407 1.55-.937zm-5.267-8.816 2.633 4.408-1.55.936-2.633-4.408 1.55-.936zm1.45 9.183-4.384 2.648-.93-1.558 4.382-2.648.931 1.558z" fill="#36205D" style="mix-blend-mode:multiply"/>
|
|
||||||
<path opacity=".98" fill-rule="evenodd" clip-rule="evenodd" d="m24.804 132.406-2.1-3.015 1.06-.746 2.1 3.014-1.06.747zm-3.747-3.307-2.998 2.111-.742-1.066 2.998-2.111.742 1.066zm5.996-4.222-2.998 2.111-.742-1.066 2.998-2.11.742 1.065zm-6.447 1.5-2.1-3.015 1.06-.746 2.1 3.014-1.06.747z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m60.65 142.295-1.594 3.144-1.105-.567 1.593-3.144 1.105.567zm-1.098 4.678 3.126 1.602-.563 1.112-3.127-1.602.564-1.112zm-6.254-3.204 3.127 1.602-.563 1.112-3.127-1.603.563-1.111zm4.165 4.814-1.593 3.144-1.106-.566 1.593-3.144 1.106.566z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".82"/>
|
|
||||||
<path opacity=".71" fill-rule="evenodd" clip-rule="evenodd" d="m110.507 140.233 2.321-4.582 1.611.826-2.321 4.581-1.611-.825zm1.599-6.817-4.556-2.335.821-1.62 4.556 2.335-.821 1.62zm9.112 4.669-4.556-2.335.821-1.62 4.556 2.335-.821 1.62zm-6.068-7.015 2.321-4.582 1.611.825-2.321 4.582-1.611-.825z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M373.52 65.487v5.042h1.772v-5.042h-1.772zm-1.621 6.671h-5.013v1.782h5.013v-1.782zm10.027 0h-5.013v1.782h5.013v-1.782zm-8.406 3.412v5.041h1.772V75.57h-1.772z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".5"/>
|
|
||||||
<path opacity=".92" fill-rule="evenodd" clip-rule="evenodd" d="m508.496 29.894-2.707-4.715-1.658.962 2.707 4.715 1.658-.962zm-2.066-7.12 4.689-2.722-.958-1.667-4.689 2.723.958 1.667zm-9.378 5.445 4.689-2.722-.957-1.667-4.689 2.722.957 1.667zm6.03-7.755-2.707-4.715-1.658.962 2.707 4.715 1.658-.962z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m457.15 11.508-.708-3.662-1.287.251.707 3.662 1.288-.252zm.24-5.076 3.642-.712-.25-1.295-3.642.712.25 1.295zm-7.283 1.423 3.642-.711-.251-1.295-3.641.712.25 1.294zm5.627-3.671-.708-3.662-1.287.251.708 3.662 1.287-.251z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".81"/>
|
|
||||||
<path opacity=".76" fill-rule="evenodd" clip-rule="evenodd" d="m410.966 22.162-.493 5.675 1.995.175.494-5.674-1.996-.176zm-2.477 7.349-5.643-.497-.175 2.007 5.644.496.174-2.006zm11.287.993-5.644-.497-.174 2.007 5.643.496.175-2.006zm-9.797 3.008-.494 5.675 1.996.175.493-5.675-1.995-.175z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m501.809 92.492 5.006 1.636.575-1.78-5.006-1.636-.575 1.78zm6.098 3.792-1.626 5.034 1.77.578 1.626-5.034-1.77-.578zm3.254-10.069-1.627 5.035 1.77.578 1.627-5.034-1.77-.579zm.66 9.549 5.006 1.635.576-1.78-5.007-1.635-.575 1.78z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".91"/>
|
|
||||||
<path opacity=".92" fill-rule="evenodd" clip-rule="evenodd" d="m482.824 59.176-5.102-1.97-.692 1.814 5.101 1.97.693-1.814zm-6.118-4.264 1.958-5.13-1.803-.696-1.958 5.13 1.803.696zm-3.916 10.26 1.958-5.13-1.804-.696-1.958 5.13 1.804.696zm-.169-9.935-5.102-1.969-.692 1.814 5.101 1.969.693-1.814z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m422.267 86.583 4.383 2.649.932-1.559-4.384-2.648-.931 1.558zm4.949 4.93-2.634 4.407 1.55.936 2.634-4.407-1.55-.937zm5.267-8.816-2.633 4.408 1.549.936 2.634-4.408-1.55-.936zm-1.449 9.183 4.383 2.648.931-1.558-4.383-2.648-.931 1.558z" fill="#36205D" style="mix-blend-mode:multiply"/>
|
|
||||||
<path opacity=".98" fill-rule="evenodd" clip-rule="evenodd" d="m493.196 132.406 2.099-3.015-1.06-.746-2.099 3.014 1.06.747zm3.747-3.307 2.998 2.111.742-1.066-2.998-2.111-.742 1.066zm-5.996-4.222 2.998 2.111.742-1.066-2.998-2.11-.742 1.065zm6.447 1.5 2.1-3.015-1.06-.746-2.099 3.014 1.059.747z" fill="#fff"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m457.351 142.295 1.593 3.144 1.105-.567-1.593-3.144-1.105.567zm1.097 4.678-3.126 1.602.563 1.112 3.127-1.602-.564-1.112zm6.254-3.204-3.127 1.602.563 1.112 3.127-1.603-.563-1.111zm-4.165 4.814 1.593 3.144 1.106-.566-1.593-3.144-1.106.566z" fill="#36205D" style="mix-blend-mode:multiply" opacity=".82"/>
|
|
||||||
<path opacity=".71" fill-rule="evenodd" clip-rule="evenodd" d="m407.493 140.233-2.321-4.582-1.611.826 2.321 4.581 1.611-.825zm-1.599-6.817 4.556-2.335-.821-1.62-4.556 2.335.821 1.62zm-9.112 4.669 4.556-2.335-.821-1.62-4.556 2.335.821 1.62zm6.068-7.015-2.321-4.582-1.611.825 2.321 4.582 1.611-.825z" fill="#fff"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 6.4 KiB |
@@ -1,3 +0,0 @@
|
|||||||
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.26512 0L4.84341 3.57829L3.57829 4.84341L0 1.26512L1.26512 0ZM7.15659 3.57829L10.7349 5.33207e-08L12 1.26512L8.42171 4.84341L7.15659 3.57829ZM5.33207e-08 10.7349L3.57829 7.15659L4.84341 8.42171L1.26512 12L5.33207e-08 10.7349ZM8.42171 7.15659L12 10.7349L10.7349 12L7.15659 8.42171L8.42171 7.15659Z" fill="#FFB445"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 469 B |
@@ -1,4 +0,0 @@
|
|||||||
<svg width="138" height="12" viewBox="0 0 138 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m127.265 0 3.578 3.578-1.265 1.265L126 1.265 127.265 0zm5.892 3.578L136.735 0 138 1.265l-3.578 3.578-1.265-1.265zM126 10.735l3.578-3.578 1.265 1.265L127.265 12 126 10.735zm8.422-3.578L138 10.735 136.735 12l-3.578-3.578 1.265-1.265z" fill="#FFB445"/>
|
|
||||||
<path d="M114.445 4.555 112.5 1l-1.945 3.555L107.914 6h-3.828l-1.349-.737L101.5 3l-1.237 2.263L98.914 6H0v1h98.914l1.349.737L101.5 10l1.237-2.263L104.086 7h3.828l2.641 1.445L112.5 12l1.945-3.555L118 6.5l-3.555-1.945z" fill="#36205D"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 647 B |
@@ -1,37 +0,0 @@
|
|||||||
<svg width="85" height="32" viewBox="0 0 85 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m4.93 12.255 2.466-.63-1.983-1.597-.63-2.468-1.595 1.986-2.465.63 1.983 1.597.63 2.468 1.595-1.986zM80.034 7.698l2.465-.63-1.983-1.597-.63-2.468-1.594 1.985-2.466.631 1.983 1.596.63 2.469 1.595-1.986zM42.27 7.427l2.929.487-1.368-2.638.487-2.932-2.635 1.37-2.928-.488 1.367 2.638-.486 2.932 2.634-1.37zM78.215 26.355l2.694 2.064.033-3.396 2.063-2.697-3.393-.034-2.694-2.065-.033 3.397-2.062 2.697 3.392.034zM38.321 28.092l2.092.348-.977-1.885.347-2.094-1.881.978-2.092-.348.977 1.884-.348 2.095 1.882-.978zM12.17 30.035l.916 1.915.981-1.882 1.913-.916-1.88-.982-.915-1.916-.981 1.882-1.913.917 1.88.982z" fill="#fff" fill-opacity=".5"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m24.878 12.01 6.73-1.805 2.524 9.433-6.73 1.806-2.524-9.433z" fill="#F9F9F9"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m18.148 13.816 6.73-1.805 2.524 9.433-6.73 1.805-2.524-9.433z" fill="#E1E0E3"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m23.532 12.372 1.346-.361 2.524 9.433-1.346.36-2.524-9.432z" fill="#6133B4"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m24.878 12.01 1.346-.36 2.524 9.433-1.346.36-2.524-9.432z" fill="#9A62FF"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m25.696 20.457 1.345-.36.361 1.347-1.346.36-.36-1.347zM23.532 12.372l1.346-.361.36 1.347-1.346.361-.36-1.347z" fill="#4F2A93"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m18.148 13.816 5.384-1.444.36 1.348-5.383 1.444-.36-1.348zM20.312 21.902l5.384-1.445.36 1.348-5.383 1.444-.36-1.347zM26.224 11.65l5.383-1.445.36 1.348-5.383 1.444-.36-1.347zM28.387 19.735l5.384-1.444.36 1.347-5.383 1.445-.36-1.348z" fill="#BDA8FF" fill-opacity=".3"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m27.041 20.096 1.346-.36.361 1.347-1.346.36-.36-1.347zM24.878 12.01l1.346-.36.36 1.347-1.346.361-.36-1.347z" fill="#6133B4"/>
|
|
||||||
<path clip-rule="evenodd" d="M24.735 4.954c-.335-1.183-1.148-2.301-2.285-2.51-1.138-.21-1.923.616-1.7 1.476.221.86 1 1.122 3.498 2.183.71.302.823.034.487-1.149z" stroke="#6133B4" stroke-width="1.5"/>
|
|
||||||
<path clip-rule="evenodd" d="M27.66 5.365c.648-1.044 1.737-1.895 2.888-1.782 1.151.112 1.678 1.123 1.228 1.889-.45.765-1.27.802-3.964 1.133-.765.094-.8-.195-.152-1.24z" stroke="#9A62FF" stroke-width="1.5"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.319 4.294c-2.24-.315-1.259 2.44-.36 2.566.898.126 2.6-2.25.36-2.566z" fill="#4F2A93"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m26.016 6.454 8.279 1.165-.582 4.145-8.279-1.165.582-4.145z" fill="#F9F9F9"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m17.737 5.29 8.279 1.164-.582 4.145-8.279-1.165.582-4.145z" fill="#E1E0E3"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m23.256 6.066 5.52.777-.582 4.144-5.52-.776.582-4.145z" fill="#9A62FF"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m23.256 6.066 2.76.388-.582 4.145-2.76-.388.582-4.145z" fill="#6133B4"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m26.016 6.454 2.76.389-.195 1.381-2.76-.388.195-1.382z" fill="#6133B4"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m23.256 6.066 2.76.388-.194 1.382-2.76-.388.194-1.382z" fill="#4F2A93"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m17.349 8.053 5.52.776-.195 1.382-5.519-.777.194-1.381zM28.388 9.606l5.519.776-.194 1.382-5.52-.777.195-1.381z" fill="#BDA8FF" fill-opacity=".3"/>
|
|
||||||
<path clip-rule="evenodd" d="M56.55 9.16c-.624-1.413-1.83-2.662-3.282-2.724-1.452-.062-2.285 1.104-1.858 2.135.426 1.031 1.441 1.22 4.734 2.104.935.25 1.03-.102.406-1.515z" stroke="#6133B4" stroke-width="1.5"/>
|
|
||||||
<path clip-rule="evenodd" d="M60.26 9.16c.624-1.413 1.83-2.662 3.283-2.724 1.451-.062 2.284 1.104 1.857 2.135-.426 1.031-1.44 1.22-4.734 2.104-.935.25-1.03-.102-.406-1.515z" stroke="#9A62FF" stroke-width="1.5"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M58.405 8.061c-2.842 0-1.14 3.256 0 3.256s2.842-3.256 0-3.256z" fill="#4F2A93"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M58.405 10.802H68.91v5.259H58.405v-5.259z" fill="#F9F9F9"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M47.901 10.802h10.504v5.259H47.901v-5.259z" fill="#E1E0E3"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.904 10.802h7.002v5.259h-7.002v-5.259z" fill="#9A62FF"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.904 10.802h3.501v5.259h-3.501v-5.259zM58.405 10.802h3.501v1.753h-3.5v-1.753z" fill="#6133B4"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.904 10.802h3.501v1.753h-3.501v-1.753z" fill="#4F2A93"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M58.405 16.06h8.753v12.27h-8.753V16.06z" fill="#F9F9F9"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.652 16.06h8.753v12.27h-8.753V16.06z" fill="#E1E0E3"/>
|
|
||||||
<path fill="#6133B4" d="M56.654 16.061h1.751v12.27h-1.751z"/>
|
|
||||||
<path fill="#9A62FF" d="M58.405 16.061h1.751v12.27h-1.751z"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M56.654 26.578h1.751v1.753h-1.75v-1.753zM56.654 16.06h1.751v1.754h-1.75V16.06z" fill="#4F2A93"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.652 16.06h7.002v1.754h-7.002V16.06z" fill="#BDA8FF" fill-opacity=".3"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M47.901 14.308h7.003v1.753H47.9v-1.753zM49.652 26.578h7.002v1.753h-7.002v-1.753zM60.156 16.06h7.002v1.754h-7.002V16.06z" fill="#BDA8FF" fill-opacity=".3"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M61.906 14.308h7.003v1.753h-7.003v-1.753zM60.156 26.578h7.002v1.753h-7.002v-1.753z" fill="#BDA8FF" fill-opacity=".3"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M58.405 26.578h1.75v1.753h-1.75v-1.753zM58.405 16.06h1.75v1.754h-1.75V16.06z" fill="#6133B4"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 5.7 KiB |
@@ -1,9 +0,0 @@
|
|||||||
<svg width="68" height="68" viewBox="0 0 68 68" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<path fill="url(#sxizdfpdya)" d="M0 0h68v68H0z"/>
|
|
||||||
<defs>
|
|
||||||
<pattern id="sxizdfpdya" patternContentUnits="objectBoundingBox" width="1" height="1">
|
|
||||||
<use xlink:href="#pomapjzcdb" transform="scale(.0147)"/>
|
|
||||||
</pattern>
|
|
||||||
<image id="pomapjzcdb" width="68" height="68" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAYAAAA4E5OyAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5gwJFx8lKwafmAAABjRJREFUeNrtm39MVWUYx78IV5BfF3Qg8kNppNIoyhKWZmUBlpRNpC3Uac7EUUGrscxM+AOHia1foKmDHOHItkbhLGnpzGVBimtlozmVTeByCRDhwgXll/THc17de3zvuedernDd3uefc895f5/zuc/3ed57DyBNmjRpzpuH+sLvR8fGAODR0nS+YmAgAMCQNQMAMJKwkys//+tUAMDQDTrPzNgIACj58iAAoLH5LADgx/Kzwols/zyba3+jny9n7WNmJ3LXffzoONUHTrVPyvDg7sEUyQRvXrYKrvX2AgCmK2RUxL9OT35oDzWs38bVf3XlNe78sfindE3gam/TpCw87fwPwuuSEL2EXMg6DgBY/HW6+E4OdQAA4lZ4CYnotVgBAEvShuiIRwAAXxV/y9Xbve+jSSHj2SfIl1RLQpwkRO1LmDEimJV+Qyqy+709wvZx/3wBAFhk3QQAONlYqKoxpGuijLDfvnduodmnTwIAUrM2ataThDhKSEp9FH2o38/5iopCuuO1/drqceAy+YiSAPI5m+rE9UvLcjTnweKfJWk7nVtppb5qkhB7hLAI01Y8wdSjyzLM9aCOJ9qrI+jDZTqkNlwBAByLixZOpMtk4uIeZrVrqkgVhtYL4x9m830iXXJDJCH2CGGqwXKB4gKxevw9eBgA0HDwIgAg94UdAICZL1JSkd5H5w2VVB4ZHg8A6IkkEoKMREKPhVTM/AHFPdNLxHFP6TnKdTIX8vOp7a8AABxWcpnVwZ9pLvjSlRYAwNzoKEmIS1TGlnqc2H1aWO5n8qSIFGsAAKdazVx53pR5pDog1SkMuF8z7rnD1yi+a4bRICy39vUBAPwDAhSVe5uy3Scp283+iUjE8ymSEJcQolaPVxZkkldPJRKiYmZqtl+3iy9vaWwk1agcJTUKJ18S9TI5gSu59ASjP07R9F0PW1YLV1BlzSMfhh1SZSaEkHe25ZMK1LQBANpa2wEAyTELxjUw64dZFOYJs21bxkjxcdAL1qzdCgBYXrlLEuJSlWFPdGlmuOIL6Lz/L4pITeZmIicnnH/SVV5cOfM9rJ9TpUyF5rl0YZXtebpISTr6viTEpXHIgy9NAwD4+voCAA4da+YIamn05OqbzKNc+bqMhwAAAwMDCiHudUMkIc4Swr7zakvf7698omNoaKiKqA6uXG+/kpB7jRCmBsEhscoVyikWrpoFAPAYJZ8wcqvjQQBAeKgRADDmST7n3HdXlRoGpV+KXFcVxWiO391F+zCY7dxC9baXhOglxPIL/UhqNlOEunKfNwAgInKYU5kLJ9Sbqjds9Ej15iYZOJVhVlfM9k3oERqf8ZE+xK0JYZElix96/iQ1iFRtXcYm+3E+5OaUafwdv3md8yEWi0WoMrcjVjKjiyNXSYirCWE5hzqrPVPA5ybZR4xc+d6VlzlfkKbakj20voMrj00f4fZNWI4k4xB3J4R9p5dmQjM3OX7AU3Of4+cy7XI/Ve7Dxk3eEiMJuSciVZbd3jZSjfkgdVi2KUyzvb1ydf+Tnf1KQvQSYisLTcyYodlh8ub7uPjDXnt1xGpr3M7OrnEtVG97SYg9QrYVPQcAWDywXZXdQslF9HXMIlZbpDBrrTOofAhlv7W+bwjr118sI082SL/wfZpfJ33IhBJiDAxWvtx0iFg0zMcR9bwqtGFM1cOAQ0NGLBLXvzUPdRbe2y1Vxi1UpiFsr/LpE+76rIQR7jzI3yD0Hepsl1mPdVilMrbGhSY51zt7JSFuEameKZjOZbfrKnxdOoGqLCuX/U62SUIcJaS8ZQN3fmItX74hqpwj6M1q/h9BJataOQLKW14TD9Sib8JMZT7MrZOEuAUhDhO0AuMiwJb919k0LjIu/UH7MMuXSUIcsjveuYt7IH7MHSdq7FkOAAgJpm3/t/Lpf6v23rlj/7Pt7DYJ28t37hwlJDHh8TEA6LcOCJ8QM3an7e5DKE/mDrUIquHO/fzF8Y2X6WnhdTb+lqJsISHs/R1b47P2R/7NkYQ4pDJhIXPoCXp3c/sOIR7OvW1gi6QRPyJimnegMLtlqhI+JwgAYG7qEZL37uatuubB+rltVqkyExKH3G1TkzHefhixhkBJiDRp0qTddfsfGCIUXNZsU4gAAAAASUVORK5CYII="/>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB |
@@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><rect width="16" height="16" fill="none"/><g id="b"><g id="c"><g id="d"><polygon id="e" points="12.2 2 14 3.8 9.8 8 14 12.2 12.2 14 8 9.8 3.8 14 2 12.2 6.2 8 2 3.8 3.8 2 8 6.2 12.2 2"/></g></g></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 308 B |
@@ -1,5 +0,0 @@
|
|||||||
<svg width="48" height="20" viewBox="0 0 48 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M48 10.334c0-3.418-1.653-6.115-4.813-6.115-3.174 0-5.094 2.697-5.094 6.088 0 4.019 2.267 6.048 5.52 6.048 1.587 0 2.787-.36 3.694-.868v-2.67c-.907.454-1.947.735-3.267.735-1.293 0-2.44-.454-2.587-2.03h6.52c0-.173.027-.868.027-1.188zm-6.587-1.268c0-1.51.92-2.137 1.76-2.137.813 0 1.68.628 1.68 2.136h-3.44zM32.947 4.22c-1.307 0-2.147.613-2.614 1.04l-.173-.827h-2.933V20l3.333-.707.013-3.779c.48.347 1.187.841 2.36.841 2.387 0 4.56-1.922 4.56-6.155-.013-3.871-2.213-5.98-4.546-5.98zm-.8 9.198c-.787 0-1.254-.28-1.574-.627l-.013-4.954c.347-.387.827-.654 1.587-.654 1.213 0 2.053 1.362 2.053 3.11 0 1.79-.827 3.125-2.053 3.125zM22.64 3.431l3.346-.72V0L22.64.708V3.43z" fill="#635BFF"/>
|
|
||||||
<path fill="#635BFF" d="M22.64 4.446h3.347v11.682H22.64z"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="m19.053 5.434-.213-.988h-2.88v11.682h3.333V8.211c.787-1.028 2.12-.841 2.534-.694V4.446c-.427-.16-1.987-.454-2.774.988zM12.387 1.549l-3.254.694-.013 10.694c0 1.976 1.48 3.431 3.453 3.431 1.094 0 1.894-.2 2.334-.44v-2.71c-.427.173-2.534.787-2.534-1.189V7.29h2.534V4.447h-2.534l.014-2.897zM3.373 7.837c0-.52.427-.72 1.134-.72 1.013 0 2.293.306 3.306.854V4.833a8.783 8.783 0 0 0-3.306-.614C1.8 4.22 0 5.634 0 7.997c0 3.685 5.067 3.098 5.067 4.687 0 .614-.534.814-1.28.814-1.107 0-2.52-.454-3.64-1.068v3.178a9.233 9.233 0 0 0 3.64.76c2.773 0 4.68-1.375 4.68-3.764-.014-3.98-5.094-3.271-5.094-4.767z" fill="#635BFF"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -40,6 +40,11 @@
|
|||||||
v-model="hero.auth.blocked"
|
v-model="hero.auth.blocked"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
> Ban / Block
|
> Ban / Block
|
||||||
|
<p>
|
||||||
|
<small>
|
||||||
|
Banning a user also auto-hides all their guild posts.
|
||||||
|
</small>
|
||||||
|
</p>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-inline">
|
<div class="form-inline">
|
||||||
|
|||||||
@@ -43,55 +43,42 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Perk offset months:
|
Months until renewal:
|
||||||
<strong>{{ hero.purchased.plan.consecutive.offset }}</strong>
|
<strong>{{ hero.purchased.plan.consecutive.offset }}</strong>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Next Mystic Hourglass:
|
Next Mystic Hourglass:
|
||||||
<strong>{{ nextHourglassDate }}</strong>
|
<strong>{{ nextHourglassDate }}</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-inline">
|
<div class="form-inline">
|
||||||
<label>
|
<label>
|
||||||
Mystic Hourglasses:
|
Mystic Hourglasses:
|
||||||
<input
|
<input
|
||||||
v-model="hero.purchased.plan.consecutive.trinkets"
|
v-model="hero.purchased.plan.consecutive.trinkets"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
type="number"
|
type="number"
|
||||||
min="0"
|
min="0"
|
||||||
step="1"
|
step="1"
|
||||||
>
|
>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-inline">
|
<div>
|
||||||
<label>
|
Gem cap:
|
||||||
Gem cap increase:
|
<strong>{{ hero.purchased.plan.consecutive.gemCapExtra + 25 }}</strong>
|
||||||
<input
|
</div>
|
||||||
v-model="hero.purchased.plan.consecutive.gemCapExtra"
|
<div class="form-inline">
|
||||||
class="form-control"
|
<label>
|
||||||
type="number"
|
Gems bought this month:
|
||||||
min="0"
|
<input
|
||||||
max="25"
|
v-model="hero.purchased.plan.gemsBought"
|
||||||
step="5"
|
class="form-control"
|
||||||
>
|
type="number"
|
||||||
</label>
|
min="0"
|
||||||
</div>
|
:max="hero.purchased.plan.consecutive.gemCapExtra + 25"
|
||||||
<div>
|
step="1"
|
||||||
Total Gem cap:
|
>
|
||||||
<strong>{{ Number(hero.purchased.plan.consecutive.gemCapExtra) + 25 }}</strong>
|
</label>
|
||||||
</div>
|
</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
|
<div
|
||||||
v-if="hero.purchased.plan.extraMonths > 0"
|
v-if="hero.purchased.plan.extraMonths > 0"
|
||||||
>
|
>
|
||||||
@@ -152,6 +139,13 @@ export default {
|
|||||||
return currentPlanContext.nextHourglassDate.format('MMMM');
|
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: {
|
methods: {
|
||||||
dateFormat (date) {
|
dateFormat (date) {
|
||||||
return moment(date).format('YYYY/MM/DD');
|
return moment(date).format('YYYY/MM/DD');
|
||||||
|
|||||||
@@ -86,13 +86,6 @@
|
|||||||
>{{ $t('companyContribute') }}
|
>{{ $t('companyContribute') }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
href="https://translate.habitica.com/"
|
|
||||||
target="_blank"
|
|
||||||
>{{ $t('translateHabitica') }}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!-- Support -->
|
<!-- Support -->
|
||||||
@@ -108,7 +101,6 @@
|
|||||||
v-if="user"
|
v-if="user"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
href=""
|
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@click.prevent="openBugReportModal()"
|
@click.prevent="openBugReportModal()"
|
||||||
>
|
>
|
||||||
@@ -232,7 +224,7 @@
|
|||||||
></div>
|
></div>
|
||||||
</a><a
|
</a><a
|
||||||
class="social-circle"
|
class="social-circle"
|
||||||
href="http://blog.habitrpg.com/"
|
href="https://www.tumblr.com/Habitica"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@@ -480,6 +472,10 @@ footer {
|
|||||||
color: $purple-300;
|
color: $purple-300;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
a:not([href]):not([class]):hover { // needed to make "report a bug"'s hover state correct
|
||||||
|
color: $purple-300;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
column-gap: 1.5rem;
|
column-gap: 1.5rem;
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -582,7 +578,6 @@ h3 {
|
|||||||
.text{
|
.text{
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
text-overflow: hidden;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -679,6 +674,11 @@ h3 {
|
|||||||
|
|
||||||
footer {
|
footer {
|
||||||
padding: 24px 16px;
|
padding: 24px 16px;
|
||||||
|
a:not([href]):not([class]):hover { // needed to make "report a bug"'s hover state correct
|
||||||
|
color: $purple-300;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
column-gap: 1.5rem;
|
column-gap: 1.5rem;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-areas:
|
grid-template-areas:
|
||||||
@@ -718,6 +718,10 @@ h3 {
|
|||||||
@media (max-width: 1024px) and (min-width: 768px) {
|
@media (max-width: 1024px) and (min-width: 768px) {
|
||||||
footer {
|
footer {
|
||||||
padding: 24px 24px;
|
padding: 24px 24px;
|
||||||
|
a:not([href]):not([class]):hover { // needed to make "report a bug"'s hover state correct
|
||||||
|
color: $purple-300;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.desktop {
|
.desktop {
|
||||||
@@ -810,7 +814,7 @@ export default {
|
|||||||
...mapState({ user: 'user.data' }),
|
...mapState({ user: 'user.data' }),
|
||||||
...mapState(['isUserLoaded']),
|
...mapState(['isUserLoaded']),
|
||||||
getDataDisplayToolUrl () {
|
getDataDisplayToolUrl () {
|
||||||
const base = 'https://tools.habitica.com/';
|
const base = 'https://oldgods.net/habitrpg/habitrpg_user_data_display.html';
|
||||||
if (!this.user) return null;
|
if (!this.user) return null;
|
||||||
return `${base}?uuid=${this.user._id}`;
|
return `${base}?uuid=${this.user._id}`;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -159,6 +159,7 @@ label {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.cancel-link {
|
.cancel-link {
|
||||||
|
color: $blue-10;
|
||||||
line-height: 1.71;
|
line-height: 1.71;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ label {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.cancel-link {
|
.cancel-link {
|
||||||
|
color: $blue-10;
|
||||||
line-height: 1.71;
|
line-height: 1.71;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,21 +50,7 @@ export default {
|
|||||||
challengeId: this.challengeId,
|
challengeId: this.challengeId,
|
||||||
keep,
|
keep,
|
||||||
});
|
});
|
||||||
const userTasksByType = (await this.$store.dispatch('tasks:fetchUserTasks', { forceLoad: true })).data;
|
await this.$store.dispatch('tasks:fetchUserTasks', { forceLoad: true });
|
||||||
let tagInUse = false;
|
|
||||||
Object.keys(userTasksByType).forEach(taskType => {
|
|
||||||
userTasksByType[taskType].forEach(task => {
|
|
||||||
if (task.tags.indexOf(this.challengeId) > -1) {
|
|
||||||
tagInUse = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
if (!tagInUse) {
|
|
||||||
await this.$store.dispatch(
|
|
||||||
'tags:deleteTag',
|
|
||||||
{ tagId: this.challengeId },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
this.close();
|
this.close();
|
||||||
},
|
},
|
||||||
close () {
|
close () {
|
||||||
|
|||||||
@@ -77,6 +77,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
a.cancel-link {
|
a.cancel-link {
|
||||||
|
color: $blue-10;
|
||||||
margin-right: .5em;
|
margin-right: .5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
v-if="editing"
|
v-if="editing"
|
||||||
class="menu-container col-2"
|
class="menu-container col-2"
|
||||||
:class="{active: activeTopPage === 'backgrounds'}"
|
:class="{active: activeTopPage === 'backgrounds'}"
|
||||||
@click="changeTopPage('backgrounds', '2023')"
|
@click="changeTopPage('backgrounds', '2022')"
|
||||||
>
|
>
|
||||||
<div class="menu-item">
|
<div class="menu-item">
|
||||||
<div
|
<div
|
||||||
@@ -198,79 +198,52 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="!filterBackgrounds && user.purchased.background.birthday_bash"
|
v-if="!filterBackgrounds"
|
||||||
|
class="row text-center title-row"
|
||||||
|
>
|
||||||
|
<strong>{{ backgroundShopSets[1].text }}</strong>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="!filterBackgrounds"
|
||||||
|
class="row title-row"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="row text-center title-row"
|
v-for="bg in backgroundShopSets[1].items"
|
||||||
>
|
:key="bg.key"
|
||||||
<strong>{{ backgroundShopSets[2].text }}</strong>
|
class="col-4 text-center customize-option background-button"
|
||||||
</div>
|
:popover-title="bg.text"
|
||||||
<div
|
:popover="bg.notes"
|
||||||
class="row title-row"
|
popover-trigger="mouseenter"
|
||||||
|
@click="!user.purchased.background[bg.key]
|
||||||
|
? backgroundSelected(bg) : unlock('background.' + bg.key)"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="bg in backgroundShopSets[2].items"
|
class="background"
|
||||||
:key="bg.key"
|
:class="[`background_${bg.key}`, backgroundLockedStatus(bg.key)]"
|
||||||
class="col-4 text-center customize-option background-button"
|
></div>
|
||||||
:popover-title="bg.text"
|
<i
|
||||||
:popover="bg.notes"
|
v-if="!user.purchased.background[bg.key]"
|
||||||
popover-trigger="mouseenter"
|
class="glyphicon glyphicon-lock"
|
||||||
@click="unlock('background.' + bg.key)"
|
></i>
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="background"
|
|
||||||
:class="`background_${bg.key}`"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-if="!filterBackgrounds">
|
|
||||||
<div
|
|
||||||
class="row text-center title-row"
|
|
||||||
>
|
|
||||||
<strong>{{ backgroundShopSets[1].text }}</strong>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="row title-row"
|
|
||||||
>
|
|
||||||
<div
|
<div
|
||||||
v-for="bg in backgroundShopSets[1].items"
|
v-if="!user.purchased.background[bg.key]"
|
||||||
:key="bg.key"
|
class="purchase-background single d-flex align-items-center justify-content-center"
|
||||||
class="col-4 text-center customize-option background-button"
|
|
||||||
:popover-title="bg.text"
|
|
||||||
:popover="bg.notes"
|
|
||||||
popover-trigger="mouseenter"
|
|
||||||
@click="!user.purchased.background[bg.key]
|
|
||||||
? backgroundSelected(bg) : unlock('background.' + bg.key)"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="background"
|
class="svg-icon hourglass"
|
||||||
:class="[`background_${bg.key}`, backgroundLockedStatus(bg.key)]"
|
v-html="icons.hourglass"
|
||||||
></div>
|
></div>
|
||||||
<i
|
<span class="price">1</span>
|
||||||
v-if="!user.purchased.background[bg.key]"
|
|
||||||
class="glyphicon glyphicon-lock"
|
|
||||||
></i>
|
|
||||||
<div
|
|
||||||
v-if="!user.purchased.background[bg.key]"
|
|
||||||
class="purchase-background single d-flex align-items-center justify-content-center"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="svg-icon hourglass"
|
|
||||||
v-html="icons.hourglass"
|
|
||||||
></div>
|
|
||||||
<span class="price">1</span>
|
|
||||||
</div>
|
|
||||||
<span
|
|
||||||
v-if="!user.purchased.background[bg.key]"
|
|
||||||
class="badge-top"
|
|
||||||
@click.stop.prevent="togglePinned(bg)"
|
|
||||||
>
|
|
||||||
<pin-badge
|
|
||||||
:pinned="isBackgroundPinned(bg)"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
<span
|
||||||
|
v-if="!user.purchased.background[bg.key]"
|
||||||
|
class="badge-top"
|
||||||
|
@click.stop.prevent="togglePinned(bg)"
|
||||||
|
>
|
||||||
|
<pin-badge
|
||||||
|
:pinned="isBackgroundPinned(bg)"
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<sub-menu
|
<sub-menu
|
||||||
@@ -1212,7 +1185,7 @@ export default {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
bgSubMenuItems: ['2023', '2022', '2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
|
bgSubMenuItems: ['2022', '2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
|
||||||
id: y,
|
id: y,
|
||||||
label: y,
|
label: y,
|
||||||
})),
|
})),
|
||||||
@@ -1241,7 +1214,6 @@ export default {
|
|||||||
2020: [],
|
2020: [],
|
||||||
2021: [],
|
2021: [],
|
||||||
2022: [],
|
2022: [],
|
||||||
2023: [],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Hack to force update for now until we restructure the data
|
// Hack to force update for now until we restructure the data
|
||||||
|
|||||||
@@ -78,6 +78,7 @@
|
|||||||
@import '~@/assets/scss/colors.scss';
|
@import '~@/assets/scss/colors.scss';
|
||||||
|
|
||||||
a:not([href]) {
|
a:not([href]) {
|
||||||
|
color: $blue-10;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -245,6 +245,10 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
color: $gray-100;
|
color: $gray-100;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $blue-10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#quest-detail-modal {
|
#quest-detail-modal {
|
||||||
|
|||||||
@@ -377,9 +377,11 @@
|
|||||||
|
|
||||||
.members-invited {
|
.members-invited {
|
||||||
min-height: 1rem;
|
min-height: 1rem;
|
||||||
|
color: $blue-10;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|
||||||
&:hover, &:focus {
|
&:hover, &:focus {
|
||||||
|
color: $blue-10;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -340,13 +340,12 @@
|
|||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
v-once
|
v-once
|
||||||
href="https://tools.habitica.com/"
|
href="https://oldgods.net/habitrpg/habitrpg_user_data_display.html"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>{{ $t('dataDisplayTool') }}</a>
|
>{{ $t('dataDisplayTool') }}</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
href=""
|
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@click.prevent="openBugReportModal()"
|
@click.prevent="openBugReportModal()"
|
||||||
>
|
>
|
||||||
@@ -522,6 +521,21 @@
|
|||||||
margin-left: .5em;
|
margin-left: .5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// formats the report a bug link to match the others
|
||||||
|
a:not([href]) {
|
||||||
|
&:not([role=button]) {
|
||||||
|
color: #007bff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a:not([href]):hover {
|
||||||
|
&:not([role=button]) {
|
||||||
|
color: #0056b3;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.tier1-icon, .tier2-icon {
|
.tier1-icon, .tier2-icon {
|
||||||
width: 11px;
|
width: 11px;
|
||||||
}
|
}
|
||||||
@@ -745,7 +759,6 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import find from 'lodash/find';
|
|
||||||
import { mapState } from '@/libs/store';
|
import { mapState } from '@/libs/store';
|
||||||
import { goToModForm } from '@/libs/modform';
|
import { goToModForm } from '@/libs/modform';
|
||||||
|
|
||||||
@@ -822,23 +835,22 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
...mapState({
|
...mapState({
|
||||||
user: 'user.data',
|
user: 'user.data',
|
||||||
currentEventList: 'worldState.data.currentEventList',
|
currentEvent: 'worldState.data.currentEvent',
|
||||||
}),
|
}),
|
||||||
questData () {
|
questData () {
|
||||||
if (!this.group.quest) return {};
|
if (!this.group.quest) return {};
|
||||||
return quests.quests[this.group.quest.key];
|
return quests.quests[this.group.quest.key];
|
||||||
},
|
},
|
||||||
imageURLs () {
|
imageURLs () {
|
||||||
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
|
if (!this.currentEvent || !this.currentEvent.season) {
|
||||||
if (!currentEvent) {
|
|
||||||
return {
|
return {
|
||||||
background: 'url(/static/npc/normal/tavern_background.png)',
|
background: 'url(/static/npc/normal/tavern_background.png)',
|
||||||
npc: 'url(/static/npc/normal/tavern_npc.png)',
|
npc: 'url(/static/npc/normal/tavern_npc.png)',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
background: `url(/static/npc/${currentEvent.season}/tavern_background.png)`,
|
background: `url(/static/npc/${this.currentEvent.season}/tavern_background.png)`,
|
||||||
npc: `url(/static/npc/${currentEvent.season}/tavern_npc.png)`,
|
npc: `url(/static/npc/${this.currentEvent.season}/tavern_npc.png)`,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
<template>
|
|
||||||
<base-banner
|
|
||||||
banner-id="birthday-banner"
|
|
||||||
class="birthday-banner"
|
|
||||||
:show="showBirthdayBanner"
|
|
||||||
height="3rem"
|
|
||||||
:can-close="false"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
slot="content"
|
|
||||||
:aria-label="$t('celebrateBirthday')"
|
|
||||||
class="content d-flex justify-content-around align-items-center ml-auto mr-auto"
|
|
||||||
@click="showBirthdayModal"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-once
|
|
||||||
class="svg-icon svg-gifts left-gift"
|
|
||||||
v-html="icons.giftsBirthday"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-once
|
|
||||||
class="svg-icon svg-ten-birthday"
|
|
||||||
v-html="icons.tenBirthday"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-once
|
|
||||||
class="announce-text"
|
|
||||||
v-html="$t('celebrateBirthday')"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-once
|
|
||||||
class="svg-icon svg-gifts right-gift"
|
|
||||||
v-html="icons.giftsBirthday"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</base-banner>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
@import '~@/assets/scss/colors.scss';
|
|
||||||
|
|
||||||
.announce-text {
|
|
||||||
color: $purple-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.birthday-banner {
|
|
||||||
width: 100%;
|
|
||||||
min-height: 48px;
|
|
||||||
padding: 8px;
|
|
||||||
background-image: linear-gradient(90deg,
|
|
||||||
rgba(255,190,93,0) 0%,
|
|
||||||
rgba(255,190,93,1) 25%,
|
|
||||||
rgba(255,190,93,1) 75%,
|
|
||||||
rgba(255,190,93,0) 100%),
|
|
||||||
url('~@/assets/images/glitter.png');
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.left-gift {
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.right-gift {
|
|
||||||
margin: auto auto auto 8px;
|
|
||||||
filter: flipH;
|
|
||||||
transform: scaleX(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-gifts {
|
|
||||||
width: 85px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-ten-birthday {
|
|
||||||
width: 192.5px;
|
|
||||||
margin-left: 8px;
|
|
||||||
margin-right: 8.5px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import find from 'lodash/find';
|
|
||||||
import { mapState } from '@/libs/store';
|
|
||||||
import BaseBanner from './base';
|
|
||||||
|
|
||||||
import giftsBirthday from '@/assets/svg/gifts-birthday.svg';
|
|
||||||
import tenBirthday from '@/assets/svg/10th-birthday-linear.svg';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
BaseBanner,
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
icons: Object.freeze({
|
|
||||||
giftsBirthday,
|
|
||||||
tenBirthday,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState({
|
|
||||||
currentEventList: 'worldState.data.currentEventList',
|
|
||||||
}),
|
|
||||||
showBirthdayBanner () {
|
|
||||||
return Boolean(find(this.currentEventList, event => Boolean(event.event === 'birthday10')));
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
showBirthdayModal () {
|
|
||||||
this.$root.$emit('bv::show::modal', 'birthday-modal');
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
</script>
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<template>
|
|
||||||
<base-notification
|
|
||||||
:can-remove="canRemove"
|
|
||||||
:has-icon="true"
|
|
||||||
:notification="notification"
|
|
||||||
:read-after-click="true"
|
|
||||||
@click="action"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
slot="content"
|
|
||||||
>
|
|
||||||
<strong> {{ notification.data.title }} </strong>
|
|
||||||
<span> {{ notification.data.text }} </span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
slot="icon"
|
|
||||||
class="mt-3"
|
|
||||||
:class="notification.data.icon"
|
|
||||||
></div>
|
|
||||||
</base-notification>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import BaseNotification from './base';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
BaseNotification,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
notification: {
|
|
||||||
type: Object,
|
|
||||||
default (data) {
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
canRemove: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
action () {
|
|
||||||
if (!this.notification || !this.notification.data) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.notification.data.destination === 'backgrounds') {
|
|
||||||
this.$store.state.avatarEditorOptions.editingUser = true;
|
|
||||||
this.$store.state.avatarEditorOptions.startingPage = 'backgrounds';
|
|
||||||
this.$store.state.avatarEditorOptions.subpage = '2023';
|
|
||||||
this.$root.$emit('bv::show::modal', 'avatar-modal');
|
|
||||||
} else {
|
|
||||||
this.$router.push({ name: this.notification.data.destination || 'items' });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
@@ -5,14 +5,7 @@
|
|||||||
:notification="notification"
|
:notification="notification"
|
||||||
>
|
>
|
||||||
<div slot="content">
|
<div slot="content">
|
||||||
<div
|
<div v-html="$t('invitedToParty', {party: notification.data.name})"></div>
|
||||||
v-html="$t('invitedToPartyBy', {
|
|
||||||
userId: notification.data.inviter,
|
|
||||||
userName: invitingUser.auth ? invitingUser.auth.local.username : null,
|
|
||||||
party: notification.data.name,
|
|
||||||
})"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="notifications-buttons">
|
<div class="notifications-buttons">
|
||||||
<div
|
<div
|
||||||
class="btn btn-small btn-success"
|
class="btn btn-small btn-success"
|
||||||
@@ -39,31 +32,10 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
BaseNotification,
|
BaseNotification,
|
||||||
},
|
},
|
||||||
props: {
|
props: ['notification', 'canRemove'],
|
||||||
notification: {
|
|
||||||
type: Object,
|
|
||||||
default (data) {
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
canRemove: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
invitingUser: {},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapState({ user: 'user.data' }),
|
...mapState({ user: 'user.data' }),
|
||||||
},
|
},
|
||||||
async mounted () {
|
|
||||||
this.invitingUser = await this.$store.dispatch('members:fetchMember', {
|
|
||||||
memberId: this.notification.data.inviter,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
async accept () {
|
async accept () {
|
||||||
const group = this.notification.data;
|
const group = this.notification.data;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
{{ $t('notifications') }}
|
{{ $t('notifications') }}
|
||||||
</h4>
|
</h4>
|
||||||
<a
|
<a
|
||||||
class="small-link"
|
class="small-link standard-link"
|
||||||
:disabled="notificationsCount === 0"
|
:disabled="notificationsCount === 0"
|
||||||
@click="dismissAll"
|
@click="dismissAll"
|
||||||
>{{ $t('dismissAll') }}</a>
|
>{{ $t('dismissAll') }}</a>
|
||||||
@@ -123,24 +123,23 @@ import successImage from '@/assets/svg/success.svg';
|
|||||||
import starBadge from '@/assets/svg/star-badge.svg';
|
import starBadge from '@/assets/svg/star-badge.svg';
|
||||||
|
|
||||||
// Notifications
|
// Notifications
|
||||||
import CARD_RECEIVED from './notifications/cardReceived';
|
import NEW_STUFF from './notifications/newStuff';
|
||||||
import CHALLENGE_INVITATION from './notifications/challengeInvitation';
|
|
||||||
import GIFT_ONE_GET_ONE from './notifications/g1g1';
|
|
||||||
import GROUP_TASK_ASSIGNED from './notifications/groupTaskAssigned';
|
|
||||||
import GROUP_TASK_CLAIMED from './notifications/groupTaskClaimed';
|
|
||||||
import GROUP_TASK_NEEDS_WORK from './notifications/groupTaskNeedsWork';
|
import GROUP_TASK_NEEDS_WORK from './notifications/groupTaskNeedsWork';
|
||||||
import GUILD_INVITATION from './notifications/guildInvitation';
|
import GUILD_INVITATION from './notifications/guildInvitation';
|
||||||
import ITEM_RECEIVED from './notifications/itemReceived';
|
|
||||||
import NEW_CHAT_MESSAGE from './notifications/newChatMessage';
|
|
||||||
import NEW_INBOX_MESSAGE from './notifications/newPrivateMessage';
|
|
||||||
import NEW_MYSTERY_ITEMS from './notifications/newMysteryItems';
|
|
||||||
import NEW_STUFF from './notifications/newStuff';
|
|
||||||
import ONBOARDING_COMPLETE from './notifications/onboardingComplete';
|
|
||||||
import PARTY_INVITATION from './notifications/partyInvitation';
|
import PARTY_INVITATION from './notifications/partyInvitation';
|
||||||
|
import CHALLENGE_INVITATION from './notifications/challengeInvitation';
|
||||||
import QUEST_INVITATION from './notifications/questInvitation';
|
import QUEST_INVITATION from './notifications/questInvitation';
|
||||||
|
import GROUP_TASK_ASSIGNED from './notifications/groupTaskAssigned';
|
||||||
|
import GROUP_TASK_CLAIMED from './notifications/groupTaskClaimed';
|
||||||
import UNALLOCATED_STATS_POINTS from './notifications/unallocatedStatsPoints';
|
import UNALLOCATED_STATS_POINTS from './notifications/unallocatedStatsPoints';
|
||||||
import VERIFY_USERNAME from './notifications/verifyUsername';
|
import NEW_MYSTERY_ITEMS from './notifications/newMysteryItems';
|
||||||
|
import CARD_RECEIVED from './notifications/cardReceived';
|
||||||
|
import NEW_INBOX_MESSAGE from './notifications/newPrivateMessage';
|
||||||
|
import NEW_CHAT_MESSAGE from './notifications/newChatMessage';
|
||||||
import WORLD_BOSS from './notifications/worldBoss';
|
import WORLD_BOSS from './notifications/worldBoss';
|
||||||
|
import VERIFY_USERNAME from './notifications/verifyUsername';
|
||||||
|
import ONBOARDING_COMPLETE from './notifications/onboardingComplete';
|
||||||
|
import GIFT_ONE_GET_ONE from './notifications/g1g1';
|
||||||
import OnboardingGuide from './onboardingGuide';
|
import OnboardingGuide from './onboardingGuide';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -148,25 +147,24 @@ export default {
|
|||||||
MenuDropdown,
|
MenuDropdown,
|
||||||
MessageCount,
|
MessageCount,
|
||||||
// One component for each type
|
// One component for each type
|
||||||
CARD_RECEIVED,
|
NEW_STUFF,
|
||||||
CHALLENGE_INVITATION,
|
|
||||||
GIFT_ONE_GET_ONE,
|
|
||||||
GROUP_TASK_ASSIGNED,
|
|
||||||
GROUP_TASK_CLAIMED,
|
|
||||||
GROUP_TASK_NEEDS_WORK,
|
GROUP_TASK_NEEDS_WORK,
|
||||||
GUILD_INVITATION,
|
GUILD_INVITATION,
|
||||||
ITEM_RECEIVED,
|
|
||||||
NEW_CHAT_MESSAGE,
|
|
||||||
NEW_INBOX_MESSAGE,
|
|
||||||
NEW_MYSTERY_ITEMS,
|
|
||||||
NEW_STUFF,
|
|
||||||
ONBOARDING_COMPLETE,
|
|
||||||
PARTY_INVITATION,
|
PARTY_INVITATION,
|
||||||
|
CHALLENGE_INVITATION,
|
||||||
QUEST_INVITATION,
|
QUEST_INVITATION,
|
||||||
|
GROUP_TASK_ASSIGNED,
|
||||||
|
GROUP_TASK_CLAIMED,
|
||||||
UNALLOCATED_STATS_POINTS,
|
UNALLOCATED_STATS_POINTS,
|
||||||
VERIFY_USERNAME,
|
NEW_MYSTERY_ITEMS,
|
||||||
|
CARD_RECEIVED,
|
||||||
|
NEW_INBOX_MESSAGE,
|
||||||
|
NEW_CHAT_MESSAGE,
|
||||||
WorldBoss: WORLD_BOSS,
|
WorldBoss: WORLD_BOSS,
|
||||||
|
VERIFY_USERNAME,
|
||||||
OnboardingGuide,
|
OnboardingGuide,
|
||||||
|
ONBOARDING_COMPLETE,
|
||||||
|
GIFT_ONE_GET_ONE,
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
@@ -187,7 +185,6 @@ export default {
|
|||||||
// NOTE: Those not listed here won't be shown in the notification panel!
|
// NOTE: Those not listed here won't be shown in the notification panel!
|
||||||
handledNotifications: [
|
handledNotifications: [
|
||||||
'NEW_STUFF',
|
'NEW_STUFF',
|
||||||
'ITEM_RECEIVED',
|
|
||||||
'GIFT_ONE_GET_ONE',
|
'GIFT_ONE_GET_ONE',
|
||||||
'GROUP_TASK_NEEDS_WORK',
|
'GROUP_TASK_NEEDS_WORK',
|
||||||
'GUILD_INVITATION',
|
'GUILD_INVITATION',
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
>{{ $t('editAvatar') }}</a>
|
>{{ $t('editAvatar') }}</a>
|
||||||
<a
|
<a
|
||||||
class="topbar-dropdown-item dropdown-item dropdown-separated"
|
class="topbar-dropdown-item dropdown-item dropdown-separated"
|
||||||
@click="showAvatar('backgrounds', '2023')"
|
@click="showAvatar('backgrounds', '2022')"
|
||||||
>{{ $t('backgrounds') }}</a>
|
>{{ $t('backgrounds') }}</a>
|
||||||
<a
|
<a
|
||||||
class="topbar-dropdown-item dropdown-item"
|
class="topbar-dropdown-item dropdown-item"
|
||||||
|
|||||||
@@ -879,7 +879,7 @@ export default {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.user.preferences.suppressModals.hatchPet) {
|
if (this.user.preferences.suppressModals.raisePet) {
|
||||||
this.hatchPet(pet);
|
this.hatchPet(pet);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,877 +0,0 @@
|
|||||||
<template>
|
|
||||||
<b-modal
|
|
||||||
id="birthday-modal"
|
|
||||||
:hide-header="true"
|
|
||||||
:hide-footer="true"
|
|
||||||
>
|
|
||||||
<div class="modal-content">
|
|
||||||
<div
|
|
||||||
class="modal-close"
|
|
||||||
@click="close()"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="svg-icon svg-close"
|
|
||||||
v-html="icons.close"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="svg-confetti svg-icon"
|
|
||||||
v-html="icons.confetti"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<img
|
|
||||||
src="~@/assets/images/10-birthday.png"
|
|
||||||
class="ten-birthday"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="limited-wrapper">
|
|
||||||
<div
|
|
||||||
class="svg-gifts svg-icon"
|
|
||||||
v-html="icons.gifts"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="limited-event">
|
|
||||||
{{ $t('limitedEvent') }}
|
|
||||||
</div>
|
|
||||||
<div class="dates">
|
|
||||||
{{ $t('anniversaryLimitedDates') }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="svg-gifts-flip svg-icon"
|
|
||||||
v-html="icons.gifts"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="celebrate d-flex justify-content-center">
|
|
||||||
{{ $t('celebrateAnniversary') }}
|
|
||||||
</div>
|
|
||||||
<h2 class="d-flex justify-content-center">
|
|
||||||
<span
|
|
||||||
class="left-divider"
|
|
||||||
v-html="icons.divider"
|
|
||||||
></span>
|
|
||||||
<span
|
|
||||||
class="svg-cross"
|
|
||||||
v-html="icons.cross"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
{{ $t('jubilantGryphatricePromo') }}
|
|
||||||
<span
|
|
||||||
class="svg-cross"
|
|
||||||
v-html="icons.cross"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="right-divider"
|
|
||||||
></span>
|
|
||||||
</h2>
|
|
||||||
<!-- gryphatrice info -->
|
|
||||||
<div class="d-flex">
|
|
||||||
<div class="jubilant-gryphatrice d-flex mr-auto">
|
|
||||||
<img
|
|
||||||
src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Gryphatrice-Jubilant-Large.gif"
|
|
||||||
width="156px"
|
|
||||||
height="144px"
|
|
||||||
alt="a pink, purple, and green gryphatrice pet winks at you adorably"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="align-items-center">
|
|
||||||
<div class="limited-edition mr-auto">
|
|
||||||
{{ $t('limitedEdition') }}
|
|
||||||
</div>
|
|
||||||
<div class="gryphatrice-text">
|
|
||||||
{{ $t('anniversaryGryphatriceText') }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="gryphatrice-price"
|
|
||||||
v-html="$t('anniversaryGryphatricePrice')"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- beginning of payments -->
|
|
||||||
<!-- buy with money OR gems -->
|
|
||||||
<div
|
|
||||||
v-if="!ownGryphatrice && !gryphBought"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="selectedPage !== 'payment-buttons'"
|
|
||||||
id="initial-buttons"
|
|
||||||
class="d-flex justify-content-center"
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
class="btn btn-secondary buy-now-left"
|
|
||||||
:class="{active: selectedPage === 'payment-buttons'}"
|
|
||||||
@click="selectedPage = 'payment-buttons'"
|
|
||||||
>
|
|
||||||
{{ $t('buyNowMoneyButton') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
class="btn btn-secondary buy-now-right"
|
|
||||||
@click="buyGryphatriceGems()"
|
|
||||||
>
|
|
||||||
{{ $t('buyNowGemsButton') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<!-- buy with money -->
|
|
||||||
<div
|
|
||||||
v-else-if="selectedPage === 'payment-buttons'"
|
|
||||||
id="payment-buttons"
|
|
||||||
class="d-flex flex-column"
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
class="btn btn-secondary d-flex stripe"
|
|
||||||
@click="redirectToStripe({ sku: 'price_0MPZ6iZCD0RifGXlLah2furv' })"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="svg-stripe"
|
|
||||||
v-html="icons.stripe"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
class="btn btn-secondary d-flex paypal"
|
|
||||||
@click="openPaypal({
|
|
||||||
url: paypalCheckoutLink, type: 'sku', sku: 'Pet-Gryphatrice-Jubilant'
|
|
||||||
})"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="svg-paypal"
|
|
||||||
v-html="icons.paypal"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
<amazon-button
|
|
||||||
:disabled="disabled"
|
|
||||||
:amazon-data="amazonData"
|
|
||||||
class="btn btn-secondary d-flex amazon"
|
|
||||||
v-html="icons.amazon"
|
|
||||||
/>
|
|
||||||
<div
|
|
||||||
class="pay-with-gems"
|
|
||||||
@click="selectedPage = 'initial-buttons'"
|
|
||||||
>
|
|
||||||
{{ $t('wantToPayWithGemsText') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Own the gryphatrice -->
|
|
||||||
<div
|
|
||||||
v-else
|
|
||||||
class="d-flex"
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
class="own-gryphatrice-button"
|
|
||||||
@click="closeAndRedirect('/inventory/stable')"
|
|
||||||
v-html="$t('ownJubilantGryphatrice')"
|
|
||||||
>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<!-- end of payments -->
|
|
||||||
<h2 class="d-flex justify-content-center">
|
|
||||||
<span
|
|
||||||
class="left-divider"
|
|
||||||
v-html="icons.divider"
|
|
||||||
></span>
|
|
||||||
<span
|
|
||||||
class="svg-cross"
|
|
||||||
v-html="icons.cross"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
{{ $t('plentyOfPotions') }}
|
|
||||||
<span
|
|
||||||
class="svg-cross"
|
|
||||||
v-html="icons.cross"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="right-divider"
|
|
||||||
></span>
|
|
||||||
</h2>
|
|
||||||
<div class="plenty-of-potions d-flex">
|
|
||||||
{{ $t('plentyOfPotionsText') }}
|
|
||||||
</div>
|
|
||||||
<div class="potions">
|
|
||||||
<div class="pot-1">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Porcelain.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-2">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Vampire.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-3">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Aquatic.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-4">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_StainedGlass.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-5">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Celestial.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-6">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Glow.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-7">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_AutumnLeaf.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-8">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_SandSculpture.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-9">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Peppermint.png">
|
|
||||||
</div>
|
|
||||||
<div class="pot-10">
|
|
||||||
<img src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Shimmer.png">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
class="btn btn-secondary d-flex justify-content-center visit-the-market"
|
|
||||||
@click="closeAndRedirect('/shops/market')"
|
|
||||||
>
|
|
||||||
{{ $t('visitTheMarketButton') }}
|
|
||||||
</button>
|
|
||||||
<h2 class="d-flex justify-content-center">
|
|
||||||
<span
|
|
||||||
class="left-divider"
|
|
||||||
v-html="icons.divider"
|
|
||||||
></span>
|
|
||||||
<span
|
|
||||||
class="svg-cross"
|
|
||||||
v-html="icons.cross"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
{{ $t('fourForFree') }}
|
|
||||||
<span
|
|
||||||
class="svg-cross"
|
|
||||||
v-html="icons.cross"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="right-divider"
|
|
||||||
></span>
|
|
||||||
</h2>
|
|
||||||
<div class="four-for-free">
|
|
||||||
{{ $t('fourForFreeText') }}
|
|
||||||
</div>
|
|
||||||
<div class="four-grid d-flex justify-content-center">
|
|
||||||
<div class="day-one-a">
|
|
||||||
<div class="day-text">
|
|
||||||
{{ $t('dayOne') }}
|
|
||||||
</div>
|
|
||||||
<div class="gift d-flex justify-content-center align-items-middle">
|
|
||||||
<img
|
|
||||||
src="~@/assets/images/robes.webp"
|
|
||||||
class="m-auto"
|
|
||||||
width="40px"
|
|
||||||
height="66px"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="description">
|
|
||||||
{{ $t('partyRobes') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="day-one-b">
|
|
||||||
<div class="day-text">
|
|
||||||
{{ $t('dayOne') }}
|
|
||||||
</div>
|
|
||||||
<div class="gift d-flex justify-content-center align-items-middle">
|
|
||||||
<div
|
|
||||||
class="svg-gem svg-icon m-auto"
|
|
||||||
v-html="icons.birthdayGems"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="description">
|
|
||||||
{{ $t('twentyGems') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="day-five">
|
|
||||||
<div class="day-text">
|
|
||||||
{{ $t('dayFive') }}
|
|
||||||
</div>
|
|
||||||
<div class="gift d-flex justify-content-center align-items-middle">
|
|
||||||
<img
|
|
||||||
src="~@/assets/images/habitica-hero-goober.webp"
|
|
||||||
class="m-auto"
|
|
||||||
><!-- Birthday Set -->
|
|
||||||
</div>
|
|
||||||
<div class="description">
|
|
||||||
{{ $t('birthdaySet') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="day-ten">
|
|
||||||
<div class="day-text">
|
|
||||||
{{ $t('dayTen') }}
|
|
||||||
</div>
|
|
||||||
<div class="gift d-flex justify-content-center align-items-middle">
|
|
||||||
<div
|
|
||||||
class="svg-background svg-icon m-auto"
|
|
||||||
v-html="icons.birthdayBackground"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="description">
|
|
||||||
{{ $t('background') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="modal-bottom">
|
|
||||||
<div class="limitations d-flex justify-content-center">
|
|
||||||
{{ $t('limitations') }}
|
|
||||||
</div>
|
|
||||||
<div class="fine-print">
|
|
||||||
{{ $t('anniversaryLimitations') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</b-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
#birthday-modal {
|
|
||||||
.modal-body {
|
|
||||||
padding: 0px;
|
|
||||||
border: 0px;
|
|
||||||
}
|
|
||||||
.modal-content {
|
|
||||||
border-radius: 14px;
|
|
||||||
border: 0px;
|
|
||||||
}
|
|
||||||
.modal-footer {
|
|
||||||
border-radius: 14px;
|
|
||||||
border: 0px;
|
|
||||||
}
|
|
||||||
.amazon {
|
|
||||||
margin-bottom: 16px;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
width: 84px;
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
.amazonpay-button-inner-image {
|
|
||||||
opacity: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
@import '~@/assets/scss/colors.scss';
|
|
||||||
@import '~@/assets/scss/mixins.scss';
|
|
||||||
|
|
||||||
#birthday-modal {
|
|
||||||
h2 {
|
|
||||||
font-size: 1.25rem;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 1.4;
|
|
||||||
color: $white;
|
|
||||||
column-gap: 0.5rem;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-body{
|
|
||||||
box-shadow: 0 14px 28px 0 rgba(26, 24, 29, 0.24), 0 10px 10px 0 rgba(26, 24, 29, 0.28);
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-content {
|
|
||||||
width: 566px;
|
|
||||||
padding: 32px 24px 24px;
|
|
||||||
background: linear-gradient(158deg,#6133b4,#4f2a93);
|
|
||||||
border-top-left-radius: 12px;
|
|
||||||
border-top-right-radius: 12px;
|
|
||||||
border-bottom-left-radius: 0px;
|
|
||||||
border-bottom-right-radius: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-bottom {
|
|
||||||
width: 566px;
|
|
||||||
background-color: $purple-50;
|
|
||||||
color: $purple-500;
|
|
||||||
line-height: 1.33;
|
|
||||||
border-top: 0px;
|
|
||||||
padding: 16px 40px 28px 40px;
|
|
||||||
border-bottom-left-radius: 12px;
|
|
||||||
border-bottom-right-radius: 12px;
|
|
||||||
}
|
|
||||||
.limitations {
|
|
||||||
color: $white;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 1.71;
|
|
||||||
margin-top: 8px;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.fine-print {
|
|
||||||
font-size: 0.75rem;
|
|
||||||
color: $purple-500;
|
|
||||||
line-height: 1.33;
|
|
||||||
margin-top: 8px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ten-birthday {
|
|
||||||
position: relative;
|
|
||||||
width: 268px;
|
|
||||||
height: 244px;
|
|
||||||
margin: 0 125px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.limited-event {
|
|
||||||
font-size: 0.75rem;
|
|
||||||
font-weight: bold;
|
|
||||||
text-transform: uppercase;
|
|
||||||
text-align: center;
|
|
||||||
justify-content: center;
|
|
||||||
letter-spacing: 2.4px;
|
|
||||||
margin-top: -8px;
|
|
||||||
color: $yellow-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dates {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 1.71;
|
|
||||||
text-align: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.celebrate {
|
|
||||||
font-size: 1.25rem;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 1.4;
|
|
||||||
margin: 16px 16px 24px 16px;
|
|
||||||
text-align: center;
|
|
||||||
color: $yellow-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jubilant-gryphatrice {
|
|
||||||
height: 176px;
|
|
||||||
width: 204px;
|
|
||||||
border-radius: 12px;
|
|
||||||
background-color: $purple-50;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
margin-right: 24px;
|
|
||||||
margin-left: 4px;
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.limited-wrapper {
|
|
||||||
margin-top: -36px;
|
|
||||||
margin-bottom: -36px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.limited-edition, .gryphatrice-text, .gryphatrice-price {
|
|
||||||
max-width: 274px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.limited-edition {
|
|
||||||
font-size: 0.75rem;
|
|
||||||
font-weight: bold;
|
|
||||||
text-transform: uppercase;
|
|
||||||
line-height:1.33;
|
|
||||||
letter-spacing:2.4px;
|
|
||||||
padding-top: 18px;
|
|
||||||
margin-left: 24px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
color: $yellow-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gryphatrice-text, .gryphatrice-price {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
line-height: 1.71;
|
|
||||||
margin-left: 24px;
|
|
||||||
margin-right: 4px;
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gryphatrice-price {
|
|
||||||
padding-top: 16px;
|
|
||||||
margin-left: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buy-now-left {
|
|
||||||
width: 243px;
|
|
||||||
margin: 24px 8px 24px 0px;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
|
|
||||||
}
|
|
||||||
|
|
||||||
.buy-now-right {
|
|
||||||
width: 243px;
|
|
||||||
margin: 24px 0px 24px 8px;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
|
|
||||||
}
|
|
||||||
|
|
||||||
.stripe {
|
|
||||||
margin-top: 24px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paypal {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stripe, .paypal, .amazon {
|
|
||||||
width: 506px;
|
|
||||||
height: 32px;
|
|
||||||
margin-left: 4px;
|
|
||||||
margin-right: 4px;
|
|
||||||
border-radius: 4px;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pay-with-gems {
|
|
||||||
color: $white;
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 24px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pay-with-gems:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.own-gryphatrice-button {
|
|
||||||
width: 506px;
|
|
||||||
height: 32px;
|
|
||||||
margin: 24px 4px;
|
|
||||||
border-radius: 4px;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
border: $green-100;
|
|
||||||
background-color: $green-100;
|
|
||||||
color: $green-1;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.plenty-of-potions {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
line-height: 1.71;
|
|
||||||
margin: 0 8px 24px;
|
|
||||||
text-align: center;
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.potions {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 5;
|
|
||||||
grid-template-rows: 2;
|
|
||||||
gap: 24px 24px;
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
.pot-1, .pot-2, .pot-3, .pot-4, .pot-5,
|
|
||||||
.pot-6, .pot-7, .pot-8, .pot-9, .pot-10 {
|
|
||||||
height: 68px;
|
|
||||||
width: 68px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background-color: $purple-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pot-1 {
|
|
||||||
grid-column: 1 / 1;
|
|
||||||
grid-row: 1 / 2;
|
|
||||||
}
|
|
||||||
.pot-2 {
|
|
||||||
grid-column: 2 / 2;
|
|
||||||
grid-row: 1 / 2;
|
|
||||||
}
|
|
||||||
.pot-3 {
|
|
||||||
grid-column: 3 / 3;
|
|
||||||
grid-row: 1 / 2;
|
|
||||||
}
|
|
||||||
.pot-4 {
|
|
||||||
grid-column: 4 / 4;
|
|
||||||
grid-row: 1 / 2;
|
|
||||||
}
|
|
||||||
.pot-5 {
|
|
||||||
grid-column: 5 / 5;
|
|
||||||
grid-row: 1 / 2;
|
|
||||||
}
|
|
||||||
.pot-6 {
|
|
||||||
grid-column: 1 / 5;
|
|
||||||
grid-row: 2 / 2;
|
|
||||||
}
|
|
||||||
.pot-7 {
|
|
||||||
grid-column: 2 / 5;
|
|
||||||
grid-row: 2 / 2;
|
|
||||||
}
|
|
||||||
.pot-8 {
|
|
||||||
grid-column: 3 / 5;
|
|
||||||
grid-row: 2 / 2;
|
|
||||||
}
|
|
||||||
.pot-9 {
|
|
||||||
grid-column: 4 / 5;
|
|
||||||
grid-row: 2 / 2;
|
|
||||||
}
|
|
||||||
.pot-10 {
|
|
||||||
grid-column: 5 / 5;
|
|
||||||
grid-row: 2 / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
.visit-the-market {
|
|
||||||
height: 32px;
|
|
||||||
margin: 24px 4px;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.four-for-free {
|
|
||||||
font-size: 0.875rem;
|
|
||||||
line-height: 1.71;
|
|
||||||
margin: 0 36px 24px;
|
|
||||||
text-align: center;
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.four-grid {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 4;
|
|
||||||
grid-template-rows: 1;
|
|
||||||
gap: 24px;
|
|
||||||
}
|
|
||||||
.day-one-a, .day-one-b, .day-five, .day-ten {
|
|
||||||
height: 140px;
|
|
||||||
width: 100px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background-color: $purple-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.day-one-a {
|
|
||||||
grid-column: 1 / 1;
|
|
||||||
grid-row: 1 / 1;
|
|
||||||
}
|
|
||||||
.day-one-b {
|
|
||||||
grid-column: 2 / 2;
|
|
||||||
grid-row: 1 / 1;
|
|
||||||
}
|
|
||||||
.day-five {
|
|
||||||
grid-column: 3 / 3;
|
|
||||||
grid-row: 1 / 1;
|
|
||||||
}
|
|
||||||
.day-ten {
|
|
||||||
grid-column: 4 / 4;
|
|
||||||
grid-row: 1 / 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.day-text {
|
|
||||||
font-size: 0.75rem;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 1.33;
|
|
||||||
letter-spacing: 2.4px;
|
|
||||||
text-align: center;
|
|
||||||
text-transform: uppercase;
|
|
||||||
padding: 4px 0px;
|
|
||||||
color: $yellow-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gift {
|
|
||||||
height: 80px;
|
|
||||||
width: 84px;
|
|
||||||
margin: 0 8px 32px;
|
|
||||||
background-color: $purple-100;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description {
|
|
||||||
font-size: 0.75rem;
|
|
||||||
line-height: 1.33;
|
|
||||||
text-align: center;
|
|
||||||
padding: 8px 0px;
|
|
||||||
margin-top: -32px;
|
|
||||||
color: $white;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SVG CSS
|
|
||||||
.modal-close {
|
|
||||||
position: absolute;
|
|
||||||
right: 16px;
|
|
||||||
top: 16px;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
.svg-close {
|
|
||||||
width: 18px;
|
|
||||||
height: 18px;
|
|
||||||
vertical-align: middle;
|
|
||||||
fill: $purple-50;
|
|
||||||
|
|
||||||
& svg path {
|
|
||||||
fill: $purple-50 !important;;
|
|
||||||
}
|
|
||||||
& :hover {
|
|
||||||
fill: $purple-50;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-confetti {
|
|
||||||
position: absolute;
|
|
||||||
height: 152px;
|
|
||||||
width: 518px;
|
|
||||||
margin-top: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-gifts, .svg-gifts-flip {
|
|
||||||
position: relative;
|
|
||||||
height: 32px;
|
|
||||||
width: 85px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-gifts {
|
|
||||||
margin-left: 70px;
|
|
||||||
top: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-gifts-flip {
|
|
||||||
-webkit-transform: scaleX(-1);
|
|
||||||
transform: scaleX(-1);
|
|
||||||
left: 366px;
|
|
||||||
bottom: 34px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.left-divider, .right-divider {
|
|
||||||
background-image: url('~@/assets/images/fancy-divider.png');
|
|
||||||
background-position: right center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
display: inline-flex;
|
|
||||||
flex-grow: 2;
|
|
||||||
min-height: 1.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.right-divider {
|
|
||||||
-webkit-transform: scaleX(-1);
|
|
||||||
transform: scaleX(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-cross {
|
|
||||||
height: 12px;
|
|
||||||
width: 12px;
|
|
||||||
color: $yellow-50;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-gem {
|
|
||||||
height: 48px;
|
|
||||||
width: 58px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-background {
|
|
||||||
height: 68px;
|
|
||||||
width: 68px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-stripe {
|
|
||||||
height: 20px;
|
|
||||||
width: 48px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.svg-paypal {
|
|
||||||
height: 16px;
|
|
||||||
width: 60px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// to check if user owns JG or not
|
|
||||||
import { mapState } from '@/libs/store';
|
|
||||||
|
|
||||||
// Purchase functionality
|
|
||||||
import buy from '@/mixins/buy';
|
|
||||||
import notifications from '@/mixins/notifications';
|
|
||||||
import payments from '@/mixins/payments';
|
|
||||||
import content from '@/../../common/script/content/index';
|
|
||||||
import amazonButton from '@/components/payments/buttons/amazon';
|
|
||||||
|
|
||||||
// import images
|
|
||||||
import close from '@/assets/svg/new-close.svg';
|
|
||||||
import confetti from '@/assets/svg/confetti.svg';
|
|
||||||
import gifts from '@/assets/svg/gifts-birthday.svg';
|
|
||||||
import cross from '@/assets/svg/cross.svg';
|
|
||||||
import stripe from '@/assets/svg/stripe.svg';
|
|
||||||
import paypal from '@/assets/svg/paypal-logo.svg';
|
|
||||||
import amazon from '@/assets/svg/amazonpay.svg';
|
|
||||||
import birthdayGems from '@/assets/svg/birthday-gems.svg';
|
|
||||||
import birthdayBackground from '@/assets/svg/icon-background-birthday.svg';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
amazonButton,
|
|
||||||
},
|
|
||||||
mixins: [buy, notifications, payments],
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
amazonData: {
|
|
||||||
type: 'single',
|
|
||||||
sku: 'Pet-Gryphatrice-Jubilant',
|
|
||||||
},
|
|
||||||
icons: Object.freeze({
|
|
||||||
close,
|
|
||||||
confetti,
|
|
||||||
gifts,
|
|
||||||
cross,
|
|
||||||
stripe,
|
|
||||||
paypal,
|
|
||||||
amazon,
|
|
||||||
birthdayGems,
|
|
||||||
birthdayBackground,
|
|
||||||
}),
|
|
||||||
selectedPage: 'initial-buttons',
|
|
||||||
gryphBought: false,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState({
|
|
||||||
user: 'user.data',
|
|
||||||
}),
|
|
||||||
ownGryphatrice () {
|
|
||||||
return Boolean(this.user && this.user.items.pets['Gryphatrice-Jubilant']);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
hide () {
|
|
||||||
this.$root.$emit('bv::hide::modal', 'birthday-modal');
|
|
||||||
},
|
|
||||||
buyGryphatriceGems () {
|
|
||||||
const gryphatrice = content.petInfo['Gryphatrice-Jubilant'];
|
|
||||||
if (this.user.balance * 4 < gryphatrice.value) {
|
|
||||||
this.$root.$emit('bv::show::modal', 'buy-gems');
|
|
||||||
return this.hide();
|
|
||||||
}
|
|
||||||
if (!this.confirmPurchase(gryphatrice.currency, gryphatrice.value)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
this.makeGenericPurchase(gryphatrice);
|
|
||||||
this.gryphBought = true;
|
|
||||||
return this.purchased(gryphatrice.text());
|
|
||||||
},
|
|
||||||
closeAndRedirect (route) {
|
|
||||||
const routeTerminator = route.split('/')[route.split('/').length - 1];
|
|
||||||
if (this.$router.history.current.name !== routeTerminator) {
|
|
||||||
this.$router.push(route);
|
|
||||||
}
|
|
||||||
this.hide();
|
|
||||||
},
|
|
||||||
close () {
|
|
||||||
this.$root.$emit('bv::hide::modal', 'birthday-modal');
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
@@ -78,7 +78,6 @@ export default {
|
|||||||
orderReferenceId: null,
|
orderReferenceId: null,
|
||||||
subscription: null,
|
subscription: null,
|
||||||
coupon: null,
|
coupon: null,
|
||||||
sku: null,
|
|
||||||
},
|
},
|
||||||
isAmazonSetup: false,
|
isAmazonSetup: false,
|
||||||
amazonButtonEnabled: false,
|
amazonButtonEnabled: false,
|
||||||
@@ -175,10 +174,7 @@ export default {
|
|||||||
storePaymentStatusAndReload (url) {
|
storePaymentStatusAndReload (url) {
|
||||||
let paymentType;
|
let paymentType;
|
||||||
|
|
||||||
if (this.amazonPayments.type === 'single') {
|
if (this.amazonPayments.type === 'single' && !this.amazonPayments.gift) paymentType = 'gems';
|
||||||
if (this.amazonPayments.sku) paymentType = 'sku';
|
|
||||||
else if (!this.amazonPayments.gift) paymentType = 'gems';
|
|
||||||
}
|
|
||||||
if (this.amazonPayments.type === 'subscription') paymentType = 'subscription';
|
if (this.amazonPayments.type === 'subscription') paymentType = 'subscription';
|
||||||
if (this.amazonPayments.groupId || this.amazonPayments.groupToCreate) paymentType = 'groupPlan';
|
if (this.amazonPayments.groupId || this.amazonPayments.groupToCreate) paymentType = 'groupPlan';
|
||||||
if (this.amazonPayments.type === 'single' && this.amazonPayments.gift && this.amazonPayments.giftReceiver) {
|
if (this.amazonPayments.type === 'single' && this.amazonPayments.gift && this.amazonPayments.giftReceiver) {
|
||||||
@@ -227,7 +223,6 @@ export default {
|
|||||||
const data = {
|
const data = {
|
||||||
orderReferenceId: this.amazonPayments.orderReferenceId,
|
orderReferenceId: this.amazonPayments.orderReferenceId,
|
||||||
gift: this.amazonPayments.gift,
|
gift: this.amazonPayments.gift,
|
||||||
sku: this.amazonPayments.sku,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (this.amazonPayments.gemsBlock) {
|
if (this.amazonPayments.gemsBlock) {
|
||||||
|
|||||||
@@ -83,7 +83,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
h4 {
|
h4 {
|
||||||
color: $gray-10;
|
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<a
|
<a
|
||||||
v-once
|
v-once
|
||||||
|
class="standard-link"
|
||||||
@click="close()"
|
@click="close()"
|
||||||
>{{ $t('neverMind') }}</a>
|
>{{ $t('neverMind') }}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -180,6 +180,7 @@
|
|||||||
@import '~@/assets/scss/colors.scss';
|
@import '~@/assets/scss/colors.scss';
|
||||||
|
|
||||||
a:not([href]) {
|
a:not([href]) {
|
||||||
|
color: $blue-10;
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
line-height: 1.71;
|
line-height: 1.71;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<b-modal
|
<b-modal
|
||||||
id="payments-success-modal"
|
id="payments-success-modal"
|
||||||
:hide-footer="isNewGroup || isGems || isSubscription || ownsJubilantGryphatrice"
|
:hide-footer="isNewGroup || isGems || isSubscription"
|
||||||
:modal-class="isNewGroup || isGems || isSubscription || ownsJubilantGryphatrice
|
:modal-class="isNewGroup || isGems || isSubscription
|
||||||
? ['modal-hidden-footer'] : []"
|
? ['modal-hidden-footer'] : []"
|
||||||
>
|
>
|
||||||
<!-- HEADER -->
|
<!-- HEADER -->
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<div class="check-container d-flex align-items-center justify-content-center">
|
<div class="check-container d-flex align-items-center justify-content-center">
|
||||||
<div
|
<div
|
||||||
v-once
|
v-once
|
||||||
class="svg-icon svg-check"
|
class="svg-icon check"
|
||||||
v-html="icons.check"
|
v-html="icons.check"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -107,35 +107,6 @@
|
|||||||
class="small-text auto-renew"
|
class="small-text auto-renew"
|
||||||
>{{ $t('paymentAutoRenew') }}</span>
|
>{{ $t('paymentAutoRenew') }}</span>
|
||||||
</template>
|
</template>
|
||||||
<!-- if you buy the Jubilant Gryphatrice during 10th birthday -->
|
|
||||||
<template
|
|
||||||
v-if="ownsJubilantGryphatrice"
|
|
||||||
>
|
|
||||||
<div class="words">
|
|
||||||
<p class="jub-success">
|
|
||||||
<span
|
|
||||||
v-once
|
|
||||||
v-html="$t('jubilantSuccess')"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
</p>
|
|
||||||
<p class="jub-success">
|
|
||||||
<span
|
|
||||||
v-once
|
|
||||||
v-html="$t('stableVisit')"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="gryph-bg">
|
|
||||||
<img
|
|
||||||
src="https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Gryphatrice-Jubilant-Large.gif"
|
|
||||||
alt="a pink, purple, and green gryphatrice pet winks at you adorably"
|
|
||||||
width="78px"
|
|
||||||
height="72px"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<!-- buttons for subscriptions / new Group / buy Gems for self -->
|
<!-- buttons for subscriptions / new Group / buy Gems for self -->
|
||||||
<button
|
<button
|
||||||
v-if="isNewGroup || isGems || isSubscription"
|
v-if="isNewGroup || isGems || isSubscription"
|
||||||
@@ -145,14 +116,6 @@
|
|||||||
>
|
>
|
||||||
{{ $t('onwards') }}
|
{{ $t('onwards') }}
|
||||||
</button>
|
</button>
|
||||||
<!-- buttons for Jubilant Gryphatrice purchase during 10th birthday -->
|
|
||||||
<button
|
|
||||||
v-if="ownsJubilantGryphatrice"
|
|
||||||
class="btn btn-primary mx-auto btn-jub"
|
|
||||||
@click="closeAndRedirect()"
|
|
||||||
>
|
|
||||||
{{ $t('takeMeToStable') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- FOOTER -->
|
<!-- FOOTER -->
|
||||||
@@ -269,8 +232,9 @@
|
|||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.svg-check {
|
.check {
|
||||||
width: 45px;
|
width: 35.1px;
|
||||||
|
height: 28px;
|
||||||
color: $white;
|
color: $white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -329,34 +293,6 @@
|
|||||||
.group-billing-date {
|
.group-billing-date {
|
||||||
width: 269px;
|
width: 269px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.words {
|
|
||||||
margin-bottom: 16px;
|
|
||||||
justify-content: center;
|
|
||||||
font-size: 0.875rem;
|
|
||||||
color: $gray-50;
|
|
||||||
line-height: 1.71;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jub-success {
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gryph-bg {
|
|
||||||
width: 110px;
|
|
||||||
height: 104px;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 16px;
|
|
||||||
border-radius: 4px;
|
|
||||||
background-color: $gray-700;
|
|
||||||
}
|
|
||||||
.btn-jub {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
margin-top: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
.modal-footer {
|
.modal-footer {
|
||||||
background: $gray-700;
|
background: $gray-700;
|
||||||
@@ -494,9 +430,6 @@ export default {
|
|||||||
isNewGroup () {
|
isNewGroup () {
|
||||||
return this.paymentData.paymentType === 'groupPlan' && this.paymentData.newGroup;
|
return this.paymentData.paymentType === 'groupPlan' && this.paymentData.newGroup;
|
||||||
},
|
},
|
||||||
ownsJubilantGryphatrice () {
|
|
||||||
return this.paymentData.paymentType === 'sku'; // will need to be revised when there are other discrete skus in system
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
this.$root.$on('habitica:payment-success', data => {
|
this.$root.$on('habitica:payment-success', data => {
|
||||||
@@ -525,12 +458,6 @@ export default {
|
|||||||
this.sendingInProgress = false;
|
this.sendingInProgress = false;
|
||||||
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
|
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
|
||||||
},
|
},
|
||||||
closeAndRedirect () {
|
|
||||||
if (this.$router.history.current.name !== 'stable') {
|
|
||||||
this.$router.push('/inventory/stable');
|
|
||||||
}
|
|
||||||
this.close();
|
|
||||||
},
|
|
||||||
submit () {
|
submit () {
|
||||||
if (this.paymentData.group && !this.paymentData.newGroup) {
|
if (this.paymentData.group && !this.paymentData.newGroup) {
|
||||||
Analytics.track({
|
Analytics.track({
|
||||||
|
|||||||
@@ -7,38 +7,6 @@
|
|||||||
{{ $t('settings') }}
|
{{ $t('settings') }}
|
||||||
</h1>
|
</h1>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="sleep">
|
|
||||||
<h5>{{ $t('pauseDailies') }}</h5>
|
|
||||||
<h4>{{ $t('sleepDescription') }}</h4>
|
|
||||||
<ul>
|
|
||||||
<li v-once>
|
|
||||||
{{ $t('sleepBullet1') }}
|
|
||||||
</li>
|
|
||||||
<li v-once>
|
|
||||||
{{ $t('sleepBullet2') }}
|
|
||||||
</li>
|
|
||||||
<li v-once>
|
|
||||||
{{ $t('sleepBullet3') }}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<button
|
|
||||||
v-if="!user.preferences.sleep"
|
|
||||||
v-once
|
|
||||||
class="sleep btn btn-primary btn-block pause-button"
|
|
||||||
@click="toggleSleep()"
|
|
||||||
>
|
|
||||||
{{ $t('pauseDailies') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
v-if="user.preferences.sleep"
|
|
||||||
v-once
|
|
||||||
class="btn btn-secondary btn-block pause-button"
|
|
||||||
@click="toggleSleep()"
|
|
||||||
>
|
|
||||||
{{ $t('unpauseDailies') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="form-horizontal">
|
<div class="form-horizontal">
|
||||||
<h5>{{ $t('language') }}</h5>
|
<h5>{{ $t('language') }}</h5>
|
||||||
<select
|
<select
|
||||||
@@ -549,10 +517,6 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sleep {
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -687,9 +651,6 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
toggleSleep () {
|
|
||||||
this.$store.dispatch('user:sleep');
|
|
||||||
},
|
|
||||||
validateDisplayName: debounce(function checkName (displayName) {
|
validateDisplayName: debounce(function checkName (displayName) {
|
||||||
if (displayName.length <= 1 || displayName === this.user.profile.name) {
|
if (displayName.length <= 1 || displayName === this.user.profile.name) {
|
||||||
this.displayNameIssues = [];
|
this.displayNameIssues = [];
|
||||||
|
|||||||
@@ -93,7 +93,7 @@
|
|||||||
<div class="subscribe-card mx-auto">
|
<div class="subscribe-card mx-auto">
|
||||||
<div
|
<div
|
||||||
v-if="hasSubscription && !hasCanceledSubscription"
|
v-if="hasSubscription && !hasCanceledSubscription"
|
||||||
class="d-flex flex-column align-items-center pt-4"
|
class="d-flex flex-column align-items-center"
|
||||||
>
|
>
|
||||||
<div class="round-container bg-green-10 d-flex align-items-center justify-content-center">
|
<div class="round-container bg-green-10 d-flex align-items-center justify-content-center">
|
||||||
<div
|
<div
|
||||||
@@ -107,7 +107,7 @@
|
|||||||
</h2>
|
</h2>
|
||||||
<div
|
<div
|
||||||
v-if="hasGroupPlan"
|
v-if="hasGroupPlan"
|
||||||
class="mx-5 mb-4 text-center"
|
class="mx-5 text-center"
|
||||||
>
|
>
|
||||||
{{ $t('youHaveGroupPlan') }}
|
{{ $t('youHaveGroupPlan') }}
|
||||||
</div>
|
</div>
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
class="btn btn-primary btn-update-card
|
class="btn btn-primary btn-update-card
|
||||||
d-flex justify-content-center align-items-center mb-4"
|
d-flex justify-content-center align-items-center"
|
||||||
@click="redirectToStripeEdit()"
|
@click="redirectToStripeEdit()"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@@ -143,61 +143,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-else
|
v-else
|
||||||
class="svg-icon mb-4"
|
class="svg-icon"
|
||||||
:class="paymentMethodLogo.class"
|
:class="paymentMethodLogo.class"
|
||||||
v-html="paymentMethodLogo.icon"
|
v-html="paymentMethodLogo.icon"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="purchasedPlanExtraMonthsDetails.months > 0"
|
v-if="purchasedPlanExtraMonthsDetails.months > 0"
|
||||||
class="extra-months green-10 py-2 px-3 mb-4"
|
class="extra-months green-10 py-2 px-3 mt-4"
|
||||||
v-html="$t('purchasedPlanExtraMonths',
|
v-html="$t('purchasedPlanExtraMonths',
|
||||||
{months: purchasedPlanExtraMonthsDetails.months})"
|
{months: purchasedPlanExtraMonthsDetails.months})"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="hasGiftSubscription"
|
v-if="hasCanceledSubscription"
|
||||||
class="d-flex flex-column align-items-center mt-4"
|
|
||||||
>
|
|
||||||
<div class="round-container bg-green-10 d-flex align-items-center justify-content-center">
|
|
||||||
<div
|
|
||||||
v-once
|
|
||||||
class="svg-icon svg-check"
|
|
||||||
v-html="icons.checkmarkIcon"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
<h2 class="green-10 mx-auto mb-75">
|
|
||||||
{{ $t('youAreSubscribed') }}
|
|
||||||
</h2>
|
|
||||||
<div
|
|
||||||
class="mx-4 text-center mb-4 lh-71"
|
|
||||||
>
|
|
||||||
<span v-once>
|
|
||||||
{{ $t('haveNonRecurringSub') }}
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
v-once
|
|
||||||
v-html="$t('subscriptionInactiveDate', {date: subscriptionEndDate})"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<h2 v-once>
|
|
||||||
{{ $t('switchToRecurring') }}
|
|
||||||
</h2>
|
|
||||||
<small
|
|
||||||
v-once
|
|
||||||
class="mx-4 mb-3 text-center"
|
|
||||||
>
|
|
||||||
{{ $t('continueGiftSubBenefits') }}
|
|
||||||
</small>
|
|
||||||
<subscription-options
|
|
||||||
:note="'subscriptionCreditConversion'"
|
|
||||||
class="w-100 mb-2"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-else-if="hasCanceledSubscription"
|
|
||||||
class="d-flex flex-column align-items-center mt-4"
|
class="d-flex flex-column align-items-center mt-4"
|
||||||
>
|
>
|
||||||
<div class="round-container bg-gray-300 d-flex align-items-center justify-content-center">
|
<div class="round-container bg-gray-300 d-flex align-items-center justify-content-center">
|
||||||
@@ -220,7 +180,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="hasSubscription"
|
v-if="hasSubscription"
|
||||||
class="bg-gray-700 py-3 mb-3 text-center"
|
class="bg-gray-700 py-3 mt-4 mb-3 text-center"
|
||||||
>
|
>
|
||||||
<div class="header-mini mb-3">
|
<div class="header-mini mb-3">
|
||||||
{{ $t('subscriptionStats') }}
|
{{ $t('subscriptionStats') }}
|
||||||
@@ -362,12 +322,6 @@
|
|||||||
max-width: 21rem;
|
max-width: 21rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
small {
|
|
||||||
color: $gray-100;
|
|
||||||
font-size: 12px ;
|
|
||||||
line-height: 1.33;
|
|
||||||
}
|
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
@@ -445,10 +399,6 @@
|
|||||||
height: 49px;
|
height: 49px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lh-71 {
|
|
||||||
line-height: 1.71;
|
|
||||||
}
|
|
||||||
|
|
||||||
.maroon-50 {
|
.maroon-50 {
|
||||||
color: $maroon-50;
|
color: $maroon-50;
|
||||||
}
|
}
|
||||||
@@ -493,6 +443,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.subscribe-card {
|
.subscribe-card {
|
||||||
|
padding-top: 2rem;
|
||||||
width: 28rem;
|
width: 28rem;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||||
@@ -521,7 +472,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.svg-check {
|
.svg-check {
|
||||||
width: 36px;
|
width: 35.1px;
|
||||||
|
height: 28px;
|
||||||
color: $white;
|
color: $white;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -718,9 +670,6 @@ export default {
|
|||||||
hasSubscription () {
|
hasSubscription () {
|
||||||
return Boolean(this.user.purchased.plan.customerId);
|
return Boolean(this.user.purchased.plan.customerId);
|
||||||
},
|
},
|
||||||
hasGiftSubscription () {
|
|
||||||
return this.user.purchased.plan.customerId === 'Gift';
|
|
||||||
},
|
|
||||||
hasCanceledSubscription () {
|
hasCanceledSubscription () {
|
||||||
return (
|
return (
|
||||||
this.hasSubscription
|
this.hasSubscription
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="subscription-form">
|
<div id="subscription-form">
|
||||||
<b-form-group class="mb-3 w-100 h-100">
|
<b-form-group class="mb-4 w-100 h-100">
|
||||||
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
|
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
|
||||||
<b-form-radio
|
<b-form-radio
|
||||||
v-for="block in subscriptionBlocksOrdered"
|
v-for="block in subscriptionBlocksOrdered"
|
||||||
@@ -32,15 +32,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</b-form-radio>
|
</b-form-radio>
|
||||||
</b-form-group>
|
</b-form-group>
|
||||||
<div class="mx-4 mb-4 text-center">
|
|
||||||
<small
|
|
||||||
v-if="note"
|
|
||||||
v-once
|
|
||||||
class="font-italic"
|
|
||||||
>
|
|
||||||
{{ $t(note) }}
|
|
||||||
</small>
|
|
||||||
</div>
|
|
||||||
<!-- payment buttons first is for gift subs and the second is for renewing subs -->
|
<!-- payment buttons first is for gift subs and the second is for renewing subs -->
|
||||||
<payments-buttons
|
<payments-buttons
|
||||||
v-if="userReceivingGift && userReceivingGift._id"
|
v-if="userReceivingGift && userReceivingGift._id"
|
||||||
@@ -91,10 +82,7 @@
|
|||||||
|
|
||||||
.subscription-bubble, .discount-bubble {
|
.subscription-bubble, .discount-bubble {
|
||||||
border-radius: 100px;
|
border-radius: 100px;
|
||||||
padding-left: 12px;
|
|
||||||
padding-right: 12px;
|
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.33;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.subscription-bubble {
|
.subscription-bubble {
|
||||||
@@ -112,20 +100,8 @@
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import '~@/assets/scss/colors.scss';
|
@import '~@/assets/scss/colors.scss';
|
||||||
|
|
||||||
small {
|
|
||||||
color: $gray-100;
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 12px ;
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1.33;
|
|
||||||
}
|
|
||||||
|
|
||||||
.subscribe-option {
|
.subscribe-option {
|
||||||
background-color: $gray-700;
|
border-bottom: 1px solid $gray-600;
|
||||||
|
|
||||||
&:not(:last-of-type) {
|
|
||||||
border-bottom: 1px solid $gray-600;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@@ -145,10 +121,6 @@ export default {
|
|||||||
paymentsMixin,
|
paymentsMixin,
|
||||||
],
|
],
|
||||||
props: {
|
props: {
|
||||||
note: {
|
|
||||||
type: String,
|
|
||||||
default: null,
|
|
||||||
},
|
|
||||||
userReceivingGift: {
|
userReceivingGift: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default () {},
|
default () {},
|
||||||
@@ -182,13 +154,13 @@ export default {
|
|||||||
subscriptionBubbles (subscription) {
|
subscriptionBubbles (subscription) {
|
||||||
switch (subscription) {
|
switch (subscription) {
|
||||||
case 'basic_3mo':
|
case 'basic_3mo':
|
||||||
return '<span class="subscription-bubble py-1 mr-1">Gem cap raised to 30</span><span class="subscription-bubble py-1">+1 Mystic Hourglass</span>';
|
return '<span class="subscription-bubble px-2 py-1 mr-1">Gem cap raised to 30</span><span class="subscription-bubble px-2 py-1">+1 Mystic Hourglass</span>';
|
||||||
case 'basic_6mo':
|
case 'basic_6mo':
|
||||||
return '<span class="subscription-bubble py-1 mr-1">Gem cap raised to 35</span><span class="subscription-bubble py-1">+2 Mystic Hourglass</span>';
|
return '<span class="subscription-bubble px-2 py-1 mr-1">Gem cap raised to 35</span><span class="subscription-bubble px-2 py-1">+2 Mystic Hourglass</span>';
|
||||||
case 'basic_12mo':
|
case 'basic_12mo':
|
||||||
return '<span class="discount-bubble py-1 mr-1">Save 20%</span><span class="subscription-bubble py-1 mr-1">Gem cap raised to 45</span><span class="subscription-bubble py-1">+4 Mystic Hourglass</span>';
|
return '<span class="discount-bubble px-2 py-1 mr-1">Save 20%</span><span class="subscription-bubble px-2 py-1 mr-1">Gem cap raised to 45</span><span class="subscription-bubble px-2 py-1">+4 Mystic Hourglass</span>';
|
||||||
default:
|
default:
|
||||||
return '<span class="subscription-bubble py-1">Gem cap at 25</span>';
|
return '<span class="subscription-bubble px-2 py-1">Gem cap at 25</span>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
updateSubscriptionData (key) {
|
updateSubscriptionData (key) {
|
||||||
|
|||||||
@@ -146,7 +146,6 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import find from 'lodash/find';
|
|
||||||
import _filter from 'lodash/filter';
|
import _filter from 'lodash/filter';
|
||||||
import _map from 'lodash/map';
|
import _map from 'lodash/map';
|
||||||
import _throttle from 'lodash/throttle';
|
import _throttle from 'lodash/throttle';
|
||||||
@@ -226,7 +225,7 @@ export default {
|
|||||||
user: 'user.data',
|
user: 'user.data',
|
||||||
userStats: 'user.data.stats',
|
userStats: 'user.data.stats',
|
||||||
userItems: 'user.data.items',
|
userItems: 'user.data.items',
|
||||||
currentEventList: 'worldState.data.currentEventList',
|
currentEvent: 'worldState.data.currentEvent',
|
||||||
}),
|
}),
|
||||||
market () {
|
market () {
|
||||||
return shops.getMarketShop(this.user);
|
return shops.getMarketShop(this.user);
|
||||||
@@ -293,16 +292,15 @@ export default {
|
|||||||
return Object.values(this.viewOptions).some(g => g.selected);
|
return Object.values(this.viewOptions).some(g => g.selected);
|
||||||
},
|
},
|
||||||
imageURLs () {
|
imageURLs () {
|
||||||
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
|
if (!this.currentEvent || !this.currentEvent.season) {
|
||||||
if (!currentEvent) {
|
|
||||||
return {
|
return {
|
||||||
background: 'url(/static/npc/normal/market_background.png)',
|
background: 'url(/static/npc/normal/market_background.png)',
|
||||||
npc: 'url(/static/npc/normal/market_banner_npc.png)',
|
npc: 'url(/static/npc/normal/market_banner_npc.png)',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
background: `url(/static/npc/${currentEvent.season}/market_background.png)`,
|
background: `url(/static/npc/${this.currentEvent.season}/market_background.png)`,
|
||||||
npc: `url(/static/npc/${currentEvent.season}/market_banner_npc.png)`,
|
npc: `url(/static/npc/${this.currentEvent.season}/market_banner_npc.png)`,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -397,7 +397,6 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import find from 'lodash/find';
|
|
||||||
import _filter from 'lodash/filter';
|
import _filter from 'lodash/filter';
|
||||||
import _sortBy from 'lodash/sortBy';
|
import _sortBy from 'lodash/sortBy';
|
||||||
import _throttle from 'lodash/throttle';
|
import _throttle from 'lodash/throttle';
|
||||||
@@ -513,7 +512,7 @@ export default {
|
|||||||
user: 'user.data',
|
user: 'user.data',
|
||||||
userStats: 'user.data.stats',
|
userStats: 'user.data.stats',
|
||||||
userItems: 'user.data.items',
|
userItems: 'user.data.items',
|
||||||
currentEventList: 'worldState.data.currentEventList',
|
currentEvent: 'worldState.data.currentEvent',
|
||||||
}),
|
}),
|
||||||
shop () {
|
shop () {
|
||||||
return shops.getQuestShop(this.user);
|
return shops.getQuestShop(this.user);
|
||||||
@@ -537,16 +536,15 @@ export default {
|
|||||||
return Object.values(this.viewOptions).some(g => g.selected);
|
return Object.values(this.viewOptions).some(g => g.selected);
|
||||||
},
|
},
|
||||||
imageURLs () {
|
imageURLs () {
|
||||||
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
|
if (!this.currentEvent || !this.currentEvent.season) {
|
||||||
if (!currentEvent) {
|
|
||||||
return {
|
return {
|
||||||
background: 'url(/static/npc/normal/quest_shop_background.png)',
|
background: 'url(/static/npc/normal/quest_shop_background.png)',
|
||||||
npc: 'url(/static/npc/normal/quest_shop_npc.png)',
|
npc: 'url(/static/npc/normal/quest_shop_npc.png)',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
background: `url(/static/npc/${currentEvent.season}/quest_shop_background.png)`,
|
background: `url(/static/npc/${this.currentEvent.season}/quest_shop_background.png)`,
|
||||||
npc: `url(/static/npc/${currentEvent.season}/quest_shop_npc.png)`,
|
npc: `url(/static/npc/${this.currentEvent.season}/quest_shop_npc.png)`,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<h1>{{ $t('communityGuidelines') }}</h1>
|
<h1>{{ $t('communityGuidelines') }}</h1>
|
||||||
<hr>
|
<hr>
|
||||||
<p>{{ $t('lastUpdated') }} February 8, 2023</p>
|
<p>{{ $t('lastUpdated') }} July 28, 2021</p>
|
||||||
<h2 id="welcome">
|
<h2 id="welcome">
|
||||||
{{ $t('commGuideHeadingWelcome') }}
|
{{ $t('commGuideHeadingWelcome') }}
|
||||||
</h2>
|
</h2>
|
||||||
@@ -21,7 +21,6 @@
|
|||||||
<p v-html="$t('commGuidePara016')"></p>
|
<p v-html="$t('commGuidePara016')"></p>
|
||||||
<p v-html="$t('commGuidePara017')"></p>
|
<p v-html="$t('commGuidePara017')"></p>
|
||||||
<ul>
|
<ul>
|
||||||
<li v-html="$t('commGuideList01F')"></li>
|
|
||||||
<li v-html="$t('commGuideList01A')"></li>
|
<li v-html="$t('commGuideList01A')"></li>
|
||||||
<li v-html="$t('commGuideList01B')"></li>
|
<li v-html="$t('commGuideList01B')"></li>
|
||||||
<li v-html="$t('commGuideList01C')"></li>
|
<li v-html="$t('commGuideList01C')"></li>
|
||||||
@@ -33,7 +32,6 @@
|
|||||||
<img src="~@/assets/images/community-guidelines/publicSpaces.png">
|
<img src="~@/assets/images/community-guidelines/publicSpaces.png">
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li v-html="$t('commGuideList02N')"></li>
|
|
||||||
<li v-html="$t('commGuideList02A')"></li>
|
<li v-html="$t('commGuideList02A')"></li>
|
||||||
<li v-html="$t('commGuideList02B')"></li>
|
<li v-html="$t('commGuideList02B')"></li>
|
||||||
<li v-html="$t('commGuideList02G')"></li>
|
<li v-html="$t('commGuideList02G')"></li>
|
||||||
@@ -149,9 +147,10 @@
|
|||||||
<li>
|
<li>
|
||||||
{{ $t('commGuideList10A') }}
|
{{ $t('commGuideList10A') }}
|
||||||
<ul>
|
<ul>
|
||||||
<li v-html="$t('commGuideList10A1')"></li>
|
<li>{{ $t('commGuideList10A1') }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li v-html="$t('commGuideList10C')"></li>
|
||||||
<li v-html="$t('commGuideList10D')"></li>
|
<li v-html="$t('commGuideList10D')"></li>
|
||||||
<li v-html="$t('commGuideList10F')"></li>
|
<li v-html="$t('commGuideList10F')"></li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -177,53 +176,50 @@
|
|||||||
<h2 id="meet-the-mods">
|
<h2 id="meet-the-mods">
|
||||||
{{ $t('commGuideHeadingMeet') }}
|
{{ $t('commGuideHeadingMeet') }}
|
||||||
</h2>
|
</h2>
|
||||||
|
<p v-html="$t('commGuidePara006')"></p>
|
||||||
<p v-html="$t('commGuidePara007')"></p>
|
<p v-html="$t('commGuidePara007')"></p>
|
||||||
|
<p v-html="$t('commGuidePara008')"></p>
|
||||||
<p v-html="$t('commGuidePara009')"></p>
|
<p v-html="$t('commGuidePara009')"></p>
|
||||||
<div class="media align-items-center">
|
<div class="media align-items-center">
|
||||||
<img src="~@/assets/images/community-guidelines/staff.png">
|
<img src="~@/assets/images/community-guidelines/staff.png">
|
||||||
<div class="media-body">
|
<div class="media-body">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>{{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }}</li>
|
||||||
{{ $t('commGuideAKA', {habitName: 'heyeilatan', realName: 'Natalie'}) }}
|
|
||||||
({{ $t('commGuideOnGitHub', {gitHubName: 'CuriousMagpie'}) }})
|
|
||||||
- Web Developer
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
{{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }}
|
|
||||||
- Mobile Developer
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
{{ $t('commGuideAKA', {habitName: 'redphoenix', realName: 'Vicky'}) }}
|
{{ $t('commGuideAKA', {habitName: 'redphoenix', realName: 'Vicky'}) }}
|
||||||
({{ $t('commGuideOnGitHub', {gitHubName: 'veeeeeee'}) }})
|
({{ $t('commGuideOnGitHub', {gitHubName: 'veeeeeee'}) }})
|
||||||
- Co-Founder
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
{{ $t('commGuideAKA', {habitName: 'Beffymaroo', realName: 'Beth'}) }}
|
|
||||||
- Art, Community Management, Many Hats
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
{{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Sabe'}) }}
|
|
||||||
- Web Developer
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
{{ $t('commGuideAKA', {habitName: 'Apollo', realName: 'Tressley'}) }}
|
|
||||||
- Designer
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
{{ $t('commGuideAKA', {habitName: 'Piyo', realName: 'Sara'}) }}
|
|
||||||
- Mobile Designer
|
|
||||||
</li>
|
</li>
|
||||||
|
<li>{{ $t('commGuideAKA', {habitName: 'Beffymaroo', realName: 'Beth'}) }}</li>
|
||||||
|
<li>{{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Sabe'}) }}</li>
|
||||||
|
<li>{{ $t('commGuideAKA', {habitName: 'Apollo', realName: 'Tressley'}) }}</li>
|
||||||
|
<li>{{ $t('commGuideAKA', {habitName: 'Piyo', realName: 'Sara'}) }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<p v-html="$t('commGuidePara010')"></p>
|
||||||
|
<div class="media align-items-center">
|
||||||
|
<img src="~@/assets/images/community-guidelines/moderators.png">
|
||||||
|
<div class="media-body">
|
||||||
|
<p v-html="$t('commGuidePara011')"></p>
|
||||||
|
<ul>
|
||||||
|
<li>Dewines</li>
|
||||||
|
<li>Nakonana</li>
|
||||||
|
<li>Cantras</li>
|
||||||
|
<li>Alys (LadyAlys {{ $t('commGuidePara011c') }})</li>
|
||||||
|
<li>Fox_town</li>
|
||||||
|
<li>MaybeSteveRogers</li>
|
||||||
|
<li>shanaqui</li>
|
||||||
|
<li>deilann (not yet pictured)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p v-html="$t('commGuidePara012')"></p>
|
||||||
<p v-html="$t('commGuidePara013')"></p>
|
<p v-html="$t('commGuidePara013')"></p>
|
||||||
<p>
|
<p>
|
||||||
{{ $t('commGuidePara014') }}<br>
|
{{ $t('commGuidePara014') }}<br>
|
||||||
<em>
|
<em>
|
||||||
Lemoness, lefnire, Slappybag, litenull, Shaner, Bobbyroberts99, wc8,
|
Lemoness, lefnire, Slappybag, litenull, Shaner, Bobbyroberts99, wc8,
|
||||||
Breadstrings, Megan, Blade, Daniel the Bard, deilann, shanaqui, Nakonana,
|
Breadstrings, Megan, Blade, and Daniel the Bard
|
||||||
Dewines, Alys, Fox_town, MaybeSteveRogers, and Cantras.
|
|
||||||
|
|
||||||
</em>
|
</em>
|
||||||
</p>
|
</p>
|
||||||
<h2 id="final">
|
<h2 id="final">
|
||||||
@@ -244,7 +240,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<p v-html="$t('commGuidePara069')"></p>
|
<p v-html="$t('commGuidePara069')"></p>
|
||||||
<ul class="list-2col list-unstyled">
|
<ul class="list-2col list-unstyled">
|
||||||
<li>Beffymaroo</li>
|
|
||||||
<li>Breadstrings</li>
|
<li>Breadstrings</li>
|
||||||
<li>Draayder</li>
|
<li>Draayder</li>
|
||||||
<li>Kiwibot</li>
|
<li>Kiwibot</li>
|
||||||
|
|||||||
@@ -5,44 +5,40 @@
|
|||||||
>
|
>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 col-md-6 offset-md-3">
|
<div class="col-12 col-md-6 offset-md-3">
|
||||||
<h1
|
<h1 id="faq-heading">
|
||||||
v-once
|
|
||||||
id="faq-heading"
|
|
||||||
>
|
|
||||||
{{ $t('frequentlyAskedQuestions') }}
|
{{ $t('frequentlyAskedQuestions') }}
|
||||||
</h1>
|
</h1>
|
||||||
<div
|
<div
|
||||||
v-for="(entry, index) in faq.questions"
|
v-for="(heading, index) in headings"
|
||||||
:key="index"
|
:key="index"
|
||||||
class="faq-question"
|
class="faq-question"
|
||||||
>
|
>
|
||||||
<h2
|
<div
|
||||||
v-once
|
v-if="heading !== 'world-boss'"
|
||||||
v-b-toggle="entry.heading"
|
|
||||||
role="tab"
|
|
||||||
variant="info"
|
|
||||||
@click="handleClick($event)"
|
|
||||||
>
|
>
|
||||||
{{ entry.question }}
|
<h2
|
||||||
</h2>
|
v-b-toggle="heading"
|
||||||
<b-collapse
|
role="tab"
|
||||||
:id="entry.heading"
|
variant="info"
|
||||||
:visible="isVisible(entry.heading)"
|
@click="handleClick($event)"
|
||||||
accordion="faq"
|
>
|
||||||
role="tabpanel"
|
{{ $t(`faqQuestion${index}`) }}
|
||||||
>
|
</h2>
|
||||||
<div
|
<b-collapse
|
||||||
v-once
|
:id="heading"
|
||||||
v-markdown="entry.web"
|
:visible="isVisible(heading)"
|
||||||
class="card-body"
|
accordion="faq"
|
||||||
></div>
|
role="tabpanel"
|
||||||
</b-collapse>
|
>
|
||||||
|
<div
|
||||||
|
v-markdown="$t(`webFaqAnswer${index}`, replacements)"
|
||||||
|
class="card-body"
|
||||||
|
></div>
|
||||||
|
</b-collapse>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<p
|
<p v-markdown="$t('webFaqStillNeedHelp')"></p>
|
||||||
v-once
|
|
||||||
v-markdown="stillNeedHelp"
|
|
||||||
></p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -50,7 +46,7 @@
|
|||||||
|
|
||||||
<style lang='scss' scoped>
|
<style lang='scss' scoped>
|
||||||
.card-body {
|
.card-body {
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faq-question h2 {
|
.faq-question h2 {
|
||||||
@@ -78,34 +74,53 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
// @TODO: env.EMAILS.TECH_ASSISTANCE_EMAIL
|
||||||
import markdownDirective from '@/directives/markdown';
|
import markdownDirective from '@/directives/markdown';
|
||||||
|
|
||||||
|
const TECH_ASSISTANCE_EMAIL = 'admin@habitica.com';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
directives: {
|
directives: {
|
||||||
markdown: markdownDirective,
|
markdown: markdownDirective,
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
|
const headings = [
|
||||||
|
'overview',
|
||||||
|
'set-up-tasks',
|
||||||
|
'sample-tasks',
|
||||||
|
'task-color',
|
||||||
|
'health',
|
||||||
|
'party-with-friends',
|
||||||
|
'pets-mounts',
|
||||||
|
'character-classes',
|
||||||
|
'blue-mana-bar',
|
||||||
|
'monsters-quests',
|
||||||
|
'gems',
|
||||||
|
'bugs-features',
|
||||||
|
'world-boss',
|
||||||
|
'group-plans',
|
||||||
|
];
|
||||||
|
|
||||||
|
const hash = window.location.hash.replace('#', '');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
faq: {},
|
headings,
|
||||||
headings: [],
|
replacements: {
|
||||||
stillNeedHelp: '',
|
techAssistanceEmail: TECH_ASSISTANCE_EMAIL,
|
||||||
|
wikiTechAssistanceEmail: `mailto:${TECH_ASSISTANCE_EMAIL}`,
|
||||||
|
},
|
||||||
|
visible: hash && headings.includes(hash) ? hash : null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
async mounted () {
|
mounted () {
|
||||||
this.$store.dispatch('common:setTitle', {
|
this.$store.dispatch('common:setTitle', {
|
||||||
section: this.$t('help'),
|
section: this.$t('help'),
|
||||||
subSection: this.$t('faq'),
|
subSection: this.$t('faq'),
|
||||||
});
|
});
|
||||||
this.faq = await this.$store.dispatch('faq:getFAQ');
|
|
||||||
for (const entry of this.faq.questions) {
|
|
||||||
this.headings.push(entry.heading);
|
|
||||||
}
|
|
||||||
this.stillNeedHelp = this.faq.stillNeedHelp.web;
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
isVisible (heading) {
|
isVisible (heading) {
|
||||||
const hash = window.location.hash.replace('#', '');
|
return this.visible && this.visible === heading;
|
||||||
return hash && this.headings.includes(hash) && hash === heading;
|
|
||||||
},
|
},
|
||||||
handleClick (e) {
|
handleClick (e) {
|
||||||
if (!e) return;
|
if (!e) return;
|
||||||
|
|||||||
@@ -81,6 +81,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<a
|
<a
|
||||||
v-if="assignedUsersCount > 1 && !showStatus"
|
v-if="assignedUsersCount > 1 && !showStatus"
|
||||||
|
class="blue-10"
|
||||||
@click="showStatus = !showStatus"
|
@click="showStatus = !showStatus"
|
||||||
>
|
>
|
||||||
{{ $t('viewStatus') }}
|
{{ $t('viewStatus') }}
|
||||||
@@ -127,6 +128,10 @@
|
|||||||
padding-top: 0.25rem;
|
padding-top: 0.25rem;
|
||||||
z-index: 9;
|
z-index: 9;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
|
|
||||||
|
.blue-10 {
|
||||||
|
color: $blue-10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.completion-row {
|
.completion-row {
|
||||||
|
|||||||
@@ -593,6 +593,7 @@
|
|||||||
a:not(.dropdown-item) {
|
a:not(.dropdown-item) {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.33;
|
line-height: 1.33;
|
||||||
|
color: $blue-10;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-dialog.modal-sm {
|
.modal-dialog.modal-sm {
|
||||||
|
|||||||
@@ -276,6 +276,7 @@
|
|||||||
a {
|
a {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.33;
|
line-height: 1.33;
|
||||||
|
color: $blue-10;
|
||||||
margin-top: 4px;
|
margin-top: 4px;
|
||||||
|
|
||||||
&:focus, &:hover, &:active {
|
&:focus, &:hover, &:active {
|
||||||
|
|||||||
@@ -133,7 +133,7 @@
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: $white !important;
|
color: $gray-400;
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
border-bottom: 2px solid transparent;
|
border-bottom: 2px solid transparent;
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
|
|||||||
@@ -182,6 +182,7 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -295,6 +296,10 @@
|
|||||||
width: 50%;
|
width: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.challenge-link, .user-link {
|
||||||
|
color: $blue-10 !important;
|
||||||
|
}
|
||||||
|
|
||||||
.entry-action {
|
.entry-action {
|
||||||
b {
|
b {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
|
|||||||
@@ -863,13 +863,16 @@ export default {
|
|||||||
this.loadUser();
|
this.loadUser();
|
||||||
this.oldTitle = this.$store.state.title;
|
this.oldTitle = this.$store.state.title;
|
||||||
this.selectPage(this.startingPage);
|
this.selectPage(this.startingPage);
|
||||||
|
this.$root.$on('habitica:restoreTitle', () => {
|
||||||
|
if (this.oldTitle) {
|
||||||
|
this.$store.dispatch('common:setTitle', {
|
||||||
|
fullTitle: this.oldTitle,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
beforeDestroy () {
|
beforeDestroy () {
|
||||||
if (this.oldTitle) {
|
this.$root.$off('habitica:restoreTitle');
|
||||||
this.$store.dispatch('common:setTitle', {
|
|
||||||
fullTitle: this.oldTitle,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async loadUser () {
|
async loadUser () {
|
||||||
@@ -1025,9 +1028,10 @@ export default {
|
|||||||
this.$store.dispatch('hall:updateHero', { heroDetails: this.hero });
|
this.$store.dispatch('hall:updateHero', { heroDetails: this.hero });
|
||||||
},
|
},
|
||||||
adminBlockUser () {
|
adminBlockUser () {
|
||||||
this.hero.auth.blocked = true;
|
if (window.confirm('Ban user and auto-hide all posts?')) {
|
||||||
|
this.hero.auth.blocked = true;
|
||||||
this.$store.dispatch('hall:updateHero', { heroDetails: this.hero });
|
this.$store.dispatch('hall:updateHero', { heroDetails: this.hero });
|
||||||
|
}
|
||||||
},
|
},
|
||||||
adminUnblockUser () {
|
adminUnblockUser () {
|
||||||
this.hero.auth.blocked = false;
|
this.hero.auth.blocked = false;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
:hide-footer="true"
|
:hide-footer="true"
|
||||||
:hide-header="true"
|
:hide-header="true"
|
||||||
@hide="beforeHide"
|
@hide="beforeHide"
|
||||||
|
@hidden="onHidden"
|
||||||
@shown="onShown()"
|
@shown="onShown()"
|
||||||
>
|
>
|
||||||
<profile
|
<profile
|
||||||
@@ -54,11 +55,14 @@ export default {
|
|||||||
},
|
},
|
||||||
beforeHide () {
|
beforeHide () {
|
||||||
if (this.$route.path !== window.location.pathname) {
|
if (this.$route.path !== window.location.pathname) {
|
||||||
this.$router.back();
|
this.$root.$emit('habitica:restoreTitle');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onHidden () {
|
||||||
|
if (this.$route.path !== window.location.pathname) {
|
||||||
|
this.$router.go(-1);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ export default {
|
|||||||
'Fox-Veteran',
|
'Fox-Veteran',
|
||||||
'JackOLantern-Glow',
|
'JackOLantern-Glow',
|
||||||
'Gryphon-Gryphatrice',
|
'Gryphon-Gryphatrice',
|
||||||
'Gryphatrice-Jubilant',
|
|
||||||
'JackOLantern-RoyalPurple',
|
'JackOLantern-RoyalPurple',
|
||||||
];
|
];
|
||||||
const BASE_PETS = [
|
const BASE_PETS = [
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { CONSTANTS, setLocalSetting } from '@/libs/userlocalManager';
|
|||||||
|
|
||||||
const { STRIPE_PUB_KEY } = process.env;
|
const { STRIPE_PUB_KEY } = process.env;
|
||||||
|
|
||||||
|
// const habiticaUrl = `${window.location.protocol}//${window.location.host}`;
|
||||||
let stripeInstance = null;
|
let stripeInstance = null;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -69,7 +70,6 @@ export default {
|
|||||||
type,
|
type,
|
||||||
giftData,
|
giftData,
|
||||||
gemsBlock,
|
gemsBlock,
|
||||||
sku,
|
|
||||||
} = data;
|
} = data;
|
||||||
let { url } = data;
|
let { url } = data;
|
||||||
|
|
||||||
@@ -93,11 +93,6 @@ export default {
|
|||||||
url += `?gemsBlock=${gemsBlock.key}`;
|
url += `?gemsBlock=${gemsBlock.key}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'sku') {
|
|
||||||
appState.sku = sku;
|
|
||||||
url += `?sku=${sku}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
setLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE, JSON.stringify(appState));
|
setLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE, JSON.stringify(appState));
|
||||||
window.open(url, '_blank');
|
window.open(url, '_blank');
|
||||||
|
|
||||||
@@ -134,7 +129,6 @@ export default {
|
|||||||
if (data.group || data.groupToCreate) paymentType = 'groupPlan';
|
if (data.group || data.groupToCreate) paymentType = 'groupPlan';
|
||||||
if (data.gift && data.gift.type === 'gems') paymentType = 'gift-gems';
|
if (data.gift && data.gift.type === 'gems') paymentType = 'gift-gems';
|
||||||
if (data.gift && data.gift.type === 'subscription') paymentType = 'gift-subscription';
|
if (data.gift && data.gift.type === 'subscription') paymentType = 'gift-subscription';
|
||||||
if (data.sku) paymentType = 'sku';
|
|
||||||
|
|
||||||
let url = '/stripe/checkout-session';
|
let url = '/stripe/checkout-session';
|
||||||
const postData = {};
|
const postData = {};
|
||||||
@@ -154,7 +148,6 @@ export default {
|
|||||||
if (data.coupon) postData.coupon = data.coupon;
|
if (data.coupon) postData.coupon = data.coupon;
|
||||||
if (data.groupId) postData.groupId = data.groupId;
|
if (data.groupId) postData.groupId = data.groupId;
|
||||||
if (data.demographics) postData.demographics = data.demographics;
|
if (data.demographics) postData.demographics = data.demographics;
|
||||||
if (data.sku) postData.sku = data.sku;
|
|
||||||
|
|
||||||
const response = await axios.post(url, postData);
|
const response = await axios.post(url, postData);
|
||||||
|
|
||||||
@@ -257,7 +250,6 @@ export default {
|
|||||||
|
|
||||||
if (data.type === 'single') {
|
if (data.type === 'single') {
|
||||||
this.amazonPayments.gemsBlock = data.gemsBlock;
|
this.amazonPayments.gemsBlock = data.gemsBlock;
|
||||||
this.amazonPayments.sku = data.sku;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.gift) {
|
if (data.gift) {
|
||||||
|
|||||||
@@ -272,11 +272,6 @@ const router = new VueRouter({
|
|||||||
name: 'transactions',
|
name: 'transactions',
|
||||||
path: 'transactions',
|
path: 'transactions',
|
||||||
component: Transactions,
|
component: Transactions,
|
||||||
meta: {
|
|
||||||
privilegeNeeded: [
|
|
||||||
'userSupport',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'notifications',
|
name: 'notifications',
|
||||||
@@ -321,6 +316,11 @@ const router = new VueRouter({
|
|||||||
{
|
{
|
||||||
name: 'front', path: 'front', component: HomePage, meta: { requiresLogin: false },
|
name: 'front', path: 'front', component: HomePage, meta: { requiresLogin: false },
|
||||||
},
|
},
|
||||||
|
// Commenting out merch page see
|
||||||
|
// https://github.com/HabitRPG/habitica/issues/12039
|
||||||
|
// {
|
||||||
|
// name: 'merch', path: 'merch', component: MerchPage, meta: { requiresLogin: false },
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
name: 'news', path: 'new-stuff', component: NewsPage, meta: { requiresLogin: false },
|
name: 'news', path: 'new-stuff', component: NewsPage, meta: { requiresLogin: false },
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
import axios from 'axios';
|
|
||||||
|
|
||||||
export async function getFAQ () {
|
|
||||||
const url = '/api/v4/faq?platform=web';
|
|
||||||
const response = await axios.get(url);
|
|
||||||
return response.data.data;
|
|
||||||
}
|
|
||||||
@@ -18,7 +18,6 @@ import * as snackbars from './snackbars';
|
|||||||
import * as worldState from './worldState';
|
import * as worldState from './worldState';
|
||||||
import * as news from './news';
|
import * as news from './news';
|
||||||
import * as analytics from './analytics';
|
import * as analytics from './analytics';
|
||||||
import * as faq from './faq';
|
|
||||||
|
|
||||||
// Actions should be named as 'actionName' and can be accessed as 'namespace:actionName'
|
// Actions should be named as 'actionName' and can be accessed as 'namespace:actionName'
|
||||||
// Example: fetch in user.js -> 'user:fetch'
|
// Example: fetch in user.js -> 'user:fetch'
|
||||||
@@ -42,7 +41,6 @@ const actions = flattenAndNamespace({
|
|||||||
worldState,
|
worldState,
|
||||||
news,
|
news,
|
||||||
analytics,
|
analytics,
|
||||||
faq,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default actions;
|
export default actions;
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
|
// import omit from 'lodash/omit';
|
||||||
|
// import findIndex from 'lodash/findIndex';
|
||||||
|
|
||||||
const apiv4Prefix = '/api/v4';
|
const apiv4Prefix = '/api/v4';
|
||||||
|
|
||||||
export async function getGroupMembers (store, payload) {
|
export async function getGroupMembers (store, payload) {
|
||||||
@@ -114,3 +117,38 @@ export async function getPurchaseHistory (store, payload) {
|
|||||||
const response = await axios.get(`${apiv4Prefix}/members/${payload.memberId}/purchase-history`);
|
const response = await axios.get(`${apiv4Prefix}/members/${payload.memberId}/purchase-history`);
|
||||||
return response.data.data;
|
return response.data.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// export async function selectMember (uid) {
|
||||||
|
// let memberIsReady = _checkIfMemberIsReady(members[uid]);
|
||||||
|
//
|
||||||
|
// if (memberIsReady) {
|
||||||
|
// _prepareMember(members[uid], self);
|
||||||
|
// return
|
||||||
|
// } else {
|
||||||
|
// fetchMember(uid)
|
||||||
|
// .then(function (response) {
|
||||||
|
// var member = response.data.data;
|
||||||
|
// addToMembersList(member); // lazy load for later
|
||||||
|
// _prepareMember(member, self);
|
||||||
|
// deferred.resolve();
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// function addToMembersList (member) {
|
||||||
|
// if (member._id) {
|
||||||
|
// members[member._id] = member;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// function _checkIfMemberIsReady (member) {
|
||||||
|
// return member && member.items && member.items.weapon;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// function _prepareMember(member, self) {
|
||||||
|
// self.selectedMember = members[member._id];
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// $rootScope.$on('userUpdated', function(event, user){
|
||||||
|
// addToMembersList(user);
|
||||||
|
// })
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
export async function getTags () {
|
export async function getTags () {
|
||||||
const url = '/api/v4/tags';
|
const url = 'api/v4/tags';
|
||||||
const response = await axios.get(url);
|
const response = await axios.get(url);
|
||||||
return response.data.data;
|
return response.data.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createTag (store, payload) {
|
export async function createTag (store, payload) {
|
||||||
const url = '/api/v4/tags';
|
const url = 'api/v4/tags';
|
||||||
const response = await axios.post(url, {
|
const response = await axios.post(url, {
|
||||||
name: payload.name,
|
name: payload.name,
|
||||||
});
|
});
|
||||||
@@ -19,13 +19,13 @@ export async function createTag (store, payload) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function getTag (store, payload) {
|
export async function getTag (store, payload) {
|
||||||
const url = `/api/v4/tags/${payload.tagId}`;
|
const url = `api/v4/tags/${payload.tagId}`;
|
||||||
const response = await axios.get(url);
|
const response = await axios.get(url);
|
||||||
return response.data.data;
|
return response.data.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateTag (store, payload) {
|
export async function updateTag (store, payload) {
|
||||||
const url = `/api/v4/tags/${payload.tagId}`;
|
const url = `api/v4/tags/${payload.tagId}`;
|
||||||
const response = await axios.put(url, {
|
const response = await axios.put(url, {
|
||||||
tagDetails: payload.tagDetails,
|
tagDetails: payload.tagDetails,
|
||||||
});
|
});
|
||||||
@@ -33,7 +33,7 @@ export async function updateTag (store, payload) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function sortTag (store, payload) {
|
export async function sortTag (store, payload) {
|
||||||
const url = '/api/v4/reorder-tags';
|
const url = 'api/v4/reorder-tags';
|
||||||
const response = await axios.post(url, {
|
const response = await axios.post(url, {
|
||||||
tagId: payload.tagId,
|
tagId: payload.tagId,
|
||||||
to: payload.to,
|
to: payload.to,
|
||||||
@@ -42,7 +42,7 @@ export async function sortTag (store, payload) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function deleteTag (store, payload) {
|
export async function deleteTag (store, payload) {
|
||||||
const url = `/api/v4/tags/${payload.tagId}`;
|
const url = `api/v4/tags/${payload.tagId}`;
|
||||||
const response = await axios.delete(url);
|
const response = await axios.delete(url);
|
||||||
return response.data.data;
|
return response.data.data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,22 +127,16 @@
|
|||||||
"achievementReptacularRumbleModalText": "لقد جمعت كل الزواحف الأليفة!",
|
"achievementReptacularRumbleModalText": "لقد جمعت كل الزواحف الأليفة!",
|
||||||
"achievementReptacularRumbleText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الزواحف: التمساح، الزاحف المجنح، الأفعى، ترايسيراتوبس، السلحفاة، التيرانوصور ريكس وفيلوسيرابتور!",
|
"achievementReptacularRumbleText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الزواحف: التمساح، الزاحف المجنح، الأفعى، ترايسيراتوبس، السلحفاة، التيرانوصور ريكس وفيلوسيرابتور!",
|
||||||
"achievementBirdsOfAFeather": "أصدقاء الطيران",
|
"achievementBirdsOfAFeather": "أصدقاء الطيران",
|
||||||
"achievementZodiacZookeeper": "حارس البروج",
|
"achievementZodiacZookeeper": "حارس حديقة الحيوانات الفلكية",
|
||||||
"achievementShadyCustomerText": "جمعت كل الحيوانات الأليفة السوداء.",
|
"achievementShadyCustomerText": "جمع كل حيوانات الظل الأليفة.",
|
||||||
"achievementShadyCustomerModalText": "لقد جمعت كل الحيوانات الأليفة السوداء!",
|
"achievementShadyCustomerModalText": "لقد جمعت كل حيوانات الظل الأليفة!",
|
||||||
"achievementZodiacZookeeperModalText": "لقد جمعت كل حيوانات البروج الأليفة!",
|
"achievementZodiacZookeeperModalText": "لقد جمعت كل الحيوانات الأليفة الفلكية!",
|
||||||
"achievementBirdsOfAFeatherText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الطائرة: الخنزير الطائر، البومة، الببغاء، الزاحف المجنح، الجرايفون، فالكون، الطاووس والديك!",
|
"achievementBirdsOfAFeatherText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الطائرة: الخنزير الطائر، البومة، الببغاء، الزاحف المجنح، الجرايفون، فالكون، الطاووس والديك!",
|
||||||
"achievementShadeOfItAllModalText": "لقد قمت بترويض كل الركوبات السوداء!",
|
"achievementShadeOfItAllModalText": "قمت بترويض كل الحيوانات السوداء",
|
||||||
"achievementShadyCustomer": "عميل مشبوه",
|
"achievementShadyCustomer": "عميل الظل",
|
||||||
"achievementShadeOfItAll": "كل شيء في الظلام",
|
"achievementShadeOfItAll": "الظل فوق كل شيء",
|
||||||
"achievementShadeOfItAllText": "قام بترويض كل الركوبات السوداء.",
|
"achievementShadeOfItAllText": "روض كل حيوانات الظل السوداء.",
|
||||||
"achievementWoodlandWizard": "ساحر الغابة",
|
"achievementWoodlandWizard": "ساحر الغابة",
|
||||||
"achievementWoodlandWizardText": "لقد فقس جميع الألوان القياسية لمخلوقات الغابة: الغرير، الدب، الغزال، الثعلب، الضفدع، القنفذ، البومة، الأفعى، السنجاب والشجيرة!",
|
"achievementWoodlandWizardText": "لقد فقس جميع الألوان القياسية لمخلوقات الغابة: الغرير، الدب، الغزال، الثعلب، الضفدع، القنفذ، البومة، الأفعى، السنجاب والشجيرة!",
|
||||||
"achievementWoodlandWizardModalText": "لقد جمعت كل حيوانات الغابة الأليفة!",
|
"achievementWoodlandWizardModalText": "لقد جمعت كل حيوانات الغابة الأليفة!"
|
||||||
"achievementPolarPro": "المحترف القطبي",
|
|
||||||
"achievementPolarProText": "فقست جميع الحيوانات الأليفة القطبية في الألوان القياسية: الدب ، الثعلب ، البطريق ، الحوت ، والذئب!",
|
|
||||||
"achievementPolarProModalText": "لقد جمعت كل الحيوانات الأليفة القطبية!",
|
|
||||||
"achievementBoneToPick": "جامع العظام",
|
|
||||||
"achievementBoneToPickText": "فقست جميع الحيوانات الأليفة الهيكلية المغامرة والكلاسيكية!",
|
|
||||||
"achievementBoneToPickModalText": "لقد جمعت كل الحيوانات الأليفة الهيكلية المغامرة والكلاسيكية!"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -411,7 +411,7 @@
|
|||||||
"backgroundScribesWorkshopNotes": "Write your next great scroll in a Scribe's Workshop.",
|
"backgroundScribesWorkshopNotes": "Write your next great scroll in a Scribe's Workshop.",
|
||||||
"backgrounds022019": "مجموعة 57: تم إصدارها في فبراير 2019",
|
"backgrounds022019": "مجموعة 57: تم إصدارها في فبراير 2019",
|
||||||
"backgroundBirthdayPartyText": "حفلة عيد ميلاد",
|
"backgroundBirthdayPartyText": "حفلة عيد ميلاد",
|
||||||
"backgrounds012020": "المجموعة 68: صدرت في يناير 2020",
|
"backgrounds012020": "مجموعة 68: تم طرحه في يناير 2020",
|
||||||
"backgroundMedievalKitchenText": "مطبخ القرون الوسطى",
|
"backgroundMedievalKitchenText": "مطبخ القرون الوسطى",
|
||||||
"backgroundMedievalKitchenNotes": "اطبخ العاصفة في مطبخ القرون الوسطى.",
|
"backgroundMedievalKitchenNotes": "اطبخ العاصفة في مطبخ القرون الوسطى.",
|
||||||
"backgroundBirthdayPartyNotes": "احتفل بعيد ميلاد ال Habitican المفضل لديك.",
|
"backgroundBirthdayPartyNotes": "احتفل بعيد ميلاد ال Habitican المفضل لديك.",
|
||||||
@@ -422,231 +422,5 @@
|
|||||||
"backgroundDuckPondNotes": "أطعم الطيور المائية في بركة البط.",
|
"backgroundDuckPondNotes": "أطعم الطيور المائية في بركة البط.",
|
||||||
"backgroundValentinesDayFeastingHallNotes": "اشعر بالحب في قاعة احتفالات عيد الحب.",
|
"backgroundValentinesDayFeastingHallNotes": "اشعر بالحب في قاعة احتفالات عيد الحب.",
|
||||||
"hideLockedBackgrounds": "إخفاء الخلفيات المقفلة",
|
"hideLockedBackgrounds": "إخفاء الخلفيات المقفلة",
|
||||||
"backgrounds032019": "SET 58: تم إصداره في مارس 2019",
|
"backgrounds032019": "SET 58: تم إصداره في مارس 2019"
|
||||||
"backgroundFieldWithColoredEggsNotes": "ابحث عن كنز الربيع في حقل به بيض ملون.",
|
|
||||||
"backgroundFlowerMarketNotes": "اعثر على الزهور المثالية لباقة أو حديقة في سوق الزهور.",
|
|
||||||
"backgrounds052019": "المجموعة 60: صدرت في مايو 2019",
|
|
||||||
"backgroundHalflingsHouseNotes": "قم بزيارة منزل هافلينج الساحر.",
|
|
||||||
"backgroundBirchForestText": "غابة البتولا",
|
|
||||||
"backgroundBlossomingDesertNotes": "شاهد إزهارًا هائلًا نادرًا في الصحراء المزهرة.",
|
|
||||||
"backgroundDojoText": "دوجو",
|
|
||||||
"backgroundBlossomingDesertText": "الصحراء المزهرة",
|
|
||||||
"backgroundHalflingsHouseText": "منزل هافلينج",
|
|
||||||
"backgroundFlowerMarketText": "سوق الزهور",
|
|
||||||
"backgroundBirchForestNotes": "اقضِ بعض الوقت في غابة البتولا الهادئة.",
|
|
||||||
"backgroundFieldWithColoredEggsText": "حقل به بيض ملون",
|
|
||||||
"backgrounds042019": "المجموعة 59: صدرت في أبريل 2019",
|
|
||||||
"backgroundRainbowMeadowNotes": "ابحث عن وعاء الذهب حيث ينتهي قوس قزح في مرج.",
|
|
||||||
"backgrounds062019": "المجموعة 61: صدرت في يونيو 2019",
|
|
||||||
"backgroundUnderwaterVentsNotes": "غص في الأعماق حيث تكمن الفتحات المائية الحرارية.",
|
|
||||||
"backgroundRainbowMeadowText": "مرج قوس قزح",
|
|
||||||
"backgroundSeasideCliffsNotes": "قف على الشاطئ وسط جمال المنحدرات الساحلية المحيطة.",
|
|
||||||
"backgroundSchoolOfFishNotes": "اسبح بين سرب من الأسماك.",
|
|
||||||
"backgroundUnderwaterVentsText": "الفتحات الحرارية المائية",
|
|
||||||
"backgroundSeasideCliffsText": "المنحدرات الساحلية",
|
|
||||||
"backgroundParkWithStatueText": "حديقة بها تمثال",
|
|
||||||
"backgroundDojoNotes": "تعلم حركات جديدة في دوجو.",
|
|
||||||
"backgroundSchoolOfFishText": "سرب من الأسماك",
|
|
||||||
"backgrounds072019": "المجموعة 62: صدرت في يوليو 2019",
|
|
||||||
"backgroundParkWithStatueNotes": "اتبع مسارًا تصطف على جانبيه الأزهار عبر حديقة بها تمثال.",
|
|
||||||
"backgroundFlyingOverTropicalIslandsText": "التحليق فوق الجزر الاستوائية",
|
|
||||||
"backgroundFlyingOverTropicalIslandsNotes": "دع المنظر يذهلك وأنت تحلق فوق الجزر الاستوائية.",
|
|
||||||
"backgrounds082019": "المجموعة 63: صدرت في أغسطس 2019",
|
|
||||||
"backgroundLakeWithFloatingLanternsNotes": "شاهد النجوم من بحيرة احتفالية عليها فوانيس عائمة.",
|
|
||||||
"backgroundLakeWithFloatingLanternsText": "بحيرة عليها فوانيس عائمة",
|
|
||||||
"backgroundTreehouseNotes": "استرخ بمفردك في منزل الشجرة الخاص بك.",
|
|
||||||
"backgrounds092019": "المجموعة 64: صدرت في سبتمبر 2019",
|
|
||||||
"backgroundAutumnFlowerGardenText": "حديقة الزهور الخريفية",
|
|
||||||
"backgroundInAnAncientTombText": "قبر قديم",
|
|
||||||
"backgroundAmidAncientRuinsNotes": "قف بوقار لماضٍ غامض بين الآثار القديمة.",
|
|
||||||
"backgroundGiantDandelionsText": "الهندباء العملاقة",
|
|
||||||
"backgroundAmongGiantAnemonesText": "بين شقائق النعمان العملاقة",
|
|
||||||
"backgroundInAnAncientTombNotes": "واجه الأسرار من قبر قديم.",
|
|
||||||
"backgroundAutumnFlowerGardenNotes": "تشمس في دفء حديقة الزهور الخريفية.",
|
|
||||||
"backgroundTreehouseText": "منزل الشجرة",
|
|
||||||
"backgroundAmongGiantAnemonesNotes": "استكشف الشعاب المرجانية بينما أنت محمي\\ة من الحيوانات المفترسة البحرية بين شقائق النعمان العملاقة.",
|
|
||||||
"backgroundAmidAncientRuinsText": "بين الأطلال القديمة",
|
|
||||||
"backgroundGiantDandelionsNotes": "اقضِ بعض الوقت بين الهندباء العملاقة.",
|
|
||||||
"backgroundInAClassroomText": "صف",
|
|
||||||
"backgroundInAClassroomNotes": "اكتسب المعرفة من معلميك في صف.",
|
|
||||||
"backgrounds102019": "المجموعة 65: صدرت في اكتوبر 2019",
|
|
||||||
"backgroundFoggyMoorText": "مستنقع ضبابي",
|
|
||||||
"backgroundFoggyMoorNotes": "كن حذرًا أثناء عبور المستنقع الضبابي.",
|
|
||||||
"backgroundPumpkinCarriageText": "عربة اليقطين",
|
|
||||||
"backgroundPumpkinCarriageNotes": "اركب في عربة اليقطين المسحورة قبل وصول منتصف الليل.",
|
|
||||||
"backgroundMonsterMakersWorkshopText": "ورشة عمل صانع الوحش",
|
|
||||||
"backgroundMonsterMakersWorkshopNotes": "تجربة مع علوم مشوهة في ورشة عمل صانع الوحش.",
|
|
||||||
"backgrounds112019": "المجموعة 66: صدرت في نوفمبر 2019",
|
|
||||||
"backgroundFarmersMarketText": "سوق المزارعين",
|
|
||||||
"backgroundFarmersMarketNotes": "تسوق للحصول على الطعام الطازج في سوق المزارعين.",
|
|
||||||
"backgroundFlyingInAThunderstormText": "عاصفة رعدية مضطربة",
|
|
||||||
"backgroundFlyingInAThunderstormNotes": "تابع عاصفة رعدية مضطربة إذا كنت تجرؤ.",
|
|
||||||
"backgroundPotionShopNotes": "اعثر على إكسير لأي مرض في متجر الجرعات السحرية.",
|
|
||||||
"backgroundPotionShopText": "متجر الجرعات السحرية",
|
|
||||||
"backgrounds122019": "المجموعة 67: صدرت في ديسمبر 2019",
|
|
||||||
"backgroundWinterNocturneText": "ليلة شتاء",
|
|
||||||
"backgroundWinterNocturneNotes": "تشمس في ضوء النجوم في ليلة شتاء.",
|
|
||||||
"backgroundElegantBallroomText": "قاعة رقص أنيقة",
|
|
||||||
"backgroundDesertWithSnowText": "صحراء ثلجية",
|
|
||||||
"backgrounds022020": "المجموعة 69: صدرت في فبراير 2020",
|
|
||||||
"backgroundHallOfHeroesText": "قاعة الأبطال",
|
|
||||||
"backgrounds032020": "المجموعة 70: صدرت في مارس 2020",
|
|
||||||
"backgroundButterflyGardenText": "حديقة الفراشات",
|
|
||||||
"backgroundSnowglobeNotes": "هز كرة ثلجية واستقر في صورة مصغرة لمنظر طبيعي شتوي.",
|
|
||||||
"backgroundAmongGiantFlowersText": "بين الزهور العملاقة",
|
|
||||||
"backgroundHallOfHeroesNotes": "اقترب من قاعة الأبطال بتقدير وتقديس.",
|
|
||||||
"backgroundDesertWithSnowNotes": "شاهد الجمال النادر والهادئ للصحراء الثلجية.",
|
|
||||||
"backgroundTeaPartyNotes": "شارك في حفلة شاي فاخرة.",
|
|
||||||
"backgroundAnimalCloudsText": "غيوم على شكل حيوانات",
|
|
||||||
"backgrounds042020": "المجموعة 71: صدرت في أبريل 2020",
|
|
||||||
"backgroundAnimalCloudsNotes": "مارس خيالك بالعثور على أشكال حيوانات في الغيوم.",
|
|
||||||
"backgroundHolidayMarketText": "سوق العطلات",
|
|
||||||
"backgroundTeaPartyText": "حفلة شاي",
|
|
||||||
"backgroundElegantBallroomNotes": "ارقص طوال الليل في قاعة رقص أنيقة.",
|
|
||||||
"backgroundHolidayMarketNotes": "اعثر على الهدايا والزخارف المثالية في سوق العطلات.",
|
|
||||||
"backgroundSnowglobeText": "كرة الثلج",
|
|
||||||
"backgroundSucculentGardenNotes": "قدّر جمال حديقة النباتات النضرة.",
|
|
||||||
"backgroundButterflyGardenNotes": "احتفل مع الملقحات في حديقة الفراشات.",
|
|
||||||
"backgroundSucculentGardenText": "حديقة النباتات النضرة",
|
|
||||||
"backgroundHolidayWreathText": "إكليل الصنوبر",
|
|
||||||
"backgroundHolidayWreathNotes": "تزيين صورتك الرمزية مع إكليل عطر من الصنوبر.",
|
|
||||||
"backgroundAmongGiantFlowersNotes": "اقض بعض الوقت بين الزهور العملاقة.",
|
|
||||||
"backgroundHotAirBalloonText": "منطاد الهواء الساخن",
|
|
||||||
"backgroundRelaxationRiverText": "نهر الاسترخاء",
|
|
||||||
"backgroundHotAirBalloonNotes": "احلق فوق الأرض في منطاد الهواء الساخن.",
|
|
||||||
"backgroundStrawberryPatchText": "حقل الفراولة",
|
|
||||||
"backgroundHeatherFieldNotes": "استمتع برائحة حقل الخلنج.",
|
|
||||||
"backgroundHabitCityRooftopsText": "أسطح المنازل في مدينة حابيت",
|
|
||||||
"backgroundHabitCityRooftopsNotes": "خذ قفزات جريئة بين أسطح المنازل في مدينة حابيت.",
|
|
||||||
"backgroundHeatherFieldText": "حقل الخلنج",
|
|
||||||
"backgroundRainyBarnyardNotes": "تجول في مزرعة ممطرة.",
|
|
||||||
"backgroundRainyBarnyardText": "مزرعة ممطرة",
|
|
||||||
"backgrounds052020": "المجموعة 72: صدرت في مايو 2020",
|
|
||||||
"backgroundStrawberryPatchNotes": "جمع التوت الطازج من حقل الفراولة.",
|
|
||||||
"backgrounds062020": "المجموعة 73: صدرت في يونيو 2020",
|
|
||||||
"backgroundRelaxationRiverNotes": "انجرف ببطء على طول نهر الاسترخاء.",
|
|
||||||
"backgroundSaltLakeText": "بحيرة مالحة",
|
|
||||||
"backgroundVikingShipText": "سفينة فايكنغ",
|
|
||||||
"backgroundSaltLakeNotes": "شاهد التموجات الحمراء المذهلة لبحيرة مالحة.",
|
|
||||||
"backgroundBeachCabanaNotes": "استرخِ في ظل كوخ الشاطئ.",
|
|
||||||
"backgroundSwimmingAmongJellyfishText": "السباحة بين قناديل البحر",
|
|
||||||
"backgrounds072020": "المجموعة 74: صدرت في يوليو 2020",
|
|
||||||
"backgroundBeachCabanaText": "كوخ الشاطئ",
|
|
||||||
"backgroundVikingShipNotes": "أبحر على متن سفينة فايكنغ بحثًا عن المغامرة.",
|
|
||||||
"backgrounds082020": "المجموعة 75: صدرت في أغسطس 2020",
|
|
||||||
"backgroundSwimmingAmongJellyfishNotes": "اشعر بالجمال والخطر وأنت تسبح بين قناديل البحر.",
|
|
||||||
"backgroundUnderwaterRuinsText": "أطلال تحت الماء",
|
|
||||||
"backgroundCampingOutNotes": "استمتع بالهواء الطلق أثناء رحلة التخييم.",
|
|
||||||
"backgroundUnderwaterRuinsNotes": "اِسْتَكْشِفْ الأطلال تحت الماء التي غرقت منذ فترة طويلة.",
|
|
||||||
"backgroundCampingOutText": "رحلة تخييم",
|
|
||||||
"backgroundProductivityPlazaText": "ساحة الإنتاجية",
|
|
||||||
"backgroundJungleCanopyText": "رؤوس الأشجار الاستوائية",
|
|
||||||
"backgroundJungleCanopyNotes": "تشمس في الروعة الساخنة في رؤوس الأشجار الاستوائية.",
|
|
||||||
"backgroundProductivityPlazaNotes": "قم بنزهة ملهمة في ساحة الإنتاجية في مدينة حابيت.",
|
|
||||||
"backgroundFlyingOverAnAutumnForestNotes": "انظر إلى الألوان الرائعة أسفلك أثناء التحليق فوق الغابة الخريفية.",
|
|
||||||
"backgroundFlyingOverAnAutumnForestText": "التحليق فوق الغابة الخريفية",
|
|
||||||
"backgrounds092020": "المجموعة 76: صدرت في سبتمبر 2020",
|
|
||||||
"backgroundGiantAutumnLeafNotes": "اجثم على ورقة عملاقة قبل أن تسقط.",
|
|
||||||
"backgroundGiantAutumnLeafText": "ورقة عملاقة",
|
|
||||||
"backgroundHerdingSheepInAutumnNotes": "اختلط بالقطيع من الأغنام.",
|
|
||||||
"backgroundHerdingSheepInAutumnText": "قطيع من الأغنام",
|
|
||||||
"backgrounds102020": "المجموعة 77: صدرت في اكتوبر 2020",
|
|
||||||
"backgroundGingerbreadHouseText": "بيت كعك الزنجبيل",
|
|
||||||
"backgroundSpookyScarecrowFieldText": "حقل الفزاعة المخيفة",
|
|
||||||
"backgroundRiverOfLavaText": "نهر من الحمم البركانية",
|
|
||||||
"backgroundMysticalObservatoryText": "مرصد باطني",
|
|
||||||
"backgroundCrescentMoonNotes": "قم بعمل الأحلام وأنت جالس على الهلال.",
|
|
||||||
"backgroundHauntedForestText": "غابة مسكونة",
|
|
||||||
"backgroundRiverOfLavaNotes": "تحدى الحمل الحراري وتجول على طول نهر الحمم البركانية.",
|
|
||||||
"backgroundHauntedForestNotes": "حاول ألا تضيع في الغابة المسكونة.",
|
|
||||||
"backgroundCrescentMoonText": "هلال",
|
|
||||||
"backgroundSpookyScarecrowFieldNotes": "أثبت أنك أكثر شجاعة من الطائر بالذهاب إلى حقل الفزاعة المخيفة.",
|
|
||||||
"backgrounds112020": "المجموعة 78: صدرت في نوفمبر 2020",
|
|
||||||
"backgroundMysticalObservatoryNotes": "اقرأ مصيرك في النجوم من المرصد الباطني.",
|
|
||||||
"backgroundRestingInTheInnNotes": "اعمل براحة وأمان في غرفتك أثناء الراحة في النزل.",
|
|
||||||
"backgroundRestingInTheInnText": "الراحة في النزل",
|
|
||||||
"backgrounds122020": "المجموعة 79: صدرت في ديسمبر 2020",
|
|
||||||
"backgroundGingerbreadHouseNotes": "تحيط علما بالمشاهد والروائح و(إن كنت تجرؤ) النكهات بيت كعك الزنجبيل.",
|
|
||||||
"backgroundIcicleBridgeNotes": "اعبر الجسر الجليدي بحذر.",
|
|
||||||
"backgroundIcicleBridgeText": "جسر جليدي",
|
|
||||||
"backgroundInsideAnOrnamentText": "داخل حلية العطلة",
|
|
||||||
"backgroundWintryCastleNotes": "انظر إلى القلعة الشتوية التي تقع داخل الضباب البارد.",
|
|
||||||
"backgroundHolidayHearthText": "مدفأة احتفالية",
|
|
||||||
"backgrounds022021": "المجموعة 81: صدرت في فبراير 2021",
|
|
||||||
"backgroundFlyingOverGlacierText": "تحلق فوق نهر جليدي",
|
|
||||||
"backgrounds012021": "المجموعة 80: صدرت في يناير 2021",
|
|
||||||
"backgroundWintryCastleText": "قلعة شتوية",
|
|
||||||
"backgroundHotSpringNotes": "تخلص من همومك عن طريق الراحة في ينبوع حار.",
|
|
||||||
"backgroundHotSpringText": "ينبوع حار",
|
|
||||||
"backgroundHolidayHearthNotes": "استرخ ، دفئ نفسكَ وجفف نفسك بجانب مدفأة احتفالية.",
|
|
||||||
"backgroundInsideAnOrnamentNotes": "دع روح العطلة الخاصة بك تتألق من داخل حلية العطلة.",
|
|
||||||
"backgroundFlyingOverGlacierNotes": "شاهد المشهد المهيب وأنت تحلق فوق نهر جليدي.",
|
|
||||||
"backgroundHeartShapedBubblesText": "فقاعات على شكل قلب",
|
|
||||||
"backgroundHeartShapedBubblesNotes": "اطف بمرح بين الفقاعات على شكل قلب.",
|
|
||||||
"backgrounds032021": "المجموعة 82: صدرت في مارس 2021",
|
|
||||||
"backgroundThroneRoomText": "غرفة العرش",
|
|
||||||
"backgroundThroneRoomNotes": "امنح جمهورًا في غرفة العرش الفاخرة الخاصة بك.",
|
|
||||||
"backgroundInTheArmoryText": "في مستودع الأسلحة",
|
|
||||||
"backgroundSplashInAPuddleNotes": "استمتع بآثار العاصفة بالرش في بركة.",
|
|
||||||
"backgroundSpringThawText": "ذوبـان الثلوج في فصل الربيع",
|
|
||||||
"backgroundSpringThawNotes": "شاهد الشتاء يختفي مع ذوبان الثلوج في فصل الربيع.",
|
|
||||||
"backgrounds042021": "المجموعة 83: صدرت في أبريل 2021",
|
|
||||||
"backgroundInTheArmoryNotes": "جهز نفسك في مستودع الأسلحة.",
|
|
||||||
"backgroundSplashInAPuddleText": "الرش في بركة",
|
|
||||||
"backgroundAmongCattailsText": "بين القصب",
|
|
||||||
"backgroundElegantGardenText": "حديقة أنيقة",
|
|
||||||
"backgroundAmongCattailsNotes": "انظر إلى الحياة البرية في الأراضي الرطبة بين القصب.",
|
|
||||||
"backgroundCottageConstructionNotes": "ساعد في, أو على الأقل الإشراف على كوخ قيد الإنشاء.",
|
|
||||||
"backgroundCottageConstructionText": "كوخ قيد الانشاء",
|
|
||||||
"backgroundForestedLakeshoreText": "شاطئ البحيرة الحرجي",
|
|
||||||
"backgroundDragonsLairText": "عرين التنين",
|
|
||||||
"backgroundWaterMillNotes": "شاهد عجلة الطاحونة المائية تدور.",
|
|
||||||
"backgroundGhostShipText": "سفينة الأشباح",
|
|
||||||
"backgrounds062021": "المجموعة 85: صدرت في يونيو 2021",
|
|
||||||
"backgroundWindmillsText": "طواحين الهواء",
|
|
||||||
"backgroundAfternoonPicnicNotes": "استمتع بنزهة بعد الظهر بمفردك أو مع حيوانك الأليف.",
|
|
||||||
"backgroundClotheslineText": "حبل الغسيل",
|
|
||||||
"backgroundUnderwaterAmongKoiNotes": "أبهر وانبهر بالمخلوقات المتلألئة تحت الماء بين أسماك كوي.",
|
|
||||||
"backgrounds052021": "المجموعة 84: صدرت في مايو 2021",
|
|
||||||
"backgrounds072021": "المجموعة 86: صدرت في يوليو 2021",
|
|
||||||
"backgroundGhostShipNotes": "أثبت صحة القصص والأساطير عندما تصعد على متن سفينة الأشباح.",
|
|
||||||
"backgroundElegantGardenNotes": "تجول على طول المسارات المشذبة الجميلة لحديقة أنيقة.",
|
|
||||||
"backgroundForestedLakeshoreNotes": "كن موضع حسد فريقك من خلال موقعك المتميز على شاطئ البحيرة الحرجي.",
|
|
||||||
"backgroundDragonsLairNotes": "حاول ألا تزعج ساكن عرين التنين.",
|
|
||||||
"backgroundAfternoonPicnicText": "نزهة بعد الظهر",
|
|
||||||
"backgroundWaterMillText": "طاحونة مائية",
|
|
||||||
"backgroundClotheslineNotes": "استرخِ بينما تجف الملابس على حبل الغسيل.",
|
|
||||||
"backgroundWindmillsNotes": "استعد لمحاربة أعداء غير مرئيين في طواحين الهواء.",
|
|
||||||
"backgroundUnderwaterAmongKoiText": "تحت الماء بين أسماك كوي",
|
|
||||||
"backgroundRagingRiverText": "نهر هائج",
|
|
||||||
"backgroundRagingRiverNotes": "قف وسط التيار العظيم لنهر هائج.",
|
|
||||||
"backgrounds082021": "المجموعة 87: صدرت في أغسطس 2021",
|
|
||||||
"backgroundStoneTowerText": "برج حجري",
|
|
||||||
"backgroundStoneTowerNotes": "انظر من حاجز البرج الحجري إلى آخر.",
|
|
||||||
"backgroundRopeBridgeText": "جسر الحبل",
|
|
||||||
"backgroundDaytimeMistyForestText": "غابة ضبابية",
|
|
||||||
"backgroundRopeBridgeNotes": "أظهر للمشككين أن جسر الحبل هذا آمن تمامًا.",
|
|
||||||
"backgrounds092021": "المجموعة 88: صدرت في سبتمبر 2021",
|
|
||||||
"backgroundVineyardText": "مزرعة العنب",
|
|
||||||
"backgroundAutumnPoplarsText": "غابة الحور الخريفية",
|
|
||||||
"backgroundDaytimeMistyForestNotes": "تشمس بأشعة الضوء المشرقة من خلال الغابة الضبابية.",
|
|
||||||
"backgroundVineyardNotes": "استكشف مساحة من مزرعة العنب المثمرة.",
|
|
||||||
"backgroundAutumnLakeshoreText": "شاطئ البحيرة الخريفية",
|
|
||||||
"backgrounds102021": "المجموعة 89: صدرت في اكتوبر 2021",
|
|
||||||
"backgroundAutumnLakeshoreNotes": "توقف عند شاطئ البحيرة الخريفية لتقدير انعكاس الغابة على الماء.",
|
|
||||||
"backgroundAutumnPoplarsNotes": "استمتع بالدرجات اللامعة من اللون البني والذهبي في غابة الحور الخريفية.",
|
|
||||||
"backgrounds122021": "المجموعة 91: صدرت في ديسمبر 2021",
|
|
||||||
"backgrounds112021": "المجموعة 90: صدرت في نوفمبر 2021",
|
|
||||||
"backgroundFortuneTellersShopText": "محل العرافة",
|
|
||||||
"backgroundFortuneTellersShopNotes": "ابحث عن تلميحات مغرية لمستقبلك في محل العرافة.",
|
|
||||||
"backgroundInsideAPotionBottleText": "داخل زجاجة الجرعة السحرية",
|
|
||||||
"backgroundInsideAPotionBottleNotes": "انظر عبر الزجاج بينما تأمل في الإنقاذ من داخل زجاجة الجرعة السحرية.",
|
|
||||||
"backgroundSpiralStaircaseText": "درج حلزوني",
|
|
||||||
"backgroundSpiralStaircaseNotes": "اصعد ، انزل ، واذهب حول الدرج الحلزوني.",
|
|
||||||
"backgroundCrypticCandlesText": "شموع خفية",
|
|
||||||
"backgroundCrypticCandlesNotes": "استدع قوى غامضة بين الشموع الخفية.",
|
|
||||||
"backgroundHauntedPhotoText": "صورة مسكونة",
|
|
||||||
"backgroundHauntedPhotoNotes": "تجد نفسك محاصرًا في عالم أحادي اللون لصورة مسكونة.",
|
|
||||||
"backgroundUndeadHandsText": "أيدي الزومبي",
|
|
||||||
"backgroundUndeadHandsNotes": "حاول الهروب من براثن أيدي الزومبي."
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,7 +91,7 @@
|
|||||||
"weaponSpecialTakeThisText": "Take This Sword",
|
"weaponSpecialTakeThisText": "Take This Sword",
|
||||||
"weaponSpecialTakeThisNotes": "This sword was earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.",
|
"weaponSpecialTakeThisNotes": "This sword was earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.",
|
||||||
"weaponSpecialTridentOfCrashingTidesText": "ترايدنت الأمواج المتضاربة",
|
"weaponSpecialTridentOfCrashingTidesText": "ترايدنت الأمواج المتضاربة",
|
||||||
"weaponSpecialTridentOfCrashingTidesNotes": "يمنحك القدرة على التحكم بالأسماك، وكذلك القدرة على توجيه بعض الطعنات القوية لمهماتك. يزيد الذكاء بقدر <%= int %>.",
|
"weaponSpecialTridentOfCrashingTidesNotes": "يمنحك القدرة على التحكم بالأسماك، وكذلك القدرة على تقديم بعض الطعنات القوية لمهماتك. يزيد الذكاء بقدر <%= int %>.",
|
||||||
"weaponSpecialTaskwoodsLanternText": "Taskwoods Lantern",
|
"weaponSpecialTaskwoodsLanternText": "Taskwoods Lantern",
|
||||||
"weaponSpecialTaskwoodsLanternNotes": "Given at the dawn of time to the guardian ghost of the Taskwood Orchards, this lantern can illuminate the deepest darkness and weave powerful spells. Increases Perception and Intelligence by <%= attrs %> each.",
|
"weaponSpecialTaskwoodsLanternNotes": "Given at the dawn of time to the guardian ghost of the Taskwood Orchards, this lantern can illuminate the deepest darkness and weave powerful spells. Increases Perception and Intelligence by <%= attrs %> each.",
|
||||||
"weaponSpecialBardInstrumentText": "Bardic Lute",
|
"weaponSpecialBardInstrumentText": "Bardic Lute",
|
||||||
@@ -117,7 +117,7 @@
|
|||||||
"weaponSpecialYetiText": "رمح مروض اليتي",
|
"weaponSpecialYetiText": "رمح مروض اليتي",
|
||||||
"weaponSpecialYetiNotes": "هذا الرمح يسمح لمستخدمه الصيطرة على أي يتي. يزيد القوة بقدر <%= str %>. معدات الطبعة المحدودة لشتاء 2013-2014.",
|
"weaponSpecialYetiNotes": "هذا الرمح يسمح لمستخدمه الصيطرة على أي يتي. يزيد القوة بقدر <%= str %>. معدات الطبعة المحدودة لشتاء 2013-2014.",
|
||||||
"weaponSpecialSkiText": "عمود المتزلج القاتل",
|
"weaponSpecialSkiText": "عمود المتزلج القاتل",
|
||||||
"weaponSpecialSkiNotes": "سلاح قادر على تدمير المجموعات الكبيرة من الأعداء. وأيضاً يساعد مستخدمه على الانعطافات المتوازية. يزيد القوة بقدر <%= str %>. معدات الطبعة المحدودة لشتاء 2013-2014.",
|
"weaponSpecialSkiNotes": "سلاح قادر على تدمير المجموعات الكبيرة من الأعداء. وأيضاً يساعد مستخدمه على الانعطافات المتوازية. يزيد القوة بقدر <%= str %>. معدات الطبعة المحدودة لشتاء 2013-2014.",
|
||||||
"weaponSpecialCandycaneText": "قضيب حلوى القصب",
|
"weaponSpecialCandycaneText": "قضيب حلوى القصب",
|
||||||
"weaponSpecialCandycaneNotes": "A powerful mage's staff. Powerfully DELICIOUS, we mean! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2013-2014 Winter Gear.",
|
"weaponSpecialCandycaneNotes": "A powerful mage's staff. Powerfully DELICIOUS, we mean! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2013-2014 Winter Gear.",
|
||||||
"weaponSpecialSnowflakeText": "العصا السحرية ذات ندفة الثلج",
|
"weaponSpecialSnowflakeText": "العصا السحرية ذات ندفة الثلج",
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"messageLikesFood": "<%= egg %> يحب <%= foodText %> كثيراً!",
|
"messageLikesFood": "<%= egg %> يحب <%= foodText %> كثيراً!",
|
||||||
"messageDontEnjoyFood": "<%= egg %> يأكل <%= foodText %> ولكنه لا يبدو مستمتعاً.",
|
"messageDontEnjoyFood": "<%= egg %> يأكل <%= foodText %> ولكنه لا يبدو مستمتعاً.",
|
||||||
"messageBought": "لقد اشتريت <%= itemText %>",
|
"messageBought": "لقد اشتريت <%= itemText %>",
|
||||||
"messageUnEquipped": "<%= itemText %> غير مجهز/ة.",
|
"messageUnEquipped": "<%= itemText %> unequipped.",
|
||||||
"messageMissingEggPotion": "تفتقد أيًا من تلك البيضة أو جرعة الفقس.",
|
"messageMissingEggPotion": "تفتقد أيًا من تلك البيضة أو جرعة الفقس.",
|
||||||
"messageInvalidEggPotionCombo": "لا يمكنك فقس بيض حيوانات التنقيب مع جرع فقس سحرية! جرب بيضة أخرى.",
|
"messageInvalidEggPotionCombo": "لا يمكنك فقس بيض حيوانات التنقيب مع جرع فقس سحرية! جرب بيضة أخرى.",
|
||||||
"messageAlreadyPet": "لديك ذلك الحيوان الأليف. حاول فقس تركيبة مختلفة!",
|
"messageAlreadyPet": "لديك ذلك الحيوان الأليف. حاول فقس تركيبة مختلفة!",
|
||||||
@@ -50,7 +50,5 @@
|
|||||||
"unallocatedStatsPoints": "You have <span class=\"notification-bold-blue\"><%= points %> unallocated Stat Points</span>",
|
"unallocatedStatsPoints": "You have <span class=\"notification-bold-blue\"><%= points %> unallocated Stat Points</span>",
|
||||||
"beginningOfConversation": "هذه هي بداية محادثتك مع <%= userName %>. تذكر أن تكون لطيفاً محترماً، واتبع إرشادات المنتدى!",
|
"beginningOfConversation": "هذه هي بداية محادثتك مع <%= userName %>. تذكر أن تكون لطيفاً محترماً، واتبع إرشادات المنتدى!",
|
||||||
"messageDeletedUser": "عذراً، لقد حذف هذا المستخدم حسابه.",
|
"messageDeletedUser": "عذراً، لقد حذف هذا المستخدم حسابه.",
|
||||||
"messageMissingDisplayName": "Missing display name.",
|
"messageMissingDisplayName": "Missing display name."
|
||||||
"messageBattleGearUnEquipped": "المعدات القتالية غير مجهزة.",
|
|
||||||
"messageCostumeUnEquipped": "الزي غير مجهز."
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"quests": "مغامرات",
|
"quests": "التناقيب",
|
||||||
"quest": "مغامرة",
|
"quest": "تنقيب",
|
||||||
"petQuests": "مغامرات للحصول على حيوانات الأليفة ومطايا",
|
"petQuests": "Pet and Mount Quests",
|
||||||
"unlockableQuests": "مغامرات غير قابلة للفتح",
|
"unlockableQuests": "Unlockable Quests",
|
||||||
"goldQuests": "مغامرات ماستركلاسر",
|
"goldQuests": "Masterclasser Quest Lines",
|
||||||
"questDetails": "تفاصيل المغامرة",
|
"questDetails": "تفاصيل المغامرة",
|
||||||
"questDetailsTitle": "تفاصيل المغامرة",
|
"questDetailsTitle": "Quest Details",
|
||||||
"questDescription": "Quests allow players to focus on long-term, in-game goals with the members of their party.",
|
"questDescription": "Quests allow players to focus on long-term, in-game goals with the members of their party.",
|
||||||
"invitations": "الدعوات",
|
"invitations": "الدعوات",
|
||||||
"completed": "اكتملت المغامرة!",
|
"completed": "\t\nمنتهى!",
|
||||||
"rewardsAllParticipants": "Rewards for all Quest Participants",
|
"rewardsAllParticipants": "Rewards for all Quest Participants",
|
||||||
"rewardsQuestOwner": "Additional Rewards for Quest Owner",
|
"rewardsQuestOwner": "Additional Rewards for Quest Owner",
|
||||||
"inviteParty": "Invite Party to Quest",
|
"inviteParty": "Invite Party to Quest",
|
||||||
@@ -71,6 +71,5 @@
|
|||||||
"bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health",
|
"bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health",
|
||||||
"rageAttack": "Rage Attack:",
|
"rageAttack": "Rage Attack:",
|
||||||
"bossRage": "<%= currentRage %> / <%= maxRage %> Rage",
|
"bossRage": "<%= currentRage %> / <%= maxRage %> Rage",
|
||||||
"rageStrikes": "Rage Strikes",
|
"rageStrikes": "Rage Strikes"
|
||||||
"hatchingPotionQuests": "مغامرات للحصول على جرعات سحرية"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"achievement": "Постижение",
|
"achievement": "Постижение",
|
||||||
"onwards": "Напред!",
|
"onwards": "Напред!",
|
||||||
"levelup": "Изпълнявайки целите си в истинския живот, Вие се качихте ниво и здравето Ви беше запълнено!",
|
"levelup": "Изпълнявайки целите си в истинския живот, Вие качихте ниво и здравето Ви беше запълнено!",
|
||||||
"reachedLevel": "Достигнахте Ниво <%= level %>",
|
"reachedLevel": "Достигнахте ниво <%= level %>",
|
||||||
"achievementLostMasterclasser": "Изпълнител на Мисии: Серия на Класовите Повелители",
|
"achievementLostMasterclasser": "Изпълнител на Мисии: Серия на Класовите Повелители",
|
||||||
"achievementLostMasterclasserText": "Завършихте шестнадесетте мисии от Серията на Класовите Повелители и разрешихте загадката на Изгубената Класова Повелителка!",
|
"achievementLostMasterclasserText": "Завършихте шестнадесетте мисии от Серията на Класовите Повелители и разрешихте загадката на Изгубената Класова Повелителка!",
|
||||||
"achievementUndeadUndertaker": "Нежив Погребален Директор",
|
"achievementUndeadUndertaker": "Нежив Погребален Директор",
|
||||||
@@ -59,13 +59,13 @@
|
|||||||
"foundNewItemsExplanation": "Завършека на задачи ви дава шанс да намерите предмети като Яйца, Излюпващи Отвари и Животинска Храна.",
|
"foundNewItemsExplanation": "Завършека на задачи ви дава шанс да намерите предмети като Яйца, Излюпващи Отвари и Животинска Храна.",
|
||||||
"foundNewItems": "Намерихте нови предмети!",
|
"foundNewItems": "Намерихте нови предмети!",
|
||||||
"hideAchievements": "Скрий <%= category %>",
|
"hideAchievements": "Скрий <%= category %>",
|
||||||
"showAllAchievements": "Покажи Всички <%=category %>",
|
"showAllAchievements": "Покажи Всички",
|
||||||
"onboardingCompleteDescSmall": "Ако желаете още повече, отидете в Постижения и започнете колекционирането!",
|
"onboardingCompleteDescSmall": "Ако желаете още повече, отидете в Постижения и започнете събирането!",
|
||||||
"onboardingCompleteDesc": "Получихте <strong>5 Постижения</strong> и <strong class=\"gold-amount\">100 Злато</strong> за завършения списък.",
|
"onboardingCompleteDesc": "Получихте <strong>5 Постижения</strong> и <strong class=\"gold-amount\">100 Злато</strong> за завършения списък.",
|
||||||
"onboardingComplete": "Завършихте уводните си задачи!",
|
"onboardingComplete": "Завършихте задачите си!",
|
||||||
"earnedAchievement": "Получихте постижение!",
|
"earnedAchievement": "Получихте постижение!",
|
||||||
"yourProgress": "Вашият Напредък",
|
"yourProgress": "Вашият Напредък",
|
||||||
"gettingStartedDesc": "Изпълнете тези уводни задачи и ще получите <strong>5 Постижения </strong> и <strong class=\"gold-amount\">100 Злато </strong>при завършване!",
|
"gettingStartedDesc": "Изпълнете задачите и ще получите <strong>5 Постижения </strong> и <strong class=\"gold-amount\">100 Злато </strong>при завършване!",
|
||||||
"achievementPrimedForPaintingModalText": "Събрахте всички Бели Животни!",
|
"achievementPrimedForPaintingModalText": "Събрахте всички Бели Животни!",
|
||||||
"achievementPearlyProModalText": "Опитомихте всички Бели Оседлани Зверове!",
|
"achievementPearlyProModalText": "Опитомихте всички Бели Оседлани Зверове!",
|
||||||
"achievementPearlyProText": "Опетомили са всички Оседлани Зверове.",
|
"achievementPearlyProText": "Опетомили са всички Оседлани Зверове.",
|
||||||
@@ -75,13 +75,13 @@
|
|||||||
"achievementFedPet": "Нахрани Животно",
|
"achievementFedPet": "Нахрани Животно",
|
||||||
"achievementHatchedPetModalText": "Отиди в инвентара си и смеси излюпваща отвара с Яйце",
|
"achievementHatchedPetModalText": "Отиди в инвентара си и смеси излюпваща отвара с Яйце",
|
||||||
"achievementHatchedPet": "Излюпи Животно",
|
"achievementHatchedPet": "Излюпи Животно",
|
||||||
"viewAchievements": "Прегледай Постижения",
|
"viewAchievements": "Постижения",
|
||||||
"letsGetStarted": "Нека да започнем!",
|
"letsGetStarted": "Нека да започнем!",
|
||||||
"onboardingProgress": "<%= percentage %>% напредък",
|
"onboardingProgress": "<%= percentage %>% напредък",
|
||||||
"achievementBareNecessitiesModalText": "Завършихте мисиите за Маймуна, Ленивец и Фиданка!",
|
"achievementBareNecessitiesModalText": "Завършихте мисиите за Маймуна, Ленивец и Фиданка!",
|
||||||
"achievementBareNecessitiesText": "Завършили са всички мисии за Маймуна, Ленивец и Фиданка.",
|
"achievementBareNecessitiesText": "Завършили са всички мисии за Маймуна, Ленивец и Фиданка.",
|
||||||
"achievementBareNecessities": "От първа необходимост",
|
"achievementBareNecessities": "От първа необходимост",
|
||||||
"achievementBoneCollectorText": "Събрали са всички Скелетни Любимци.",
|
"achievementBoneCollectorText": "Събрали сте всички Скелети домашни любимци.",
|
||||||
"achievementBoneCollector": "Колекционер на кости",
|
"achievementBoneCollector": "Колекционер на кости",
|
||||||
"achievementAllThatGlittersModalText": "Събрахте всички оседлани Златни животни!",
|
"achievementAllThatGlittersModalText": "Събрахте всички оседлани Златни животни!",
|
||||||
"achievementAllThatGlittersText": "Събрали сте всички оседлани Златни животни.",
|
"achievementAllThatGlittersText": "Събрали сте всички оседлани Златни животни.",
|
||||||
@@ -92,19 +92,5 @@
|
|||||||
"achievementFreshwaterFriendsModalText": "Завършихте мисиите за аксолотъла, жабата и хипопотама!",
|
"achievementFreshwaterFriendsModalText": "Завършихте мисиите за аксолотъла, жабата и хипопотама!",
|
||||||
"achievementFreshwaterFriendsText": "Завършили сте мисиите за домашни любимци за аксолотъла, жабата и хипопотама.",
|
"achievementFreshwaterFriendsText": "Завършили сте мисиите за домашни любимци за аксолотъла, жабата и хипопотама.",
|
||||||
"achievementFreshwaterFriends": "Сладководни приятели",
|
"achievementFreshwaterFriends": "Сладководни приятели",
|
||||||
"yourRewards": "Вашите Награди",
|
"yourRewards": "Вашите възнаграждения"
|
||||||
"achievementBoneCollectorModalText": "Събрали сте всичките Скелетни Любимци!",
|
|
||||||
"achievementRedLetterDay": "Червен Празник",
|
|
||||||
"achievementLegendaryBestiary": "Легендарен Бестиарий",
|
|
||||||
"achievementLegendaryBestiaryText": "Излюпили са всички стандартни цветови разновидности на Митичните животни: Дракон, Летящо прасе, Грифон, Водна змия и Еднорог!",
|
|
||||||
"achievementLegendaryBestiaryModalText": "Събрали сте всички Митичн любимци!",
|
|
||||||
"achievementSkeletonCrewModalText": "Събрали сте всички Скелетни животни!",
|
|
||||||
"achievementSeeingRed": "Виждам червено",
|
|
||||||
"achievementSkeletonCrew": "Скелетен екипаж",
|
|
||||||
"achievementSeeingRedText": "Събрали са всичк Червени любимци.",
|
|
||||||
"achievementRedLetterDayModalText": "Събрали сте всички Червени животни!",
|
|
||||||
"achievementSeasonalSpecialist": "Сезонен експерт",
|
|
||||||
"achievementRedLetterDayText": "Са събрали всички Червени животни.",
|
|
||||||
"achievementSeeingRedModalText": "Събрали сте всички Червени любимци!",
|
|
||||||
"achievementSkeletonCrewText": "Събрали са всички Скелетни животни."
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1 @@
|
|||||||
{
|
{}
|
||||||
"achievement": "Kadaugan",
|
|
||||||
"onwards": "Padayon!",
|
|
||||||
"levelup": "Sa pagbuhat sa imong tumong sa kinabuhi, mitaas ang imong nibel ug nahanaw ang imong sakit nga gibati.",
|
|
||||||
"reachedLevel": "Nakamtan mo ang Nibel <%= level %>",
|
|
||||||
"yourRewards": "Imong Daog"
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -106,14 +106,5 @@
|
|||||||
"achievementLegendaryBestiaryModalText": "Posbíral/a jsi všechny mytické mazlíčky!",
|
"achievementLegendaryBestiaryModalText": "Posbíral/a jsi všechny mytické mazlíčky!",
|
||||||
"achievementLegendaryBestiaryText": "Posbíral/a všechny mytické mazlíčky: draka, létající prase, gryfona, mořského hada a jednorožce!",
|
"achievementLegendaryBestiaryText": "Posbíral/a všechny mytické mazlíčky: draka, létající prase, gryfona, mořského hada a jednorožce!",
|
||||||
"achievementLegendaryBestiary": "Legendární bestiář",
|
"achievementLegendaryBestiary": "Legendární bestiář",
|
||||||
"achievementSeasonalSpecialist": "Sezónní specialista",
|
"achievementSeasonalSpecialist": "Sezónní specialista"
|
||||||
"achievementVioletsAreBlueText": "Posbíral/a všechny mazlíčky z Modré Cukrové Vaty.",
|
|
||||||
"achievementVioletsAreBlue": "Fialky jsou Modré",
|
|
||||||
"achievementVioletsAreBlueModalText": "Posbíral/a jsi všechny mazlíčky z Modré Cukrové Vaty.",
|
|
||||||
"achievementSeasonalSpecialistModalText": "Dokončl/a jsi všechny sezónní úkoly!",
|
|
||||||
"achievementDomesticatedModalText": "Sesbíral/a jsi všechna domácí zvířata!",
|
|
||||||
"achievementSeasonalSpecialistText": "Dokončil/a jsi všechny Jarní a Zimní sezónní úkoly: Honba za vajíčky, Pastičkář Santa, a najdi Cuba!",
|
|
||||||
"achievementWildBlueYonderText": "Ochočil/a všechny zvířata z Modré Cukrové Vaty.",
|
|
||||||
"achievementWildBlueYonderModalText": "Ochočil/a jsi všechny mazlíčky z Modré Cukrové Vaty!",
|
|
||||||
"achievementDomesticatedText": "Vylíhl/a všechna standardní zbarvení domácích zvířat: Fretka, morče, kohout, létající prasátko, krysa, králík, kůň a kráva!"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -740,10 +740,5 @@
|
|||||||
"backgroundAmongGiantMushroomsNotes": "Bewundere Riesige Pilze.",
|
"backgroundAmongGiantMushroomsNotes": "Bewundere Riesige Pilze.",
|
||||||
"backgroundAmongGiantMushroomsText": "Unter Riesigen Pilzen",
|
"backgroundAmongGiantMushroomsText": "Unter Riesigen Pilzen",
|
||||||
"backgroundMistyAutumnForestText": "Nebeliger Herbstwald",
|
"backgroundMistyAutumnForestText": "Nebeliger Herbstwald",
|
||||||
"backgroundMistyAutumnForestNotes": "Durchstreife einen nebeligen Herbstwald.",
|
"backgroundMistyAutumnForestNotes": "Durchstreife einen nebeligen Herbstwald."
|
||||||
"backgroundAutumnBridgeText": "Brücke im Herbst",
|
|
||||||
"backgroundAutumnBridgeNotes": "Bewundere die Schönheit einer Brücke im Herbst.",
|
|
||||||
"backgrounds122022": "Set 103: Veröffentlicht im Dezember 2022",
|
|
||||||
"backgroundBranchesOfAHolidayTreeText": "Äste eines Festtagsbaums",
|
|
||||||
"backgroundBranchesOfAHolidayTreeNotes": "Baumle auf den Ästen eines Festtagsbaums."
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,12 +235,5 @@
|
|||||||
"fall2022HarpyMageSet": "Harpyie (Magier)",
|
"fall2022HarpyMageSet": "Harpyie (Magier)",
|
||||||
"fall2022WatcherHealerSet": "Beobachter (Heiler)",
|
"fall2022WatcherHealerSet": "Beobachter (Heiler)",
|
||||||
"gemSaleHow": "Kauf einfach zwischen <%= eventStartMonth %> <%= eventStartOrdinal %>und <%= eventEndOrdinal %> eines der Edelstein-Pakete wie normal und Deinem Konto werden automatisch die zusätzlichen Edelsteine gutgeschrieben. Das heißt insgesamt mehr Edelsteine zum ausgeben, teilen oder ansparen für zukünftige Veröffentlichungen!",
|
"gemSaleHow": "Kauf einfach zwischen <%= eventStartMonth %> <%= eventStartOrdinal %>und <%= eventEndOrdinal %> eines der Edelstein-Pakete wie normal und Deinem Konto werden automatisch die zusätzlichen Edelsteine gutgeschrieben. Das heißt insgesamt mehr Edelsteine zum ausgeben, teilen oder ansparen für zukünftige Veröffentlichungen!",
|
||||||
"gemSaleLimitations": "Dieses Sonderangebot gilt nur während der zeitlich beschränkten Aktion. Die Aktion startet am <%= eventStartOrdinal %>. <%= eventStartMonth %> um 8:00 EDT (12:00 UTC) und endet am <%= eventEndOrdinal %>. <%= eventStartMonth %> um 20:00 PM EDT (00:00 UTC). Das Sonderangebot ist nur verfügbar, wenn Du Edelsteine für Dich selbst kaufst.",
|
"gemSaleLimitations": "Dieses Sonderangebot gilt nur während der zeitlich beschränkten Aktion. Die Aktion startet am <%= eventStartOrdinal %>. <%= eventStartMonth %> um 8:00 EDT (12:00 UTC) und endet am <%= eventEndOrdinal %>. <%= eventStartMonth %> um 20:00 PM EDT (00:00 UTC). Das Sonderangebot ist nur verfügbar, wenn Du Edelsteine für Dich selbst kaufst."
|
||||||
"winter2023WalrusWarriorSet": "Walross (Krieger)",
|
|
||||||
"winter2023FairyLightsMageSet": "Feenlichter (Magier)",
|
|
||||||
"winter2023CardinalHealerSet": "Kardinal (Heiler)",
|
|
||||||
"dateStartFebruary": "8. Februar",
|
|
||||||
"anniversaryLimitedDates": "30. Januar bis 8. Februar",
|
|
||||||
"limitedEvent": "Limitiertes Event",
|
|
||||||
"winter2023RibbonRogueSet": "Schleife (Schurke)"
|
|
||||||
}
|
}
|
||||||
|
|||||||