Compare commits

..

45 Commits

Author SHA1 Message Date
Sabe Jones c54ce96033 4.37.0 2018-04-11 01:37:46 +00:00
Sabe Jones 85c4e93763 chore(i18n): update locales 2018-04-11 01:37:27 +00:00
SabreCat 25e5e78373 chore(sprites): compile 2018-04-11 01:33:15 +00:00
SabreCat 06181d0a1a feat(content): Squirrel Pet Quest 2018-04-11 01:32:49 +00:00
Matteo Pagliazzi d5a8259fdb fix members modals (#10240) 2018-04-10 13:27:06 +02:00
Sabe Jones 4d67df4da6 4.36.0 2018-04-05 21:09:10 +00:00
Sabe Jones ab7459f4f3 chore(i18n): update locales 2018-04-05 21:08:53 +00:00
SabreCat 469db7c0e2 Merge branch 'develop' into release 2018-04-05 21:04:11 +00:00
SabreCat 952e813b30 feat(event): avatar customizations 2018-04-05 21:03:57 +00:00
Matteo Pagliazzi f04d05fee1 fix likes appearing immediately in chat 2018-04-05 20:54:20 +02:00
SabreCat 6d9aa43c07 fix(purchasing): typo "substract" 2018-04-03 20:30:54 +00:00
Sabe Jones f527221079 Merge branch 'release' into develop 2018-04-03 18:49:37 +00:00
Keith Holliday ab14312368 Group plan landing page (#10222)
* Updated task page styles

* Added initial page styles

* Added login and payments

* Updated more styles

* Added white header

* Added group plan overview modal

* Updated copy

* Fixed location

* Style updates

* Added analytics

* More style updates

* Added locales

* Removed duplicate key
2018-04-03 11:26:08 -05:00
Sabe Jones 690d3e3fd2 Merge branch 'release' into develop 2018-04-03 00:55:28 +00:00
Keith Holliday 63a04f36c9 Added guilds to allowed banned words 2018-04-02 17:36:57 -05:00
Keith Holliday e58af6e3ea Replaced siena with admin 2018-04-02 17:35:26 -05:00
Keith Holliday 6ba28b5757 Added fix for chat revoke creation test (#10218) 2018-04-02 19:11:30 +02:00
Keith Holliday ed607d2bae Fixed challenge count check (#10215) 2018-04-01 16:54:32 -05:00
Keith Holliday 1f7fc594e5 Added supression support for pet/mount modals and added mount modal (#9882)
* Added supression support for pet/mount modals and added mount modal

* Moved create animal

* Fixed raise pet logic

* Added suppresion for stable hatch modal

* Fixed click paw and added growl

* Fixed confirm. Fixed mount name

* Suppresed confirmation
2018-04-01 14:43:18 -05:00
Alys 45d0a4fac2 add a second test swear word and slur - TRIGGER / CONTENT WARNING: assault, slurs, swearwords, etc 2018-04-01 19:58:23 +10:00
Sabe Jones e50bc189aa Merge branch 'release' into develop 2018-04-01 03:55:40 +00:00
Philip Karpiak 4623bcd877 Force menu links to have white color on :hover (#10200)
This is mostly to fix the contact form link under the Help menu inheriting the wrong color on hover due to missing href attribute
2018-03-31 13:48:41 +02:00
Alys 4a368a1128 supply the correct type and path for featured Magic Hatching Potions - fixes #10135 (#10204) 2018-03-31 13:46:51 +02:00
Alys bec8cb01e0 prevents a user who has had their chat privileges revoked from creating a public guild (#10205) 2018-03-31 13:46:14 +02:00
negue f3c041a561 antidote display and functionality (#10199)
* update antidote display and functionality - fixes #9758 and #10160

update antidote display and functionality - fixes #9758 and #10160

update antidote display and functionality - fixes #9758 and #10160

update antidote display and functionality - fixes #9758 and #10160

* clean up / refactor

* prevent unpin of all items which don't have a pinType

* remove the double boolean casting / fix lint
2018-03-31 13:39:26 +02:00
Mateus Etto c21726ec61 No Ethereal Surge on Mages (#10121)
* problem location identified (breaks code)

* problem identification notes

* Add class checking to ES (does not yet notify user)

* Add error message

* Add .gitattributes

Attempting to fix line ending disaster

* package stuff

so I can see what's broken

* add reminder and hopefully fix gitattributes

* Fix lint errors

* Redo surge fail notifs

* exterminate rogue comment, fix gitattributes

* Remove unused import 

As per @paglias' request.

* fix(lint): remove extraneous expression

* Delete .gitattributes

* Fix skill key surge -> mpheal

* Show notification only when there are mages in party

* Fix notification being too big and appearing outside the notification div

* Remove unused code

* Only show the notification on parties with 2 or more mages

The caster is a mage, so certainly at least 1 mage will be counted.

* Automated test: mpheal does not heal other mages

* Fix lint error

* Fix typo in test description

* Increase performance of test

* Using target instead of requestion partyMembers again

* Rename variable 'party' to 'partyMembers'

* Update strings in English

* spell -> Skill
2018-03-31 13:34:39 +02:00
Alys df69208caa prevent a user with no chat privileges from inviting any player to a guild or party (#10194)
This is because they could use private group chat messages to bypass
the restriction on talking to other players.
2018-03-31 13:29:08 +02:00
negue 08d07cdd67 split profile and profileStats (#10185) 2018-03-31 13:22:17 +02:00
Philip Karpiak a309e48183 Remove Like action from inbox chat messages (#10181)
There is no API endpoint for this action and seems rather useless for private messages anyway
2018-03-31 13:20:41 +02:00
Clay Smith 70c539cc81 (fixes #9978) Remove Leader dropdown from groupFormModal (#10176) 2018-03-31 13:17:10 +02:00
negue 11f136ac89 Purchase API Refactoring: Armoire (#10153)
* convert armoire

* fix armoire tests

* fix lint
2018-03-31 13:10:37 +02:00
negue 567d5f74ba Purchase API Refactoring: Health Potion (#10152)
* convert buyHealthPotion

* fix health potion tests

* fix lint
2018-03-31 13:09:16 +02:00
Alys 338781f57b improves rounding for boss hp and player pending damage - partial fix for #8368 (#9749)
* improves rounding for boss hp and player pending damage

* use floor filter function for user's pending damage for party page and tavern boss
2018-03-31 12:57:37 +02:00
Matteo Pagliazzi bd07f3cd38 disable test failing on travis 2018-03-31 12:20:11 +02:00
Alys 0b735abd44 remove underscores from test swear words and slurs - TRIGGER / CONTENT WARNING: assault, slurs, swearwords, etc
This is because real words don't contain them and the test words should mimic real words.
2018-03-31 18:06:04 +10:00
Alys a88cdaf1fc Revert "Move notification snackbars when resting bar is shown (#10177)" (#10203)
This reverts commit 64e86bad91
because the console was showing errors like this:

[Vue warn]: Error in render: "TypeError: this.user is null"
found in
---> <App> at website/client/app.vue
       <Root>
2018-03-31 15:15:13 +10:00
Neel Mehta 7cae5f1a37 fix featured quests label under butterfly (#10197) 2018-03-30 15:39:33 -05:00
Neel Mehta e453330535 Make modal overlay transparent, not solid purple (#10191) 2018-03-30 15:38:22 -05:00
Philip Karpiak b1e5fcdeaf Focus title input of task modal when shown (#10182) 2018-03-30 15:35:59 -05:00
Philip Karpiak 10e0848a5c Use margin offsets for group plan header (#10180)
So there are no whitespaces around the header
2018-03-30 15:34:46 -05:00
Philip Karpiak 64e86bad91 Move notification snackbars when resting bar is shown (#10177)
Allows top-most notification to still be shown
2018-03-30 15:34:06 -05:00
Gabriel Siedler 21cf5d2321 fixes #10173 - Task page search bar only searches task titles, not No… (#10175)
* fixes #10173 - Task page search bar only searches task titles, not Notes (#10173)

* Fixing unit test: Test expect task to have note, but it has notes.
2018-03-30 15:30:15 -05:00
Matteo Pagliazzi a6106a801b try fix for test 2018-03-30 19:31:35 +02:00
Sabe Jones a0803796b2 Merge branch 'release' into develop 2018-03-30 17:03:39 +00:00
Matteo Pagliazzi 10370ea1dc fix wording on admin tools 2018-03-30 18:27:20 +02:00
374 changed files with 10367 additions and 7376 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ RUN npm install -g gulp-cli mocha
# Clone Habitica repo and install dependencies
RUN mkdir -p /usr/src/habitrpg
WORKDIR /usr/src/habitrpg
RUN git clone --branch v4.35.0 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg
RUN git clone --branch v4.36.0 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg
RUN npm install
RUN gulp build:prod --force
+21 -9
View File
@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.35.1",
"version": "4.37.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -151,7 +151,7 @@
},
"@sinonjs/formatio": {
"version": "2.0.0",
"resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
"resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
"integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==",
"dev": true,
"requires": {
@@ -3565,7 +3565,7 @@
},
"compression": {
"version": "1.7.2",
"resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
"integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
"requires": {
"accepts": "1.3.5",
@@ -5628,7 +5628,7 @@
"dependencies": {
"onetime": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
}
}
@@ -6208,6 +6208,18 @@
"requires": {
"eslint-plugin-lodash": "2.6.1",
"eslint-plugin-mocha": "4.12.1"
},
"dependencies": {
"eslint-plugin-mocha": {
"version": "4.12.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.12.1.tgz",
"integrity": "sha512-hxWtYHvLA0p/PKymRfDYh9Mxt5dYkg2Goy1vZDarTEEYfELP9ksga7kKG1NUKSQy27C8Qjc7YrSWTLUhOEOksA==",
"dev": true,
"optional": true,
"requires": {
"ramda": "0.25.0"
}
}
}
},
"eslint-friendly-formatter": {
@@ -6305,9 +6317,9 @@
}
},
"eslint-plugin-mocha": {
"version": "4.12.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.12.1.tgz",
"integrity": "sha512-hxWtYHvLA0p/PKymRfDYh9Mxt5dYkg2Goy1vZDarTEEYfELP9ksga7kKG1NUKSQy27C8Qjc7YrSWTLUhOEOksA==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.0.0.tgz",
"integrity": "sha512-mpRWWsjxRco2bY4qE5DL8SmGoVF0Onb6DZrbgOjFoNo1YNN299K2voIozd8Kce3qC/neWNr2XF27E1ZDMl1yZg==",
"dev": true,
"requires": {
"ramda": "0.25.0"
@@ -6386,7 +6398,7 @@
},
"event-stream": {
"version": "3.3.4",
"resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
"requires": {
"duplexer": "0.1.1",
@@ -15848,7 +15860,7 @@
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "http://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"requires": {
"pinkie": "2.0.4"
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.35.1",
"version": "4.37.0",
"main": "./website/server/index.js",
"dependencies": {
"@slack/client": "^3.8.1",
@@ -267,7 +267,7 @@ describe('GET challenges/user', () => {
it('does not page challenges if page parameter is absent', async () => {
const challenges = await user.get('/challenges/user');
expect(challenges.length).to.eql(12);
expect(challenges.length).to.be.above(11);
});
it('paginates challenges', async () => {
@@ -23,8 +23,8 @@ const BASE_URL = nconf.get('BASE_URL');
describe('POST /chat', () => {
let user, groupWithChat, member, additionalMember;
let testMessage = 'Test Message';
let testBannedWordMessage = 'TEST_PLACEHOLDER_SWEAR_WORD_HERE';
let testSlurMessage = 'message with TEST_PLACEHOLDER_SLUR_WORD_HERE';
let testBannedWordMessage = 'TESTPLACEHOLDERSWEARWORDHERE';
let testSlurMessage = 'message with TESTPLACEHOLDERSLURWORDHERE';
let bannedWordErrorMessage = t('bannedWordUsed').split('.');
bannedWordErrorMessage[0] += ` (${removePunctuationFromString(testBannedWordMessage.toLowerCase())})`;
bannedWordErrorMessage = bannedWordErrorMessage.join('.');
@@ -136,6 +136,22 @@ describe('POST /group', () => {
},
});
});
it('returns an error when a user with no chat privileges attempts to create a public guild', async () => {
await user.update({ 'flags.chatRevoked': true });
await expect(
user.post('/groups', {
name: 'Test Public Guild',
type: 'guild',
privacy: 'public',
})
).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('cannotCreatePublicGuildWhenMuted'),
});
});
});
context('private guild', () => {
@@ -163,6 +179,17 @@ describe('POST /group', () => {
});
});
it('creates a private guild when the user has no chat privileges', async () => {
await user.update({ 'flags.chatRevoked': true });
let privateGuild = await user.post('/groups', {
name: groupName,
type: groupType,
privacy: groupPrivacy,
});
expect(privateGuild._id).to.exist;
});
it('deducts gems from user and adds them to guild bank', async () => {
let privateGuild = await user.post('/groups', {
name: groupName,
@@ -201,6 +228,16 @@ describe('POST /group', () => {
});
});
it('creates a party when the user has no chat privileges', async () => {
await user.update({ 'flags.chatRevoked': true });
let party = await user.post('/groups', {
name: partyName,
type: partyType,
});
expect(party._id).to.exist;
});
it('does not require gems to create a party', async () => {
await user.update({ balance: 0 });
@@ -24,6 +24,19 @@ describe('Post /groups/:groupId/invite', () => {
});
describe('user id invites', () => {
it('returns an error when inviter has no chat privileges', async () => {
let inviterMuted = await inviter.update({'flags.chatRevoked': true});
let userToInvite = await generateUser();
await expect(inviterMuted.post(`/groups/${group._id}/invite`, {
uuids: [userToInvite._id],
}))
.to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('cannotInviteWhenMuted'),
});
});
it('returns an error when invited user is not found', async () => {
let fakeID = generateUUID();
@@ -160,6 +173,19 @@ describe('Post /groups/:groupId/invite', () => {
describe('email invites', () => {
let testInvite = {name: 'test', email: 'test@habitica.com'};
it('returns an error when inviter has no chat privileges', async () => {
let inviterMuted = await inviter.update({'flags.chatRevoked': true});
await expect(inviterMuted.post(`/groups/${group._id}/invite`, {
emails: [testInvite],
inviter: 'inviter name',
}))
.to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('cannotInviteWhenMuted'),
});
});
it('returns an error when invite is missing an email', async () => {
await expect(inviter.post(`/groups/${group._id}/invite`, {
emails: [{name: 'test'}],
@@ -321,6 +347,19 @@ describe('Post /groups/:groupId/invite', () => {
});
describe('guild invites', () => {
it('returns an error when inviter has no chat privileges', async () => {
let inviterMuted = await inviter.update({'flags.chatRevoked': true});
let userToInvite = await generateUser();
await expect(inviterMuted.post(`/groups/${group._id}/invite`, {
uuids: [userToInvite._id],
}))
.to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('cannotInviteWhenMuted'),
});
});
it('returns an error when invited user is already invited to the group', async () => {
let userToInvite = await generateUser();
await inviter.post(`/groups/${group._id}/invite`, {
@@ -398,6 +437,19 @@ describe('Post /groups/:groupId/invite', () => {
});
});
it('returns an error when inviter has no chat privileges', async () => {
let inviterMuted = await inviter.update({'flags.chatRevoked': true});
let userToInvite = await generateUser();
await expect(inviterMuted.post(`/groups/${party._id}/invite`, {
uuids: [userToInvite._id],
}))
.to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('cannotInviteWhenMuted'),
});
});
it('returns an error when invited user has a pending invitation to the party', async () => {
let userToInvite = await generateUser();
await inviter.post(`/groups/${party._id}/invite`, {
@@ -187,6 +187,35 @@ describe('POST /user/class/cast/:spellId', () => {
expect(group.chat[0].uuid).to.equal('system');
});
it('Ethereal Surge does not recover mp of other mages', async () => {
let group = await createAndPopulateGroup({
groupDetails: { type: 'party', privacy: 'private' },
members: 4,
});
let promises = [];
promises.push(group.groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 20}));
promises.push(group.members[0].update({'stats.mp': 0, 'stats.class': 'warrior', 'stats.lvl': 20}));
promises.push(group.members[1].update({'stats.mp': 0, 'stats.class': 'wizard', 'stats.lvl': 20}));
promises.push(group.members[2].update({'stats.mp': 0, 'stats.class': 'rogue', 'stats.lvl': 20}));
promises.push(group.members[3].update({'stats.mp': 0, 'stats.class': 'healer', 'stats.lvl': 20}));
await Promise.all(promises);
await group.groupLeader.post('/user/class/cast/mpheal');
promises = [];
promises.push(group.members[0].sync());
promises.push(group.members[1].sync());
promises.push(group.members[2].sync());
promises.push(group.members[3].sync());
await Promise.all(promises);
expect(group.members[0].stats.mp).to.be.greaterThan(0); // warrior
expect(group.members[1].stats.mp).to.equal(0); // wizard
expect(group.members[2].stats.mp).to.be.greaterThan(0); // rogue
expect(group.members[3].stats.mp).to.be.greaterThan(0); // healer
});
it('cast bulk', async () => {
let { group, groupLeader } = await createAndPopulateGroup({
groupDetails: { type: 'party', privacy: 'private' },
+2 -1
View File
@@ -1411,7 +1411,8 @@ describe('Group Model', () => {
expect(updatedParticipatingMember.achievements.lostMasterclasser).to.not.eql(true);
});
it('gives out super awesome Masterclasser achievement when quests done out of order', async () => {
// Disable test, it fails on TravisCI, but only there
xit('gives out super awesome Masterclasser achievement when quests done out of order', async () => {
quest = questScrolls.lostMasterclasser1;
party.quest.key = quest.key;
@@ -145,17 +145,17 @@ describe('Task Column', () => {
tasks = [
{
text: 'Hello world 1',
note: '',
notes: '',
checklist: [],
},
{
text: 'Hello world 2',
note: '',
notes: '',
checklist: [],
},
{
text: 'Generic Task Title',
note: '',
notes: '',
checklist: [
{ text: 'Check 1' },
{ text: 'Check 2' },
@@ -164,7 +164,7 @@ describe('Task Column', () => {
},
{
text: 'Hello world 3',
note: 'Generic Task Note',
notes: 'Generic Task Note',
checklist: [
{ text: 'Checkitem 1' },
{ text: 'Checkitem 2' },
+7 -1
View File
@@ -4,7 +4,7 @@ import {
generateUser,
} from '../../../helpers/common.helper';
import count from '../../../../website/common/script/count';
import buyArmoire from '../../../../website/common/script/ops/buy/buyArmoire';
import {BuyArmoireOperation} from '../../../../website/common/script/ops/buy/buyArmoire';
import randomVal from '../../../../website/common/script/libs/randomVal';
import content from '../../../../website/common/script/content/index';
import {
@@ -33,6 +33,12 @@ describe('shared.ops.buyArmoire', () => {
let YIELD_EXP = 0.9;
let analytics = {track () {}};
function buyArmoire (_user, _req, _analytics) {
const buyOp = new BuyArmoireOperation(_user, _req, _analytics);
return buyOp.purchase();
}
beforeEach(() => {
user = generateUser({
stats: { gp: 200 },
+7 -1
View File
@@ -2,7 +2,7 @@
import {
generateUser,
} from '../../../helpers/common.helper';
import buyHealthPotion from '../../../../website/common/script/ops/buy/buyHealthPotion';
import { BuyHealthPotionOperation } from '../../../../website/common/script/ops/buy/buyHealthPotion';
import {
NotAuthorized,
} from '../../../../website/common/script/libs/errors';
@@ -12,6 +12,12 @@ describe('shared.ops.buyHealthPotion', () => {
let user;
let analytics = {track () {}};
function buyHealthPotion (_user, _req, _analytics) {
const buyOp = new BuyHealthPotionOperation(_user, _req, _analytics);
return buyOp.purchase();
}
beforeEach(() => {
user = generateUser({
items: {
+2 -2
View File
@@ -9,7 +9,7 @@ div
h2 {{$t('tipTitle', {tipNumber: currentTipNumber})}}
p {{currentTip}}
#app(:class='{"casting-spell": castingSpell}')
amazon-payments-modal
amazon-payments-modal(v-if='!isStaticPage')
snackbars
router-view(v-if="!isUserLoggedIn || isStaticPage")
template(v-else)
@@ -111,7 +111,7 @@ div
}
.modal-backdrop.show {
opacity: 1 !important;
opacity: .9 !important;
background-color: $purple-100 !important;
}
@@ -6,28 +6,34 @@
}
.promo_hugabug_bundle {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -284px -244px;
background-position: -532px 0px;
width: 141px;
height: 441px;
}
.promo_mystery_201803 {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -915px -148px;
background-position: -915px -296px;
width: 114px;
height: 90px;
}
.promo_rainbow_potions {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -532px 0px;
background-position: -284px -244px;
width: 141px;
height: 441px;
}
.promo_seasonalshop_spring {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -674px -344px;
background-position: -674px -492px;
width: 162px;
height: 138px;
}
.promo_shimmer_pastel {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -674px -148px;
width: 354px;
height: 147px;
}
.promo_shiny_seeds {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -674px 0px;
@@ -42,7 +48,7 @@
}
.promo_take_this {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -915px -239px;
background-position: -915px -387px;
width: 114px;
height: 87px;
}
@@ -54,7 +60,7 @@
}
.scene_todos {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -674px -148px;
background-position: -674px -296px;
width: 240px;
height: 195px;
}
@@ -6,13 +6,13 @@
}
.quest_armadillo {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -660px;
background-position: -1320px -440px;
width: 219px;
height: 219px;
}
.quest_atom1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1125px -1332px;
background-position: -1376px -1332px;
width: 250px;
height: 150px;
}
@@ -30,13 +30,13 @@
}
.quest_axolotl {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -232px;
background-position: -220px -232px;
width: 219px;
height: 219px;
}
.quest_badger {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px 0px;
background-position: -440px -232px;
width: 219px;
height: 219px;
}
@@ -60,13 +60,13 @@
}
.quest_butterfly {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -452px;
background-position: -220px -452px;
width: 219px;
height: 219px;
}
.quest_cheetah {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -452px;
background-position: -440px -452px;
width: 219px;
height: 219px;
}
@@ -78,7 +78,7 @@
}
.quest_dilatory {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -440px;
background-position: -880px -220px;
width: 219px;
height: 219px;
}
@@ -90,25 +90,25 @@
}
.quest_dilatoryDistress2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1757px -724px;
background-position: -1757px -573px;
width: 150px;
height: 150px;
}
.quest_dilatoryDistress3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -672px;
background-position: -220px -672px;
width: 219px;
height: 219px;
}
.quest_dilatory_derby {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -220px;
background-position: -880px 0px;
width: 219px;
height: 219px;
}
.quest_dustbunnies {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -672px;
background-position: -440px -672px;
width: 219px;
height: 219px;
}
@@ -126,19 +126,19 @@
}
.quest_evilsanta2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -220px;
background-position: -1100px 0px;
width: 219px;
height: 219px;
}
.quest_falcon {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -440px;
background-position: -1100px -220px;
width: 219px;
height: 219px;
}
.quest_ferret {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -660px;
background-position: -1100px -440px;
width: 219px;
height: 219px;
}
@@ -150,19 +150,19 @@
}
.quest_ghost_stag {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -892px;
background-position: -220px 0px;
width: 219px;
height: 219px;
}
.quest_goldenknight1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -892px;
background-position: -220px -892px;
width: 219px;
height: 219px;
}
.quest_goldenknight2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1376px -1332px;
background-position: -874px -1332px;
width: 250px;
height: 150px;
}
@@ -180,13 +180,13 @@
}
.quest_guineapig {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px 0px;
background-position: -1100px -892px;
width: 219px;
height: 219px;
}
.quest_harpy {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -220px;
background-position: -1320px 0px;
width: 219px;
height: 219px;
}
@@ -198,13 +198,13 @@
}
.quest_hippo {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px 0px;
background-position: -660px -892px;
width: 219px;
height: 219px;
}
.quest_horse {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -880px;
background-position: -1320px -660px;
width: 219px;
height: 219px;
}
@@ -216,19 +216,19 @@
}
.quest_lostMasterclasser1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -1112px;
background-position: 0px -1112px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -1112px;
background-position: -220px -1112px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -1112px;
background-position: -1320px -880px;
width: 219px;
height: 219px;
}
@@ -240,19 +240,19 @@
}
.quest_mayhemMistiflying2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -440px;
background-position: -1320px -220px;
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -892px;
background-position: -440px -892px;
width: 219px;
height: 219px;
}
.quest_monkey {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -892px;
background-position: -1100px -660px;
width: 219px;
height: 219px;
}
@@ -264,31 +264,31 @@
}
.quest_moon2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -892px;
background-position: 0px -672px;
width: 219px;
height: 219px;
}
.quest_moon3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px 0px;
background-position: -880px -440px;
width: 219px;
height: 219px;
}
.quest_moonstone1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -672px;
background-position: -660px -220px;
width: 219px;
height: 219px;
}
.quest_moonstone2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -672px;
background-position: -440px 0px;
width: 219px;
height: 219px;
}
.quest_moonstone3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -672px;
background-position: -440px -1112px;
width: 219px;
height: 219px;
}
@@ -306,13 +306,13 @@
}
.quest_owl {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px 0px;
background-position: -880px -892px;
width: 219px;
height: 219px;
}
.quest_peacock {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1540px 0px;
background-position: -1540px -217px;
width: 216px;
height: 216px;
}
@@ -324,19 +324,19 @@
}
.quest_pterodactyl {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -452px;
background-position: -880px -672px;
width: 219px;
height: 219px;
}
.quest_rat {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -452px;
background-position: -660px -672px;
width: 219px;
height: 219px;
}
.quest_rock {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1540px -217px;
background-position: -1540px 0px;
width: 216px;
height: 216px;
}
@@ -348,25 +348,25 @@
}
.quest_sabretooth {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -220px;
background-position: -660px -452px;
width: 219px;
height: 219px;
}
.quest_sheep {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -232px;
background-position: 0px -452px;
width: 219px;
height: 219px;
}
.quest_slime {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -232px;
background-position: -660px 0px;
width: 219px;
height: 219px;
}
.quest_sloth {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px 0px;
background-position: 0px -232px;
width: 219px;
height: 219px;
}
@@ -384,19 +384,19 @@
}
.quest_spider {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -874px -1332px;
background-position: -1125px -1332px;
width: 250px;
height: 150px;
}
.quest_stoikalmCalamity1 {
.quest_squirrel {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1757px -573px;
width: 150px;
height: 150px;
}
.quest_stoikalmCalamity2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -892px;
background-position: 0px -892px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1757px -724px;
width: 150px;
height: 150px;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

@@ -0,0 +1,311 @@
<svg xmlns="http://www.w3.org/2000/svg" width="386" height="200" viewBox="0 0 386 200">
<g fill="none" fill-rule="evenodd">
<g fill="#34313A" opacity=".12">
<path d="M10.811 125.405h86.486v10.811H10.811z"/>
<path d="M21.622 114.595h64.865v10.811H21.622zM0 136.216h108.108v10.811H0z"/>
<path d="M10.811 147.027h86.486v10.811H10.811zM21.622 157.838h64.865v10.811H21.622zM299.459 137.297h64.865v10.811h-64.865zM288.649 148.108h86.486v10.811h-86.486zM299.459 158.919h64.865v10.811h-64.865zM116.014 156.757h156.081v10.811H116.014zM127.162 145.946h133.784v10.811H127.162zM104.865 167.568h178.378v10.811H104.865z"/>
<path d="M116.014 178.378h156.081v10.811H116.014zM138.311 189.189h111.486V200H138.311z"/>
</g>
<path fill="#260F10" d="M32.432 43.243h5.405v5.405h-5.405z"/>
<path fill="#551717" d="M27.027 37.837h5.405v5.405h-5.405zM43.243 43.243h5.405v5.405h-5.405zM43.243 59.46h5.405v5.404h-5.405zM37.838 48.648h5.405V59.46h-5.405zM48.649 48.648H59.46v5.405H48.649zM48.649 64.864H59.46v5.405H48.649z"/>
<path fill="#260F10" d="M37.838 37.837h5.405v5.405h-5.405z"/>
<path fill="#D1B8CB" d="M43.243 37.837h5.405v5.405h-5.405z"/>
<path fill="#EDE4ED" d="M48.649 37.837H59.46v5.405H48.649z"/>
<path fill="#FFF" d="M48.649 43.243H59.46v5.405H48.649z"/>
<path fill="#EDE4ED" d="M37.838 43.243h5.405v5.405h-5.405zM32.432 48.648h5.405v5.405h-5.405zM27.027 54.054h5.405v5.405h-5.405z"/>
<path fill="#D1B8CB" d="M32.432 54.054h5.405v5.405h-5.405z"/>
<path fill="#DFCEDD" d="M32.432 59.46h5.405v5.404h-5.405z"/>
<path fill="#D1C4CE" d="M21.622 70.27h5.405v10.811h-5.405z"/>
<path fill="#DFCEDD" d="M37.838 64.864h5.405v5.405h-5.405z"/>
<path fill="#D1C4CE" d="M32.432 86.486h5.405v5.405h-5.405z"/>
<path fill="#7D4327" d="M37.838 86.486h10.811v5.405H37.838zM43.243 91.891h21.622v5.405H43.243z"/>
<path fill="#5A311D" d="M37.838 81.081h10.811v5.405H37.838zM48.649 86.486H59.46v5.405H48.649z"/>
<path fill="#7D4327" d="M48.649 81.081H59.46v5.405H48.649z"/>
<path fill="#D1C4CE" d="M37.838 91.891h5.405v5.405h-5.405zM32.432 97.297h5.405v5.405h-5.405zM37.838 102.702h5.405v5.405h-5.405z"/>
<path fill="#EDE4ED" d="M48.649 108.108H59.46v5.405H48.649z"/>
<path fill="#FFF" d="M32.432 118.918h5.405v5.405h-5.405zM21.622 118.918h5.405v5.405h-5.405zM16.216 113.513h5.405v5.405h-5.405z"/>
<path fill="#F2E7FE" d="M43.243 113.513h5.405v5.405h-5.405z"/>
<path fill="#EDE4ED" d="M16.216 124.324h-5.405v-5.405h10.81v5.405h16.217v5.406h-5.406v5.405h-5.405v-5.405h-10.81z"/>
<path fill="#F2E7FE" d="M43.243 124.324h21.622v5.405H43.243z"/>
<path fill="#515050" d="M48.649 118.918H59.46v5.405H48.649z"/>
<path fill="#D1B8CB" d="M43.243 102.702h21.622v5.405H43.243z"/>
<path fill="#400702" d="M32.432 91.891h5.405v5.405h-5.405z"/>
<path fill="#5A311D" d="M27.027 113.513h5.405v5.405h-5.405z"/>
<path fill="#400702" d="M37.838 108.108h5.405v5.405h-5.405z"/>
<path fill="#7D4327" d="M27.027 102.703h5.405v5.405h5.406v5.406H27.027z"/>
<path fill="#400702" d="M48.649 113.513H59.46v5.405H48.649z"/>
<path fill="#260F10" d="M27.027 97.297h5.405v5.405h-5.405zM16.216 108.108h5.405v5.405h-5.405zM10.811 113.513h5.405v5.405h-5.405zM5.405 118.918h5.405v5.405H5.405zM10.811 140.54h5.405v5.405h-5.405zM21.622 140.54h5.405v5.405h-5.405zM27.027 145.946h5.405v5.405h-5.405zM48.649 145.946H59.46v5.405H48.649z"/>
<path fill="#A21A16" d="M48.649 140.54H59.46v5.405H48.649zM27.027 140.54h5.405v5.405h-5.405zM10.811 135.135h5.405v5.405h-5.405zM5.405 124.324h5.405v5.405H5.405z"/>
<path fill="#ED3838" d="M10.811 124.324h5.405v5.405h-5.405zM27.027 135.135h5.405v5.405h-5.405z"/>
<path fill="#D82C34" d="M21.622 135.135h5.405v5.405h-5.405zM10.811 129.73h5.405v5.404h-5.405z"/>
<path fill="#ED3838" d="M16.216 129.73h10.811v5.404H16.216z"/>
<path fill="#594D66" d="M48.649 135.135H59.46v5.405H48.649z"/>
<path fill="#D5B9F5" d="M48.649 129.73H59.46v5.404H48.649z"/>
<path fill="#E2D0F6" d="M43.243 129.73h5.405v5.404h-5.405zM37.838 135.135h5.405v5.405h-5.405z"/>
<path fill="#F2E7FE" d="M37.838 129.73h5.405v5.404h-5.405z"/>
<path fill="#D5B9F5" d="M43.243 135.135h5.405v5.405h-5.405z"/>
<path fill="#551717" d="M16.216 135.135h5.405v5.405h-5.405z"/>
<path fill="#260F10" d="M0 124.324h5.405v5.405H0zM5.405 129.73h5.405v10.81H5.405z"/>
<path fill="#373737" d="M27.027 118.918h5.405v5.405h-5.405zM32.432 129.73h5.406v10.81h10.81v5.406h-5.405v5.405h-5.405v-5.405h-5.406zM21.622 102.702h5.405v16.216h-5.405zM37.838 113.514h5.405v5.405h5.406v5.405h-5.406v5.406h-5.405v-10.811h-5.406v-5.405z"/>
<path fill="#260F10" d="M32.432 102.702h5.405v5.405h-5.405zM43.243 108.108h5.405v5.405h-5.405z"/>
<path fill="#400702" d="M37.838 97.297H70.27v5.405H37.838zM27.027 86.486h5.405v5.405h-5.405zM21.622 81.081h5.405v5.405h-5.405zM16.216 70.27h5.405v10.811h-5.405z"/>
<path fill="#EDE4ED" d="M27.027 75.675h5.405v10.811h-5.405z"/>
<path fill="#7D4327" d="M32.432 75.675h5.405v10.811h-5.405z"/>
<path fill="#A21A16" d="M48.649 59.46H59.46v5.404H48.649z"/>
<path fill="#ED3838" d="M48.649 54.054H59.46v5.405H48.649z"/>
<path fill="#D82C34" d="M43.243 54.054h5.405v5.405h-5.405z"/>
<path fill="#A21A16" d="M43.243 48.648h5.405v5.405h-5.405z"/>
<path fill="#D1B8CB" d="M37.838 70.27h5.405v-5.405h5.406v10.811H37.838z"/>
<path fill="#FFF" d="M37.838 59.46h5.405v5.404h-5.405z"/>
<path fill="#D1B8CB" d="M21.622 59.46h10.81v5.405h5.406v5.405H27.027v-5.405h-5.405z"/>
<path fill="#260F10" d="M21.622 54.054h5.405v5.405h-5.405zM27.027 70.27h10.811v5.405H27.027zM37.838 75.675H70.27v5.405H37.838zM16.216 59.46h5.406v5.405h5.405v5.405h-10.81z"/>
<path fill="#551717" d="M16.216 48.648h5.405v5.405h-5.405z"/>
<path fill="#260F10" d="M27.027 48.648h5.405v5.405h-5.405z"/>
<path fill="#551717" d="M21.622 43.243h5.405v5.405h-5.405z"/>
<path fill="#A21A16" d="M21.622 48.648h5.405v5.405h-5.405z"/>
<path fill="#ED3838" d="M27.027 43.243h5.405v5.405h-5.405z"/>
<path fill="#260F10" d="M75.676 43.243H70.27v5.405h5.405z"/>
<path fill="#551717" d="M81.08 37.837h-5.404v5.405h5.405zM64.865 43.243H59.46v5.405h5.405zM64.865 59.46H59.46v5.404h5.405zM70.27 48.648h-5.405V59.46h5.405z"/>
<path fill="#260F10" d="M70.27 37.837h-5.405v5.405h5.405z"/>
<path fill="#D1B8CB" d="M64.865 37.837H59.46v5.405h5.405z"/>
<path fill="#EDE4ED" d="M70.27 43.243h-5.405v5.405h5.405zM75.676 48.648H70.27v5.405h5.405zM81.08 54.054h-5.404v5.405h5.405z"/>
<path fill="#D1B8CB" d="M75.676 54.054H70.27v5.405h5.405z"/>
<path fill="#DFCEDD" d="M75.676 59.46H70.27v5.404h5.405z"/>
<path fill="#D1C4CE" d="M86.487 70.27h-5.405v10.811h5.405z"/>
<path fill="#DFCEDD" d="M70.27 64.864h-5.405v5.405h5.405z"/>
<path fill="#D1C4CE" d="M75.676 86.486H70.27v5.405h5.405z"/>
<path fill="#7D4327" d="M70.27 86.486H59.46v5.405h10.81z"/>
<path fill="#5A311D" d="M70.27 81.081H59.46v5.405h10.81z"/>
<path fill="#D1C4CE" d="M70.27 91.891h-5.405v5.405h5.405zM75.676 97.297H70.27v5.405h5.405zM70.27 102.702h-5.405v5.405h5.405z"/>
<path fill="#FFF" d="M75.676 118.918H70.27v5.405h5.405zM86.487 118.918h-5.405v5.405h5.405zM91.892 113.513h-5.405v5.405h5.405z"/>
<path fill="#F2E7FE" d="M64.865 113.513H59.46v5.405h5.405z"/>
<path fill="#EDE4ED" d="M91.892 124.324h5.405v-5.405h-10.81v5.405H70.27v5.406h5.406v5.405h5.405v-5.405h10.81z"/>
<path fill="#400702" d="M75.676 91.891H70.27v5.405h5.405z"/>
<path fill="#5A311D" d="M81.08 113.513h-5.404v5.405h5.405z"/>
<path fill="#400702" d="M70.27 108.108h-5.405v5.405h5.405z"/>
<path fill="#7D4327" d="M81.081 102.703h-5.405v5.405H70.27v5.406h10.811z"/>
<path fill="#260F10" d="M81.08 97.297h-5.404v5.405h5.405zM91.892 108.108h-5.405v5.405h5.405zM97.297 113.513h-5.405v5.405h5.405zM102.703 118.918h-5.405v5.405h5.405zM97.297 140.54h-5.405v5.405h5.405zM86.487 140.54h-5.405v5.405h5.405zM81.08 145.946h-5.404v5.405h5.405z"/>
<path fill="#A21A16" d="M81.08 140.54h-5.404v5.405h5.405zM97.297 135.135h-5.405v5.405h5.405zM102.703 124.324h-5.405v5.405h5.405z"/>
<path fill="#ED3838" d="M97.297 124.324h-5.405v5.405h5.405zM81.08 135.135h-5.404v5.405h5.405z"/>
<path fill="#D82C34" d="M86.487 135.135h-5.405v5.405h5.405zM97.297 129.73h-5.405v5.404h5.405z"/>
<path fill="#ED3838" d="M91.892 129.73H81.081v5.404h10.811z"/>
<path fill="#E2D0F6" d="M64.865 129.73H59.46v5.404h5.405zM70.27 135.135h-5.405v5.405h5.405z"/>
<path fill="#F2E7FE" d="M70.27 129.73h-5.405v5.404h5.405z"/>
<path fill="#D5B9F5" d="M64.865 135.135H59.46v5.405h5.405z"/>
<path fill="#551717" d="M91.892 135.135h-5.405v5.405h5.405z"/>
<path fill="#260F10" d="M108.108 124.324h-5.405v5.405h5.405zM102.703 129.73h-5.405v10.81h5.405z"/>
<path fill="#373737" d="M81.08 118.918h-5.404v5.405h5.405zM75.676 129.73H70.27v10.81H59.46v5.406h5.405v5.405h5.405v-5.405h5.406zM86.487 102.702h-5.405v16.216h5.405zM70.27 113.514h-5.405v5.405h-5.406v5.405h5.406v5.406h5.405v-10.811h5.406v-5.405z"/>
<path fill="#260F10" d="M75.676 102.702H70.27v5.405h5.405zM64.865 108.108H59.46v5.405h5.405z"/>
<path fill="#400702" d="M81.08 86.486h-5.404v5.405h5.405zM86.487 81.081h-5.405v5.405h5.405zM91.892 70.27h-5.405v10.811h5.405z"/>
<path fill="#EDE4ED" d="M81.08 75.675h-5.404v10.811h5.405z"/>
<path fill="#7D4327" d="M75.676 75.675H70.27v10.811h5.405z"/>
<path fill="#DFCEDD" d="M59.46 70.27H48.647v5.405H59.46z"/>
<path fill="#D82C34" d="M64.865 54.054H59.46v5.405h5.405z"/>
<path fill="#A21A16" d="M64.865 48.648H59.46v5.405h5.405z"/>
<path fill="#D1B8CB" d="M70.27 70.27h-5.405v-5.405h-5.406v10.811H70.27z"/>
<path fill="#FFF" d="M70.27 59.46h-5.405v5.404h5.405z"/>
<path fill="#D1B8CB" d="M86.486 59.46h-10.81v5.405H70.27v5.405h10.811v-5.405h5.405z"/>
<path fill="#260F10" d="M86.487 54.054h-5.405v5.405h5.405zM81.081 70.27h-10.81v5.405h10.81zM91.892 59.46h-5.406v5.405h-5.405v5.405h10.81z"/>
<path fill="#551717" d="M91.892 48.648h-5.405v5.405h5.405z"/>
<path fill="#260F10" d="M81.08 48.648h-5.404v5.405h5.405z"/>
<path fill="#551717" d="M86.487 43.243h-5.405v5.405h5.405z"/>
<path fill="#A21A16" d="M86.487 48.648h-5.405v5.405h5.405z"/>
<path fill="#ED3838" d="M81.08 43.243h-5.404v5.405h5.405z"/>
<path fill="#260F10" d="M43.243 32.432h21.622v5.405H43.243z"/>
<g>
<path fill="#4F4001" d="M183.784 0h10.81v5.405h-10.81z"/>
<path fill="#0E3A00" d="M183.784 5.405h10.81v5.405h-10.81zM178.379 10.811h5.405v16.216h-5.405zM194.595 10.811H200v16.216h-5.405z"/>
<path fill="#2B2B2B" d="M172.973 5.405h10.81v5.405h-10.81zM167.568 10.811h5.405v5.405h-5.405zM162.163 48.649h5.405V59.46h-5.405zM210.81 48.649h5.406V59.46h-5.405z"/>
<path fill="#2B2B2B" d="M162.163 48.649h5.405V59.46h-5.405zM145.946 54.054h5.405v10.811h-5.405zM227.028 54.054h5.405v10.811h-5.405zM221.622 48.649h5.405v5.405h-5.405zM221.622 64.865h5.405v5.405h-5.405z"/>
<path fill="#373737" d="M221.622 70.27h5.405v5.405h-5.405zM205.406 81.081h5.405v5.405h-5.405zM216.217 75.676h5.405v10.811h-5.405zM210.81 86.486h5.406v10.811h-5.405z"/>
<path fill="#2B2B2B" d="M194.595 108.108H200v10.81h-10.81v-5.404h5.405z"/>
<path fill="#373737" d="M205.405 97.297h5.406v10.811h5.405v5.406h-10.811v5.405H200v-10.81h5.405zM200 86.486h5.405v10.811H200z"/>
<path fill="#2B2B2B" d="M151.352 64.865h5.405v5.405h-5.405zM156.757 70.27h5.405v5.405h-5.405zM151.352 48.649h5.405v5.405h-5.405zM216.217 59.459h5.405v5.405h-5.405zM156.757 59.459h5.405v5.405h-5.405z"/>
<path fill="#373737" d="M210.81 59.459h5.406v5.405h-5.405z"/>
<path fill="#C6D3D6" d="M205.406 59.459h5.405v5.405h-5.405zM167.568 59.459h5.405v5.405h-5.405z"/>
<path fill="#DAB700" d="M210.81 64.865h5.406v5.405h-5.405zM162.163 64.865h5.405v5.405h-5.405z"/>
<path fill="#BE9501" d="M205.406 64.865h5.405v5.405h-5.405zM167.568 64.865h5.405v5.405h-5.405zM194.595 75.676H200v5.405h-5.405z"/>
<path fill="#9D7A00" d="M194.595 81.081H200v5.405h-5.405z"/>
<path fill="#403100" d="M194.595 86.486H200v5.405h-5.405zM156.757 64.865h5.405v5.405h-5.405zM162.163 70.27h10.81v5.405h-10.81zM205.405 70.27h10.811v-5.405h5.406v10.811h-16.217z"/>
<path fill="#9D7A00" d="M189.19 86.486h5.405v5.405h-5.405z"/>
<path fill="#F4CD00" d="M194.595 70.27H200v5.405h-5.405z"/>
<path fill="#339100" d="M189.19 70.27h5.405v5.405h-5.405z"/>
<path fill="#195D00" d="M189.19 75.676h5.405v5.405h-5.405z"/>
<path fill="#BE9501" d="M189.19 81.081h5.405v5.405h-5.405z"/>
<path fill="#9D7A00" d="M200 64.865h5.405v10.811H200z"/>
<path fill="#403100" d="M200 75.676h5.405v10.811H200z"/>
<path fill="#373737" d="M205.406 54.054h5.405v5.405h-5.405zM200 59.459h5.405v5.405H200zM172.973 59.459h5.405v5.405h-5.405z"/>
<path fill="#40190F" d="M178.379 59.459h5.405v5.405h-5.405zM216.217 86.486h5.405v5.405h-5.405zM232.433 97.297h5.405v5.405h-5.405zM264.865 124.324h5.405v5.405h-5.405zM259.46 129.73h5.405v5.405h-5.405z"/>
<path fill="#32130B" d="M227.028 135.135h5.405v5.405h-5.405zM189.19 140.541h5.405v5.405h-5.405zM194.595 124.324H200v5.405h-5.405zM183.784 145.946h5.405v5.405h-5.405zM162.163 167.568h5.405v5.405h-5.405zM135.136 162.162h5.405v5.405h-5.405z"/>
<path fill="#5A3B26" d="M135.136 167.568h5.405v5.405h-5.405z"/>
<path fill="#5A3D26" d="M162.163 172.973h5.405v5.405h-5.405zM210.81 167.568h5.406v5.405h-5.405zM227.028 156.757h5.405v5.405h-5.405z"/>
<path fill="#A08163" d="M221.622 156.757h5.405v5.405h-5.405zM227.028 151.351h5.405v5.405h-5.405zM216.217 129.73h5.405v5.405h-5.405zM232.433 108.108h5.405v21.622h-5.405z"/>
<path fill="#8A7053" d="M216.217 135.135h5.405v5.405h-5.405z"/>
<path fill="#7C644A" d="M227.028 108.108h5.405v5.405h-5.405z"/>
<path fill="#8A6F52" d="M232.433 129.73h5.405v5.405h-5.405zM237.838 140.541h5.405v10.811h-5.405zM243.244 151.351h5.405v5.405h-5.405z"/>
<path fill="#7C6449" d="M232.433 135.135h5.405v5.405h-5.405zM237.838 151.351h5.405v5.405h-5.405z"/>
<path fill="#C4DBDE" d="M259.46 145.946h5.405v-5.405h5.405v10.81h-5.405v5.406h-5.406v-5.406z"/>
<path fill="#E6E6E6" d="M259.46 135.135h5.405v-5.405h5.405v10.811h-5.405v5.405h-5.406v5.405h-5.405v-10.81h5.405z"/>
<path fill="#7C6449" d="M243.244 156.757h16.216v5.405h-16.216z"/>
<path fill="#A08163" d="M237.838 135.135h5.405v5.405h-5.405zM243.244 145.946h5.405v5.405h-5.405zM248.649 151.351h10.81v5.405h-10.81z"/>
<path fill="#B7A07C" d="M221.622 97.297h10.81v5.406h5.406v5.405h-10.811v32.433h5.405v10.81h-5.405v5.406h-5.405V129.73h-5.406v-5.406h-10.81v-10.81h10.81v-5.406h-5.405v-10.81h5.405v5.405h5.406z"/>
<path fill="#8A7053" d="M200 124.324h5.405v5.405H200zM205.406 129.73h10.81v5.405h-10.81z"/>
<path fill="#A08163" d="M200 118.919h5.405v5.405H200zM205.406 124.324h10.81v5.405h-10.81z"/>
<path fill="#49301E" d="M200 156.757h5.405v5.405H200z"/>
<path fill="#7C644A" d="M205.406 140.541h5.405v16.216h-5.405z"/>
<path fill="#3A2618" d="M194.595 162.162h10.81v5.405h-10.81z"/>
<path fill="#896F52" d="M145.946 145.946h5.405v5.405h-5.405z"/>
<path fill="#B7A07C" d="M140.54 129.73h5.406v5.405h-5.405z"/>
<path fill="#A08164" d="M140.54 124.324h5.406v5.405h-5.405z"/>
<path fill="#A08163" d="M167.568 145.946h5.405v10.811h-5.405zM172.973 156.757h5.405v10.811h-5.405z"/>
<path fill="#B7A07C" d="M172.973 124.324h5.405v-5.405h5.406v-5.405h5.405v5.405h5.406v16.216h-10.811v5.406h-5.406v16.216h-5.405v-10.811h-5.405v-5.405h-5.406v-5.406h5.406v-5.405h5.405z"/>
<path fill="#A08164" d="M140.54 135.135h5.406v5.405h-5.405z"/>
<path fill="#A08163" d="M178.379 140.541h5.405v5.405h-5.405z"/>
<path fill="#A08164" d="M167.568 124.324h5.405v5.405h-5.405zM145.946 129.73h21.622v5.405h-21.622zM172.973 118.919h5.405v5.405h-5.405zM178.379 113.514h5.405v5.405h-5.405z"/>
<path fill="#B7A07C" d="M216.217 91.892h5.405v5.405h-5.405zM237.838 124.324h5.405v10.811h-5.405zM243.243 135.135h5.406v5.406h5.405v10.81h-5.405v-5.405h-5.406z"/>
<path fill="#896F52" d="M140.54 140.541h5.406v5.405h-5.405z"/>
<path fill="#B7A07C" d="M145.946 135.135h5.405v10.811h-5.405z"/>
<path fill="#49301E" d="M140.54 167.568h5.406v5.405h-5.405zM167.568 172.973h10.81v5.405h-10.81zM216.217 167.568h10.81v5.405h-10.81z"/>
<path fill="#7C644A" d="M145.946 151.351h5.405v10.811h-5.405z"/>
<path fill="#5A3B26" d="M140.54 162.162h10.812v5.405H140.54z"/>
<path fill="#5A3D26" d="M167.568 167.568h10.81v5.405h-10.81zM216.217 162.162h10.81v5.405h-10.81z"/>
<path fill="#32130B" d="M140.54 145.946h5.406v16.216h-5.405zM135.136 118.919h5.405v27.027h-5.405zM156.757 178.378v-5.405h5.405v5.405h16.216v5.406h-21.621zM129.73 172.973v-5.405h5.405v5.405h10.81v-5.405h5.406v10.81H129.73zM178.379 167.568h5.405v10.811h-5.405zM167.568 156.757h5.405v10.811h-5.405zM162.163 145.946h5.405v10.811h-5.405zM151.352 145.946h5.405v21.622h-5.405zM194.595 135.135h16.216v5.405h-16.216zM194.595 156.757H200v5.405h-5.405zM210.81 140.541h5.406v16.216h-5.405zM200 140.541h5.405v16.216H200zM210.81 172.973h16.217v5.405H210.81z"/>
<path fill="#32130B" d="M189.19 167.568v-5.406h5.405v5.406h10.81v-10.811h5.406v5.405h5.405v5.406h-5.405v5.405h-21.622zM227.028 162.162h5.405v10.811h-5.405zM243.244 162.162h16.216v5.405h-16.216zM232.432 151.351h5.406v5.406h5.405v5.405h-10.81z"/>
<path fill="#40190F" d="M248.649 135.135h10.81v5.405h-10.81zM259.46 156.757h5.405v-5.406h5.405v10.811h-10.81zM243.244 124.324h5.405v10.811h-5.405zM232.433 140.541h5.405v10.811h-5.405zM210.81 135.135h5.406v5.405h-5.405zM183.784 140.541h5.405v5.405h-5.405zM156.757 145.946h5.405v5.405h-5.405zM151.352 140.541h5.405v5.405h-5.405zM178.379 145.946h5.405v21.622h-5.405zM200 129.73h5.405v5.405H200zM194.595 118.919H200v5.405h-5.405zM216.217 140.541h5.405v21.622h-5.405zM270.27 129.73h5.406v21.622h-5.405zM227.028 113.514h5.405v21.622h-5.405zM237.838 102.703h5.405v21.622h-5.405zM221.622 91.892h10.81v5.405h-10.81z"/>
<path fill="#1C0800" d="M172.973 64.865h5.405v5.405h-5.405zM135.136 64.865h5.405v5.405h-5.405zM135.136 113.514h5.405v5.405h-5.405zM140.54 118.919h5.406v5.405h-5.405zM167.568 118.919h5.405v5.405h-5.405zM172.973 113.514h5.405v5.405h-5.405z"/>
<path fill="#1C0800" d="M178.378 108.108h5.406v-5.405h5.405v-5.406h5.406v5.406H200v5.405h-10.81v5.406h-10.812z"/>
<path fill="#000" d="M151.352 118.919h10.81v5.405h-10.81z"/>
<path fill="#1C0800" d="M145.946 124.324h21.622v5.405h-21.622z"/>
<path fill="#000" d="M135.135 102.703v-5.406h5.406v5.406h5.405v5.405h-10.81zM178.378 102.703v-5.406h-5.405v5.406h-5.405v5.405h10.81z"/>
<path fill="#5A3B26" d="M178.379 64.865h5.405v5.405h-5.405zM172.973 70.27h5.405v5.405h-5.405zM167.568 75.676h5.405v5.405h-5.405z"/>
<path fill="#F6CCBE" d="M135.136 75.676h5.405v5.405h-5.405z"/>
<path fill="#C0AC8D" d="M129.73 81.081h5.405v5.405h-5.405z"/>
<path fill="#8A7053" d="M124.325 97.297h5.405v5.405h-5.405zM183.784 97.297h5.405v5.405h-5.405zM140.54 108.108h5.406v5.405h-5.405zM167.568 108.108h5.405v5.405h-5.405z"/>
<path fill="#A08264" d="M162.162 97.297h5.406v-5.405h5.405v10.81h-5.405v16.217h-5.406zM151.351 97.297h-5.405v-5.405h-5.405v10.81h5.405v16.217h5.405z"/>
<path fill="#C0AC8D" d="M178.379 81.081h5.405v5.405h-5.405z"/>
<path fill="#F6CCBE" d="M172.973 75.676h5.405v5.405h-5.405z"/>
<path fill="#F6BAA6" d="M129.73 75.676h5.405v5.405h-5.405zM178.379 75.676h5.405v5.405h-5.405z"/>
<path fill="#E6E6E6" d="M129.73 70.27h5.405v5.405h-5.405zM178.379 70.27h5.405v5.405h-5.405zM162.163 81.081h5.405v5.405h-5.405zM145.946 81.081h5.405v5.405h-5.405zM135.136 108.108h5.405v5.405h-5.405zM140.54 113.514h5.406v5.405h-5.405zM167.568 113.514h5.405v5.405h-5.405zM162.163 140.541h5.405v5.405h-5.405zM151.352 135.135h10.81v5.405h-10.81zM183.784 135.135h10.81v5.405h-10.81zM172.973 108.108h5.405v5.405h-5.405z"/>
<path fill="#C4DBDE" d="M129.73 102.703h5.405v5.405h-5.405zM145.946 118.919h5.405v5.405h-5.405zM162.163 118.919h5.405v5.405h-5.405zM156.757 140.541h5.405v5.405h-5.405zM194.595 129.73H200v5.405h-5.405zM216.217 97.297h5.405v5.405h-5.405zM210.81 156.757h5.406v5.405h-5.405zM178.379 102.703h5.405v5.405h-5.405z"/>
<path fill="#E6E6E6" d="M151.352 86.486h10.81v5.405h-10.81z"/>
<path fill="#B7A07C" d="M151.352 81.081h10.81v5.405h-10.81zM135.135 81.081h10.81v5.405h5.406v10.811h-5.405v-5.405h-5.405v5.405h-5.406v5.406h-5.405V86.486h5.405z"/>
<path fill="#B7A07C" d="M178.378 81.081h-10.81v5.405h-5.406v10.811h5.406v-5.405h5.405v5.405h5.405v5.406h5.406V86.486h-5.406z"/>
<path fill="#C4DBDE" d="M151.352 91.892h10.81v5.405h-10.81z"/>
<path fill="#B7A07C" d="M151.352 97.297h10.81v21.622h-10.81z"/>
<path fill="#5A3B26" d="M140.54 75.676h5.406v5.405h-5.405zM135.136 70.27h5.405v5.405h-5.405zM129.73 64.865h5.405v5.405h-5.405z"/>
<path fill="#40190F" d="M145.946 75.676h21.622v5.405h-21.622z"/>
<path fill="#1C0800" d="M183.784 64.865h5.405v32.432h-5.405zM124.325 64.865h5.405v32.432h-5.405zM118.919 97.297h5.405v5.406h5.406v5.405h5.405v5.406h-10.81v-5.406h-10.811v-5.405h5.405z"/>
<path fill="#373737" d="M167.568 54.054h5.405v5.405h-5.405zM162.163 59.459h5.405v5.405h-5.405zM189.19 64.865H200v5.405h-10.81z"/>
<path fill="#2B2B2B" d="M156.757 21.622h5.405v27.027h-5.405zM216.217 21.622h5.405v27.027h-5.405zM205.406 10.811h5.405v5.405h-5.405z"/>
<path fill="#792E00" d="M200 10.811h5.405v5.405H200zM172.973 10.811h5.405v5.405h-5.405z"/>
<path fill="#8D3B00" d="M172.973 16.216h5.405v5.405h-5.405zM200 16.216h5.405v5.405H200z"/>
<path fill="#9D7A00" d="M205.406 16.216h5.405v5.405h-5.405zM200 21.622h5.405v5.405H200zM172.973 21.622h5.405v5.405h-5.405zM167.568 16.216h5.405v5.405h-5.405z"/>
<path fill="#695500" d="M167.568 21.622h5.405v5.405h-5.405zM205.406 21.622h5.405v5.405h-5.405z"/>
<path fill="#61D60A" d="M183.784 10.811h5.405v5.405h-5.405z"/>
<path fill="#359200" d="M189.19 16.216h5.405v5.405h-5.405zM183.784 21.622h5.405v5.405h-5.405zM162.163 10.811h5.405v5.405h-5.405zM156.757 16.216h5.405v5.405h-5.405z"/>
<path fill="#195C00" d="M189.19 21.622h5.405v5.405h-5.405zM162.163 16.216h5.405v5.405h-5.405z"/>
<path fill="#622900" d="M162.163 21.622h5.405v5.405h-5.405z"/>
<path fill="#672600" d="M178.379 27.027h5.405v5.405h-5.405zM172.973 32.432h5.405v5.405h-5.405zM205.406 37.838h5.405v5.405h-5.405z"/>
<path fill="#682600" d="M210.81 43.243h5.406v5.405h-5.405zM216.217 48.649h5.405v5.405h-5.405z"/>
<path fill="#622900" d="M210.81 32.432h5.406v10.811h-5.405z"/>
<path fill="#772C00" d="M210.81 21.622h5.406v10.81h-5.405v5.406h-5.406v-5.406h-10.81v-5.405h16.216z"/>
<path fill="#682600" d="M205.406 48.649h5.405v5.405h-5.405zM167.568 48.649h5.405v5.405h-5.405z"/>
<path fill="#752E00" d="M216.217 48.649h5.405v5.405h-5.405z"/>
<path fill="#A75A14" d="M210.81 81.081h5.406v5.405h-5.405z"/>
<path fill="#D9F7D1" d="M205.406 86.486h5.405v5.405h-5.405zM200 97.297h5.405v5.405H200z"/>
<path fill="#B9F0A7" d="M205.406 91.892h5.405v5.405h-5.405zM194.595 97.297H200v5.405h-5.405zM200 102.703h5.405v5.405H200z"/>
<path fill="#707070" d="M189.19 108.108h5.405v5.405h-5.405z"/>
<path fill="#D9F7D1" d="M205.406 75.676h10.81v5.405h-10.81zM189.19 91.892H200v5.405h-10.81z"/>
<path fill="#752E00" d="M156.757 48.649h5.405v5.405h-5.405z"/>
<path fill="#662700" d="M216.217 54.054h5.405v5.405h-5.405zM156.757 54.054h5.405v5.405h-5.405zM151.352 59.459h5.405v5.405h-5.405zM221.622 59.459h5.405v5.405h-5.405z"/>
<path fill="#602C00" d="M221.622 54.054h5.405v5.405h-5.405zM151.352 54.054h5.405v5.405h-5.405z"/>
<path fill="#A85B12" d="M178.379 32.432h10.81v5.405h-10.81z"/>
<path fill="#682600" d="M189.19 32.432h16.216v5.405H189.19z"/>
<path fill="#A85B12" d="M167.568 43.243h5.405v5.405h-5.405zM205.406 43.243h5.405v5.405h-5.405z"/>
<path fill="#373737" d="M178.379 43.243h5.405v5.405h-5.405zM194.595 43.243H200v5.405h-5.405z"/>
<path fill="#FFF" d="M194.595 37.838h10.81v10.811H200v-5.406h-5.405zM183.784 37.838h-10.811v10.811h5.405v-5.406h5.406z"/>
<path fill="#A85B12" d="M172.973 48.649h10.81v5.405h-10.81zM194.595 48.649h10.81v5.405h-10.81z"/>
<path fill="#9F550F" d="M183.784 54.054h10.81v5.405h-10.81z"/>
<path fill="#CA7938" d="M172.973 54.054h10.81v5.405h-10.81zM183.784 59.46h10.81v-5.406h10.811v5.405H200v5.406h-16.216zM183.784 37.838h10.81v16.216h-10.81z"/>
<path fill="#672600" d="M167.568 37.838h5.405v5.405h-5.405z"/>
<path fill="#4E1E00" d="M162.163 43.243h5.405v5.405h-5.405z"/>
<path fill="#622900" d="M162.163 32.432h5.405v10.811h-5.405z"/>
<path fill="#792D00" d="M167.568 27.027h10.81v5.405h-5.405v5.406h-5.405v-5.406h-5.406v-5.405z"/>
<path fill="#0E3A00" d="M162.163 5.405h5.405v5.405h-5.405zM156.757 10.811h5.405v5.405h-5.405zM151.352 16.216h5.405v5.405h-5.405z"/>
<path fill="#359200" d="M216.216 10.81h-5.405v5.405h5.405zM221.622 16.216h-5.405v5.405h5.405z"/>
<path fill="#195C00" d="M216.216 16.216h-5.405v5.405h5.405z"/>
<path fill="#0E3A00" d="M216.216 5.405h-5.405v5.405h5.405zM221.622 10.81h-5.405v5.405h5.405zM227.027 16.216h-5.405v5.405h5.405z"/>
<path fill="#45BC00" d="M183.784 16.216h5.405v5.405h-5.405zM189.19 10.811h5.405v5.405h-5.405z"/>
<path fill="#2B2B2B" d="M194.595 5.405h10.81v5.405h-10.81z"/>
<path fill="#0E3A00" d="M183.784 27.027h10.81v5.405h-10.81z"/>
</g>
<g>
<path fill="#212121" d="M299.46 57.297h5.405v5.405h-5.405z"/>
<path fill="#0C2B68" d="M283.243 62.702h5.405v5.405h-5.405z"/>
<path fill="#1E5CDA" d="M337.297 14.054h10.81v5.405h-10.81z"/>
<path fill="#1A4DB6" d="M337.297 19.46h5.405v5.404h-5.405zM348.108 19.46h5.405v5.404h-5.405z"/>
<path fill="#2366EE" d="M337.297 8.648h5.405v5.405h-5.405zM326.486 19.46h5.406v-5.406h5.405v27.027h5.406v10.81H321.08v-10.81h5.405z"/>
<path fill="#1E5CDA" d="M310.27 51.892h5.406v-10.81h5.405v16.215h-10.81zM353.514 51.892h-5.406v-10.81h-5.405v16.215h10.81z"/>
<path fill="#0C2B68" d="M294.054 68.108h5.405v5.405h-5.405zM299.46 62.702h5.405v5.405h-5.405zM304.865 57.297h5.405v5.405h-5.405z"/>
<path fill="#1E5CDA" d="M321.08 30.27h5.406v10.811h-5.405zM337.297 30.27h5.405v10.811h-5.405z"/>
<path fill="#0F347B" d="M310.27 57.297h43.243v5.405H310.27z"/>
<path fill="#0E3074" d="M304.865 62.703h54.054v5.405h5.405v5.406h-16.216v-5.406h-32.432v5.406h-16.217v-5.406h5.406z"/>
<path fill="#0C2B68" d="M299.46 73.513h10.81v5.405h-10.81z"/>
<path fill="#1C4DB2" d="M315.676 68.108h32.432v5.405h-32.432zM321.08 51.892h21.623v5.405H321.08z"/>
<path fill="#0C2B68" d="M380.54 62.702h-5.404v5.405h5.405zM369.73 68.108h-5.406v5.405h5.405zM364.324 62.702h-5.405v5.405h5.405zM358.919 57.297h-5.405v5.405h5.405zM364.324 73.513h-10.811v5.405h10.811z"/>
<path fill="#212121" d="M283.243 51.892h10.811v5.405h-5.405v5.406h-5.406v5.405h-5.405v-10.81h5.405zM380.54 51.892h-10.81v5.405h5.405v5.406h5.406v5.405h5.405v-10.81h-5.405zM294.054 73.513h5.405v5.405h-5.405zM315.676 105.946h5.405v5.405h-5.405zM364.324 100.54h5.406v16.217h-5.406v10.81h-5.405v-16.216h5.405z"/>
<path fill="#212121" d="M358.919 78.919h5.405v21.622h-10.81V89.73h5.405zM342.703 105.946h5.405v-5.405h5.406v5.405h5.405v5.405h-16.216zM321.08 111.351h21.623v5.405H321.08zM315.676 116.757h5.405v10.811h-5.405zM299.46 78.919h5.405v10.81h5.405v10.812h-10.81z"/>
<path fill="#000" d="M267.027 73.513h5.405v5.405h-5.405zM283.243 89.73h5.405v5.404h-5.405zM272.433 78.92h5.405v5.404h-5.405zM288.649 95.135h5.405v5.405h-5.405zM277.838 84.324h5.405v5.405h-5.405z"/>
<path fill="#61AEF2" d="M261.622 73.513h5.405v5.405h-5.405zM272.433 84.324h5.405v5.405h-5.405zM283.243 95.135h5.405v5.405h-5.405zM267.027 78.92h5.405v5.404h-5.405zM277.838 89.73h5.405v5.404h-5.405zM288.649 100.54h5.405v5.405h-5.405zM294.054 105.946h5.405v5.405h-5.405zM256.216 78.92h5.405v5.404h-5.405zM267.027 89.73h5.405v5.404h-5.405zM277.838 100.54h5.405v5.405h-5.405zM261.622 84.324h5.405v5.405h-5.405zM272.433 95.135h5.405v5.405h-5.405zM283.243 105.946h5.405v5.405h-5.405zM288.649 111.351h5.405v5.405h-5.405z"/>
<path fill="#AED8FF" d="M294.054 111.351h5.405v5.405h-5.405z"/>
<path fill="#F9D624" d="M288.649 122.162h5.405v5.405h-5.405zM294.054 116.757h5.405v5.405h-5.405zM299.46 111.351h5.405v5.405h-5.405zM304.865 105.946h5.405v5.405h-5.405z"/>
<path fill="#B3B3B3" d="M310.27 73.513h5.405v5.405h-5.405zM304.865 78.92h5.405v5.404h-5.405z"/>
<path fill="#B9B9B9" d="M348.108 73.513h5.405v5.405h-5.405zM353.514 84.324h5.405v5.405h-5.405z"/>
<path fill="#B3B3B3" d="M337.297 95.135h10.81v5.405h-10.81zM315.676 95.135h10.81v5.405h-10.81z"/>
<path fill="#FFF" d="M315.676 78.919h10.81v5.405h-5.405v5.406h-5.405zM348.108 78.919h-10.81v5.405h5.405v5.406h5.405z"/>
<path fill="#D39062" d="M315.676 89.73h10.81v5.404h-10.81z"/>
<path fill="#F1965C" d="M326.486 78.919h5.406v-5.405h5.405V89.73h-10.81z"/>
<path fill="#D39062" d="M315.676 73.513h16.216v5.405h-16.216zM337.297 89.73h10.81v5.404h-10.81zM337.297 73.513h10.81v5.405h-10.81zM348.108 78.92h5.405v10.81h-5.405zM310.27 78.92h5.405v10.81h-5.405z"/>
<path fill="#CACACA" d="M326.487 89.73h10.81v5.404h-10.81z"/>
<path fill="#B46E3F" d="M326.487 95.135h10.81v5.405h-10.81z"/>
<path fill="#E8E8E8" d="M326.487 105.946h10.81v5.405h-10.81z"/>
<path fill="#CACACA" d="M321.08 100.54h21.623v5.405H321.08z"/>
<path fill="#B9B9B9" d="M348.108 95.135h5.405v5.405h-5.405zM342.703 100.54h5.405v5.405h-5.405zM315.676 100.54h5.405v5.405h-5.405zM310.27 95.135h5.405v5.405h-5.405z"/>
<path fill="#B3B3B3" d="M304.865 78.92h5.405v5.404h-5.405zM310.27 73.513h5.405v5.405h-5.405z"/>
<path fill="#9F9F9F" d="M304.865 84.324h5.405v5.405h-5.405z"/>
<path fill="#2366EE" d="M315.676 111.351h5.405v5.405h-5.405zM321.08 116.757h5.406v10.811h-5.405z"/>
<path fill="#1E5CDA" d="M310.27 111.351h5.405v5.405h-5.405zM348.108 111.351h5.405v5.405h-5.405z"/>
<path fill="#1C4DB2" d="M342.703 111.351h5.405v5.405h-5.405zM337.297 122.162h5.405v5.405h-5.405z"/>
<path fill="#0F347B" d="M342.703 138.378h5.405v5.405h-5.405z"/>
<path fill="#0C2B68" d="M348.108 143.784h5.405v5.405h-5.405z"/>
<path fill="#0E3074" d="M353.514 111.351h5.405v5.405h-5.405zM348.108 116.757h5.405v5.405h-5.405zM331.892 132.973h5.405v10.81h10.811v5.406h-21.622v-5.405h5.406z"/>
<path fill="#103886" d="M337.297 127.567h5.405v16.216h-5.405z"/>
<path fill="#0E3074" d="M310.27 116.757h5.405v5.405h-5.405z"/>
<path fill="#1C4DB2" d="M326.487 116.757h5.405v5.405h-5.405z"/>
<path fill="#F1965C" d="M310.27 89.73h5.405v5.404h-5.405zM348.108 89.73h5.405v5.404h-5.405z"/>
<path fill="#B3B3B3" d="M321.08 105.946h5.406v5.405h-5.405zM337.297 105.946h5.405v5.405h-5.405z"/>
<path fill="#A8B4CC" d="M331.892 116.757h5.405v5.405h-5.405zM326.487 122.162h5.405v5.405h-5.405zM321.08 127.567h5.406v5.405h-5.405z"/>
<path fill="#8A9AB9" d="M337.297 116.757h5.405v5.405h-5.405zM331.892 122.162h5.405v5.405h-5.405zM326.487 127.567h5.405v5.405h-5.405z"/>
<path fill="#808EAB" d="M331.892 127.567h5.405v5.405h-5.405z"/>
<path fill="#8A9AB9" d="M321.08 132.973h5.406v5.405h-5.405zM315.676 138.378h5.405v5.405h-5.405z"/>
<path fill="#727E96" d="M310.27 143.784h5.405v5.405h-5.405z"/>
<path fill="#808EAB" d="M315.676 143.784h5.405v-5.406h5.405v-5.405h5.406v10.81h-5.406v5.406h-10.81z"/>
<path fill="#B9B9B9" d="M353.514 100.54h5.405v5.405h-5.405z"/>
<path fill="#B3B3B3" d="M353.514 78.92h5.405v5.404h-5.405z"/>
<path fill="#9F9F9F" d="M358.919 105.946h5.405v5.405h-5.405z"/>
<path fill="#DEDEDE" d="M358.919 100.54h5.405v5.405h-5.405z"/>
<path fill="#D3B100" d="M299.46 116.757h5.405v5.405h-5.405z"/>
<path fill="#AED8FF" d="M283.243 100.54h5.405v5.405h-5.405zM272.433 89.73h5.405v5.404h-5.405zM261.622 78.92h5.405v5.404h-5.405zM288.649 105.946h5.405v5.405h-5.405zM277.838 95.135h5.405v5.405h-5.405zM267.027 84.324h5.405v5.405h-5.405zM256.216 73.513h5.405v5.405h-5.405z"/>
<path fill="#000" d="M294.054 100.54h5.405v5.405h-5.405zM299.46 105.946h5.405v5.405h-5.405zM304.865 111.351h5.405v10.811h-5.405zM256.216 89.73h5.405v-5.405h-5.405zM272.433 105.946h5.405v-5.405h-5.405zM283.243 132.973h10.811v-5.405h-5.405v-5.406h-5.406z"/>
<path fill="#000" d="M315.676 100.54h-10.811v5.406h5.405v5.405h5.406zM250.81 68.108h16.217v5.406h-10.81v10.81h-5.406zM261.622 95.136h5.405V89.73h-5.405zM277.838 111.351h5.405v-5.405h-5.405zM267.027 100.54h5.405v-5.405h-5.405zM283.243 116.757h5.405v-5.405h-5.405zM288.649 122.162h5.405v-5.405h-5.405zM310.27 127.567h5.405v-5.405h-5.405zM315.676 132.973h5.405v-5.405h-5.405zM304.865 132.973h5.405v-5.405h-5.405zM310.27 138.378h5.405v-5.405h-5.405z"/>
<path fill="#000" d="M315.676 138.378h5.405v-5.405h-5.405zM294.054 127.567h10.81v-5.405h-10.81z"/>
<path fill="#212121" d="M283.243 68.108h5.406v-5.405h10.81v5.405h-5.405v5.406h-10.81zM380.54 68.108h-5.405v-5.405h-10.81v5.405h5.405v5.406h10.81zM304.865 51.892h5.405v5.405h-5.405zM326.487 14.054h5.405v5.405h-5.405zM331.892 8.648h5.405v5.405h-5.405zM337.297 3.243h5.405v5.405h-5.405zM342.703 8.648h5.405v5.405h-5.405zM348.108 14.054h5.405v5.405h-5.405zM353.514 19.46h5.405v5.404h-5.405zM348.108 24.865h5.405v5.405h-5.405zM353.514 51.892h5.405v5.405h-5.405zM358.919 57.297h5.405v5.405h-5.405z"/>
<path fill="#212121" d="M364.325 73.513h5.405v5.405h-5.405zM353.514 127.567h5.405v5.405h-5.405zM310.27 138.378h5.405v5.405h-5.405zM342.703 116.757h5.405v5.405h5.406v5.406h-5.406v5.405h5.406v10.81h-5.406v-5.405h-5.405zM304.865 143.784h5.405v5.405h43.244v-5.405h5.405v10.81h-54.054z"/>
<path fill="#000" d="M337.297 84.324h5.405v5.405h-5.405zM321.08 84.324h5.406v5.405h-5.405z"/>
<path fill="#212121" d="M342.703 19.46h5.405v5.404h-5.405zM337.297 24.865h5.405v5.405h-5.405zM342.703 30.27h5.405v10.811h-5.405zM348.108 41.081h5.405v10.811h-5.405zM310.27 41.081h5.405v10.811h-5.405zM315.676 30.27h5.405v10.811h-5.405zM321.08 19.46h5.406v10.81h-5.405z"/>
<path fill="#603913" d="M310.27 127.567h5.405v5.405h-5.405z"/>
<path fill="#B36E3F" d="M304.865 122.162h5.405v5.405h-5.405zM353.514 122.162h5.405v5.405h-5.405z"/>
<path fill="#F1965C" d="M353.514 116.757h5.405v5.405h-5.405z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="480" viewBox="0 0 1440 480">
<g fill="none" fill-rule="nonzero">
<path fill="#FEFEFE" d="M1002.873 423.48c98.309-13.08 200.935-19.32 301.582-11.64 46.05 3.42 91.473 9.96 135.545 20.04V480H681.054c104.245-19.92 207.59-40.86 312.645-55.32 3.058-.42 6.116-.78 9.174-1.2z"/>
<path fill="#FDFDFD" d="M.9 0H1440v431.88c-44.072-10.08-89.494-16.68-135.545-20.1-100.647-7.62-203.273-1.44-301.582 11.64-3.058.42-6.116.84-9.174 1.2-105.054 14.4-208.4 35.4-312.645 55.32H.9V0z"/>
<path fill="#FBFBFB" d="M1009.709 348.6c-2.878.48-5.756 1.02-8.545 1.5-176.47 31.5-349.611 80.1-533.816 105.96-156.682 21.96-314.354 17.52-466.449-6.12V0H1440v344.94c-47.04-10.56-95.79-16.62-144.9-18.54-96.51-3.96-193.019 6.12-285.391 22.2z"/>
<path fill="#FAFAFA" d="M1440 0v257.64c-50.009-11.04-102.086-16.38-154.164-16.62-92.462-.48-182.765 13.62-269.201 32.7-2.699.6-5.307 1.2-8.005 1.8-165.137 37.2-328.925 87.66-505.844 115.26C334.86 417 164.327 411.42.989 383.22V0H1440z"/>
<path fill="#F9F9F9" d="M1276.482 155.64c-88.325 3.6-172.602 21.12-253.012 43.26-2.518.66-4.947 1.38-7.465 2.04-153.804 42.96-308.237 95.1-477.871 124.62C359.325 356.64 175.3 350.04.899 316.68V0H1440v169.92c-53.067-11.76-108.472-16.5-163.518-14.28z"/>
<path fill="#F7F6F7" d="M.9 0H1440v81.78c-56.035-12.54-114.858-16.5-172.872-11.52-84.187 7.26-162.348 28.62-236.822 53.76-2.338.78-4.587 1.56-6.926 2.34-142.47 48.66-287.55 102.54-449.988 133.92-189.332 36.6-387.478 29.4-572.583-9.96V0H.9z"/>
<path fill="#F4F4F5" d="M1030.846 51.78C899.708 106.2 763.983 161.58 608.829 195c-187.622 40.44-387.927 36.48-573.75-3.18-11.514-2.46-22.847-5.04-34.27-7.74V0h1180.063c-50.369 12.78-97.769 30.36-143.64 49.2-2.159.84-4.228 1.74-6.386 2.58z"/>
<path fill="#F2F1F2" d="M.9 0h991.18C885.856 51.48 773.067 98.7 644.177 129.72c-172.512 41.52-359.775 44.82-535.165 12.66A1201.872 1201.872 0 0 1 .809 117.36V0H.9z"/>
<path fill="#EFEFF0" d="M183.036 92.88C140.582 86.52 98.848 77.7 58.374 66.6 38.856 61.26 19.698 55.32.899 48.9V0h860.403c-56.575 25.02-116.657 46.92-181.777 64.44-157.311 42.42-331.622 53.22-496.49 28.44z"/>
<path fill="#EDECEE" d="M256.97 43.44C189.241 35.88 123.042 21.18 61.97 0h650.294C570.423 42.6 410.413 60.6 256.969 43.44z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 KiB

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 115 KiB

+1
View File
@@ -9,6 +9,7 @@
display: inline-flex;
align-items: center;
justify-content: center;
z-index: 10;
&.with-border {
border: solid 2px $yellow-10;
+1 -1
View File
@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="158" height="52" viewBox="0 0 158 52">
<g fill="none" fill-rule="evenodd" opacity=".64">
<g fill="none" fill-rule="evenodd">
<g fill="#A5A1AC">
<path d="M79.337 48.628h-1.16l.898-2.216-1.787-4.509h1.226l1.122 3.069 1.132-3.069h1.226l-2.657 6.725zm-4.453-1.936c-.402 0-.815-.149-1.188-.44v.328h-1.197v-6.726h1.197v2.367c.373-.28.786-.43 1.188-.43 1.253 0 2.113 1.01 2.113 2.45 0 1.44-.86 2.451-2.113 2.451zm-.253-3.872c-.327 0-.655.14-.935.42v2.003c.28.28.608.42.935.42.674 0 1.141-.58 1.141-1.421 0-.842-.467-1.422-1.14-1.422zm-6.98 3.432c-.364.291-.775.44-1.187.44-1.244 0-2.114-1.01-2.114-2.45 0-1.441.87-2.45 2.114-2.45.412 0 .823.148 1.188.43v-2.368h1.207v6.726h-1.207v-.328zm0-3.011c-.27-.281-.598-.421-.925-.421-.683 0-1.15.58-1.15 1.422s.467 1.421 1.15 1.421c.327 0 .654-.14.926-.42V43.24zm-7.127 1.328c.074.711.636 1.197 1.42 1.197.432 0 .908-.159 1.395-.44v1.002a3.82 3.82 0 0 1-1.59.364c-1.413 0-2.404-1.029-2.404-2.488 0-1.412.972-2.413 2.31-2.413 1.226 0 2.058.964 2.058 2.338 0 .131 0 .28-.019.44h-3.17zm1.085-1.853c-.58 0-1.03.432-1.085 1.077h2.039c-.038-.637-.42-1.077-.954-1.077zm-4.238.74v3.124h-1.198v-4.677h1.198v.468c.337-.375.748-.58 1.15-.58.131 0 .262.009.393.046v1.067a1.573 1.573 0 0 0-.42-.056c-.394 0-.815.215-1.123.608zm-5.342 1.113c.075.711.636 1.197 1.422 1.197.43 0 .907-.159 1.393-.44v1.002a3.827 3.827 0 0 1-1.59.364c-1.412 0-2.403-1.029-2.403-2.488 0-1.412.972-2.413 2.31-2.413 1.225 0 2.058.964 2.058 2.338 0 .131 0 .28-.019.44h-3.17zm1.085-1.853c-.58 0-1.029.432-1.085 1.077h2.04c-.038-.637-.422-1.077-.955-1.077zm-5.267 3.864l-.955-3.18-.944 3.18h-1.076l-1.609-4.677h1.197l.945 3.18.945-3.18h1.085l.945 3.18.944-3.18h1.198l-1.6 4.677h-1.075zm-7.316.112c-1.413 0-2.414-1.02-2.414-2.45 0-1.441 1.001-2.45 2.414-2.45 1.412 0 2.404 1.009 2.404 2.45 0 1.43-.992 2.45-2.404 2.45zm0-3.9c-.702 0-1.188.59-1.188 1.45s.486 1.45 1.188 1.45c.692 0 1.178-.59 1.178-1.45s-.486-1.45-1.178-1.45zm-5.258 1.477h-1.076v2.311H33v-6.436h2.273c1.31 0 2.245.852 2.245 2.068 0 1.216-.935 2.057-2.245 2.057zm-.168-3.152h-.908v2.18h.908c.692 0 1.179-.44 1.179-1.085 0-.655-.487-1.095-1.18-1.095zM124.151 44.73h-4.941c.113 1.183.98 1.531 1.963 1.531 1.002 0 1.791-.211 2.48-.558v2.033c-.686.38-1.592.654-2.798.654-2.459 0-4.181-1.54-4.181-4.583 0-2.57 1.461-4.611 3.862-4.611 2.397 0 3.649 2.04 3.649 4.624 0 .245-.022.774-.034.91zm-3.631-3.477c-.631 0-1.332.477-1.332 1.614h2.61c0-1.136-.658-1.614-1.278-1.614zm-7.932 7.137c-.883 0-1.423-.372-1.785-.638l-.006 2.856-2.523.537-.001-11.781h2.222l.132.623a2.827 2.827 0 0 1 1.977-.791c1.772 0 3.441 1.596 3.441 4.535 0 3.207-1.651 4.66-3.457 4.66zM112 41.431c-.579 0-.942.212-1.205.5l.015 3.75c.245.267.598.48 1.19.48.933 0 1.56-1.016 1.56-2.375 0-1.32-.636-2.355-1.56-2.355zm-7.375-2.067h2.533v8.846h-2.533v-8.846zm0-2.825l2.533-.539v2.056l-2.533.539v-2.056zm-2.701 5.673v5.998H99.4v-8.846h2.182l.158.745c.591-1.086 1.771-.865 2.107-.745v2.32c-.32-.104-1.328-.255-1.924.528zm-5.41 2.895c0 1.487 1.593 1.024 1.915.895v2.054c-.336.185-.945.334-1.77.334-1.498 0-2.623-1.103-2.623-2.597l.012-8.097 2.464-.524.002 2.192h1.916v2.152h-1.916v3.59zm-3.146.43c0 1.817-1.446 2.853-3.545 2.853-.87 0-1.821-.169-2.76-.572v-2.41c.847.46 1.926.806 2.763.806.562 0 .968-.15.968-.618 0-1.204-3.837-.75-3.837-3.544 0-1.787 1.365-2.856 3.412-2.856.836 0 1.672.128 2.508.46v2.379c-.768-.415-1.743-.65-2.51-.65-.529 0-.858.153-.858.547 0 1.136 3.859.595 3.859 3.605z"/>
</g>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

+14
View File
@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="28" viewBox="0 0 128 28">
<defs>
<path id="a" d="M0 27.796h127.813V0H0z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<path fill="#4F2A93" d="M24.052 26.3c-.832-.09-.841-.462-.832-5.421 0 0-.083-.312.395-.582.477-.27 1.93-2.679 1.037-4.734-.892-2.056-.248-1.952.125-1.744.374.208.554-.055.332-1.183-.457-2.325-1.17-3.113-2.851-4.162-1.104-.69-.704-1.94.866-1.848.766.045.766.046.862-.555.152-.947-.15-2.565-1.327-2.788-.81-.154-1.817.713-3.015.109-1.198-.604-3.178.904-3.988 1.254s-1.479.354-2.403.331c-.925-.022.49 1.531 1.906 1.881 1.216.3.743.516.674 1.51-.078 1.113.24 1.59-.279 1.707-.796.178-1.686-1.961-3.052-2.857C9.4 5.183 7.56 6.152 2.15.201 1.211-.83 1.592 2.36 2.17 4.063c1.543 4.55 4.532 5.153 5.942 5.29 1.18.116 1.984-.158 1.984.297 0 .33-1.391.48-1.93.482a9.469 9.469 0 0 1-1.762-.173c-1.073-.2.569 2.535 1.624 3.402 1.78 1.465 3.818 2.014 5.456 2.18.473.048 1.146.04 1.146.41 0 .352-.354.438-.773.441-2.294.017-3.612 1.849-3.986 3.967-.237 1.346-.06 2.868-.035 4.005l.09.812c.18 1.426-4.948 1.975-5.627-.322-.743-2.51 3.309-3.837 3.383-6.232.047-1.509-1.333-2.194-1.333-2.194V14.224H4.76v-1.587H3.174V11.05H1.587v4.761h1.587V17.4h2.613c.594 0 1.07.392 1.015 1.24-.137 2.093-4.589 3.379-3.365 6.716.884 2.41 4.696 2.441 8.513 2.441l7.118-.006c.222 0 .534-.107.08-1.255-.367-.927-1.632-.276-2.706-.276-1.137 0-1.176-.96-.446-1.973.446-.618 1.014-1.078 1.979-1.527 1.486-.693 2.617.198 3.174.963.8 1.099 1.054 2.355.348 2.552-.851.238-1.113.27-1.141 1.08-.022.581.256.422 1.595.422h4.445c.688 0 .637-.53-.055-1.45-.491-.653-1.028.11-2.289-.027z"/>
<mask id="b" fill="#fff">
<use xlink:href="#a"/>
</mask>
<path fill="#4F2A93" d="M0 10.827h1.587V9.24H0zM113.986 19.894a1.385 1.385 0 0 0-1.942.25c-.54.7-1.354 1.101-2.236 1.101a2.82 2.82 0 0 1-2.815-2.645 416.05 416.05 0 0 1-.005-1.947 2.824 2.824 0 0 1 2.82-2.821c.781 0 1.508.312 2.046.879a1.385 1.385 0 0 0 2.008-1.907 5.614 5.614 0 0 0-4.054-1.741 5.596 5.596 0 0 0-5.59 5.59c0 .019.001 1.937.009 2.078a5.589 5.589 0 0 0 5.581 5.283c1.747 0 3.361-.793 4.429-2.178a1.385 1.385 0 0 0-.251-1.942M122.223 21.245a2.819 2.819 0 0 1-2.815-2.644 419.52 419.52 0 0 1-.006-1.949 2.824 2.824 0 0 1 2.82-2.82 2.824 2.824 0 0 1 2.821 2.82c0 .2-.002 1.734-.005 1.946a2.818 2.818 0 0 1-2.815 2.647m4.205-10.422c-.645 0-1.183.444-1.336 1.04a5.55 5.55 0 0 0-2.87-.8 5.596 5.596 0 0 0-5.589 5.59c0 .019.001 1.936.008 2.078a5.589 5.589 0 0 0 8.517 4.447 1.384 1.384 0 0 0 2.655-.548V12.208c0-.765-.62-1.385-1.385-1.385M58.861 21.245a2.819 2.819 0 0 1-2.815-2.646c-.003-.213-.005-1.747-.005-1.947a2.824 2.824 0 0 1 2.82-2.82 2.824 2.824 0 0 1 2.82 2.82c0 .2-.001 1.734-.005 1.946a2.818 2.818 0 0 1-2.815 2.647m4.206-10.422c-.646 0-1.183.444-1.337 1.04a5.55 5.55 0 0 0-2.869-.8 5.596 5.596 0 0 0-5.59 5.59c0 .019.001 1.937.009 2.078a5.589 5.589 0 0 0 8.516 4.447 1.384 1.384 0 0 0 2.655-.548V12.208c0-.765-.62-1.385-1.384-1.385M83.451 10.823c-.764 0-1.384.62-1.384 1.385V22.63a1.385 1.385 0 0 0 2.769 0V12.208c0-.765-.62-1.385-1.385-1.385M99.759 10.823c-.765 0-1.385.62-1.385 1.385V22.63a1.385 1.385 0 0 0 2.77 0V12.208c0-.765-.62-1.385-1.385-1.385M76.266 18.6a2.82 2.82 0 0 1-2.815 2.645 2.82 2.82 0 0 1-2.815-2.647c-.004-.214-.005-1.746-.005-1.946a2.824 2.824 0 0 1 2.82-2.82 2.824 2.824 0 0 1 2.82 2.82c0 .193-.002 1.733-.005 1.949m-2.815-7.538c-1.03 0-1.991.284-2.82.772v-5.17a1.385 1.385 0 0 0-2.77 0V22.63a1.385 1.385 0 0 0 2.655.548c.856.529 1.86.836 2.935.836a5.59 5.59 0 0 0 5.582-5.288c.007-.137.008-2.054.008-2.074a5.596 5.596 0 0 0-5.59-5.59M45.664 11.063a5.58 5.58 0 0 0-2.674.677V6.665a1.385 1.385 0 0 0-2.77 0V22.63a1.385 1.385 0 1 0 2.77 0v-7.157c.106-.09.203-.191.281-.315a2.808 2.808 0 0 1 2.393-1.326 2.824 2.824 0 0 1 2.82 2.82c0 .254-.002 5.635-.006 5.944a1.385 1.385 0 0 0 2.767.104c.007-.137.008-5.989.008-6.048a5.596 5.596 0 0 0-5.59-5.59M94.503 10.823h-1.616V6.665a1.385 1.385 0 0 0-2.77 0v4.158h-1.614a1.385 1.385 0 0 0 0 2.77h1.615v9.037a1.385 1.385 0 0 0 2.77 0v-9.038h1.615a1.385 1.385 0 0 0 0-2.769" mask="url(#b)"/>
<path fill="#FF6066" d="M84.785 6.665a1.385 1.385 0 1 1-2.77 0 1.385 1.385 0 0 1 2.77 0" mask="url(#b)"/>
<path fill="#4FB5E8" d="M101.092 6.665a1.385 1.385 0 1 1-2.77 0 1.385 1.385 0 0 1 2.77 0" mask="url(#b)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

+164
View File
@@ -0,0 +1,164 @@
<template lang="pug">
.form
.form-group.row.text-center
.col-12.col-md-6
.btn.btn-secondary.social-button(@click='socialAuth("facebook")')
.svg-icon.social-icon(v-html="icons.facebookIcon")
span {{registering ? $t('signUpWithSocial', {social: 'Facebook'}) : $t('loginWithSocial', {social: 'Facebook'})}}
.col-12.col-md-6
.btn.btn-secondary.social-button(@click='socialAuth("google")')
.svg-icon.social-icon(v-html="icons.googleIcon")
span {{registering ? $t('signUpWithSocial', {social: 'Google'}) : $t('loginWithSocial', {social: 'Google'})}}
.form-group(v-if='registering')
label(for='usernameInput', v-once) {{$t('username')}}
input#usernameInput.form-control(type='text', :placeholder='$t("usernamePlaceholder")', v-model='username')
.form-group(v-if='!registering')
label(for='usernameInput', v-once) {{$t('emailOrUsername')}}
input#usernameInput.form-control(type='text', :placeholder='$t("emailOrUsername")', v-model='username')
.form-group(v-if='registering')
label(for='emailInput', v-once) {{$t('email')}}
input#emailInput.form-control(type='email', :placeholder='$t("emailPlaceholder")', v-model='email')
.form-group
label(for='passwordInput', v-once) {{$t('password')}}
a.float-right.forgot-password(v-once, v-if='!registering', @click='forgotPassword = true') {{$t('forgotPassword')}}
input#passwordInput.form-control(type='password', :placeholder='$t(registering ? "passwordPlaceholder" : "password")', v-model='password')
.form-group(v-if='registering')
label(for='confirmPasswordInput', v-once) {{$t('confirmPassword')}}
input#confirmPasswordInput.form-control(type='password', :placeholder='$t("confirmPasswordPlaceholder")', v-model='passwordConfirm')
small.form-text(v-once, v-html="$t('termsAndAgreement')")
.text-center
.btn.btn-info(@click='register()', v-if='registering', v-once) {{$t('joinHabitica')}}
.btn.btn-info(@click='login()', v-if='!registering', v-once) {{$t('login')}}
</template>
<style lang="scss" scoped>
@import '~client/assets/scss/colors.scss';
.form {
margin: 0 auto;
width: 100%;
padding-top: 2em;
padding-bottom: 4em;
position: relative;
z-index: 1;
.form-group {
text-align: left;
font-weight: bold;
}
.social-button {
width: 100%;
text-align: center;
.text {
display: inline-block;
min-height: 0px;
}
}
.social-icon {
margin-right: 1em;
width: 18px;
height: 18px;
display: inline-block;
vertical-align: top;
margin-top: .2em;
}
small.form-text {
text-align: center;
}
}
</style>
<script>
import * as Analytics from 'client/libs/analytics';
import hello from 'hellojs';
import { setUpAxios } from 'client/libs/auth';
import facebookSquareIcon from 'assets/svg/facebook-square.svg';
import googleIcon from 'assets/svg/google.svg';
export default {
name: 'AuthForm',
data () {
let data = {
registering: true,
username: '',
email: '',
password: '',
passwordConfirm: '',
};
data.icons = Object.freeze({
facebookIcon: facebookSquareIcon,
googleIcon,
});
return data;
},
mounted () {
hello.init({
facebook: process.env.FACEBOOK_KEY, // eslint-disable-line
// windows: WINDOWS_CLIENT_ID,
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line
});
Analytics.track({
hitType: 'event',
eventCategory: 'group-plans-static',
eventAction: 'view',
eventLabel: 'view-auth-form',
});
},
methods: {
async socialAuth (network) {
let auth = await hello(network).login({
scope: 'email',
redirect_uri: '', // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
auth,
});
await this.finishAuth();
},
async register () {
if (!this.email) {
alert(this.$t('missingEmail'));
return;
}
if (this.password !== this.passwordConfirm) {
alert(this.$t('passwordConfirmationMatch'));
return;
}
try {
await this.$store.dispatch('auth:register', {
username: this.username,
email: this.email,
password: this.password,
passwordConfirm: this.passwordConfirm,
});
await this.finishAuth();
} catch (e) {
if (e.response.data.data && e.response.data.data.errors) {
const message = e.response.data.data.errors.map(error => `${error.message}\n`);
alert(message);
}
}
},
async finishAuth () {
setUpAxios();
await this.$store.dispatch('user:fetch', {forceLoad: true});
this.$emit('authenticate');
},
},
};
</script>
+2 -2
View File
@@ -14,7 +14,7 @@ div
p.time {{msg.timestamp | timeAgo}}
.text(v-markdown='msg.text')
hr
.action(@click='like()', v-if='msg.likes', :class='{active: msg.likes[user._id]}')
.action(@click='like()', v-if='!inbox && msg.likes', :class='{active: msg.likes[user._id]}')
.svg-icon(v-html="icons.like")
span(v-if='!msg.likes[user._id]') {{ $t('like') }}
span(v-if='msg.likes[user._id]') {{ $t('liked') }}
@@ -235,7 +235,7 @@ export default {
message.likes[this.user._id] = !message.likes[this.user._id];
}
this.$emit('messaged-liked', message);
this.$emit('message-liked', message);
},
copyAsTodo (message) {
this.$root.$emit('habitica::copy-as-todo', message);
@@ -22,7 +22,7 @@
:msg='msg',
:inbox='inbox',
:groupId='groupId',
@messaged-liked='messageLiked',
@message-liked='messageLiked',
@message-removed='messageRemoved',
@show-member-modal='showMemberModal')
.row(v-if='user._id === msg.uuid')
@@ -31,7 +31,7 @@
:msg='msg',
:inbox='inbox',
:groupId='groupId',
@messaged-liked='messageLiked',
@message-liked='messageLiked',
@message-removed='messageRemoved',
@show-member-modal='showMemberModal')
div(:class='inbox ? "col-4" : "col-2"')
@@ -0,0 +1,174 @@
<template lang="pug">
.create-group-modal-pages
.col-12(v-if='activePage === PAGES.CREATE_GROUP')
h2 {{ $t('nameYourGroup') }}
.form-group
label.control-label(for='new-group-name') {{ $t('name') }}
input.form-control#new-group-name.input-medium.option-content(required, type='text', :placeholder="$t('exampleGroupName')", v-model='newGroup.name')
.form-group
label(for='new-group-description') {{ $t('description') }}
textarea.form-control#new-group-description.option-content(cols='3', :placeholder="$t('exampleGroupDesc')", v-model='newGroup.description')
.form-group.text-left(v-if='newGroup.type === "guild"')
.custom-control.custom-radio
input.custom-control-input(type='radio', name='new-group-privacy', value='private', v-model='newGroup.privacy')
label.custom-control-label {{ $t('thisGroupInviteOnly') }}
.form-group.text-left
.custom-control.custom-checkbox
input.custom-control-input(type='checkbox', v-model='newGroup.leaderOnly.challenges' id='create-group-leaderOnlyChallenges-checkbox')
label.custom-control-label(for='create-group-leaderOnlyChallenges-checkbox') {{ $t('leaderOnlyChallenges') }}
.form-group(v-if='newGroup.type === "party"')
button.btn.btn-secondary.form-control(@click='createGroup()', :value="$t('createGroupPlan')")
.form-group
button.btn.btn-primary.btn-lg.btn-block(@click="createGroup()", :disabled="!newGroupIsReady") {{ $t('createGroupPlan') }}
.col-12(v-if='activePage === PAGES.PAY')
h2 {{ $t('choosePaymentMethod') }}
.payment-providers
.box.payment-button(@click='pay(PAYMENTS.STRIPE)')
.svg-icon.credit-card-icon(v-html="icons.creditCard")
.box.payment-button.amazon(@click='pay(PAYMENTS.AMAZON)')
.svg-icon.amazon-pay-icon(v-html="icons.amazonpay")
</template>
<style lang="scss" scoped>
h2 {
font-family: 'Varela Round', sans-serif;
font-weight: normal;
font-size: 29px;
color: #34313a;
margin-top: 1em;
}
.box {
border-radius: 2px;
background-color: #ffffff;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
padding: 2em;
text-align: center;
vertical-align: bottom;
height: 100px;
width: 306px;
margin: 0 auto;
margin-bottom: 1em;
}
.box .svg-icon {
margin: 0 auto;
}
.form-group {
text-align: left;
font-weight: bold;
}
.box:hover {
cursor: pointer;
opacity: 0.7;
}
.amazon-pay-icon {
width: 150px;
}
.credit-card-icon {
width: 150px;
color: #4e4a57;
}
.btn-block {
margin-bottom: 1em;
}
.payment-button.amazon {
margin-bottom: 2em;
}
</style>
<script>
import * as Analytics from 'client/libs/analytics';
import { mapState } from 'client/libs/store';
import paymentsMixin from '../../mixins/payments';
import amazonpay from 'assets/svg/amazonpay.svg';
import creditCard from 'assets/svg/credit-card.svg';
export default {
mixins: [paymentsMixin],
data () {
return {
amazonPayments: {},
icons: Object.freeze({
amazonpay,
creditCard,
}),
PAGES: {
CREATE_GROUP: 'create-group',
UPGRADE_GROUP: 'upgrade-group',
PAY: 'pay',
},
PAYMENTS: {
AMAZON: 'amazon',
STRIPE: 'stripe',
},
activePage: 'create-group',
newGroup: {
type: 'guild',
privacy: 'private',
name: '',
leaderOnly: {
challenges: false,
},
},
};
},
computed: {
...mapState({user: 'user.data'}),
newGroupIsReady () {
return Boolean(this.newGroup.name);
},
},
mounted () {
Analytics.track({
hitType: 'event',
eventCategory: 'group-plans-static',
eventAction: 'view',
eventLabel: 'create-group',
});
},
methods: {
changePage (page) {
Analytics.track({
hitType: 'event',
eventCategory: 'group-plans-static',
eventAction: 'view',
eventLabel: page,
});
this.activePage = page;
window.scrollTo(0, 0);
},
createGroup () {
this.changePage(this.PAGES.PAY);
},
pay (paymentMethod) {
const subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
let paymentData = {
subscription: subscriptionKey,
coupon: null,
};
if (this.upgradingGroup && this.upgradingGroup._id) {
paymentData.groupId = this.upgradingGroup._id;
} else {
paymentData.groupToCreate = this.newGroup;
}
this.paymentMethod = paymentMethod;
if (this.paymentMethod === this.PAYMENTS.STRIPE) {
this.showStripe(paymentData);
} else if (this.paymentMethod === this.PAYMENTS.AMAZON) {
paymentData.type = 'subscription';
this.amazonPaymentsInit(paymentData);
}
},
},
};
</script>
@@ -0,0 +1,235 @@
<template lang="pug">
b-modal#group-plan-overview(title="Empty", size='lg', hide-footer=true, @shown='shown()')
.header-wrap.text-center(slot="modal-header")
h2(v-once) {{ $t('gettingStarted') }}
p(v-once) {{ $t('congratsOnGroupPlan') }}
.row
.col-12
.card(:class='{expanded: expandedQuestions.question1}')
.question-head
.q Q.
.title {{ $t('whatsIncludedGroup') }}
.arrow.float-right(@click='toggle("question1")')
.svg-icon(v-html="icons.upIcon", v-if='expandedQuestions.question1')
.svg-icon(v-html="icons.downIcon", v-else)
.question-body(v-if='expandedQuestions.question1')
p {{ $t('whatsIncludedGroupDesc') }}
.col-12
.card(:class='{expanded: expandedQuestions.question2}')
.question-head
.q Q.
.title {{ $t('howDoesBillingWork') }}
.arrow.float-right(@click='toggle("question2")')
.svg-icon(v-html="icons.upIcon", v-if='expandedQuestions.question2')
.svg-icon(v-html="icons.downIcon", v-else)
.question-body(v-if='expandedQuestions.question2')
p {{ $t('howDoesBillingWorkDesc') }}
.col-12
.card(:class='{expanded: expandedQuestions.question3}')
.question-head
.q Q.
.title {{ $t('howToAssignTask') }}
.arrow.float-right(@click='toggle("question3")')
.svg-icon(v-html="icons.upIcon", v-if='expandedQuestions.question3')
.svg-icon(v-html="icons.downIcon", v-else)
.question-body(v-if='expandedQuestions.question3')
p {{ $t('howToAssignTaskDesc') }}
.assign-tasks.image-example
.col-12
.card(:class='{expanded: expandedQuestions.question4}')
.question-head
.q Q.
.title {{ $t('howToRequireApproval') }}
.arrow.float-right(@click='toggle("question4")')
.svg-icon(v-html="icons.upIcon", v-if='expandedQuestions.question4')
.svg-icon(v-html="icons.downIcon", v-else)
.question-body(v-if='expandedQuestions.question4')
p {{ $t('howToRequireApprovalDesc') }}
.requires-approval.image-example
p {{ $t('howToRequireApprovalDesc2') }}
.approval-requested.image-example
.col-12
.card(:class='{expanded: expandedQuestions.question5}')
.question-head
.q Q.
.title {{ $t('whatIsGroupManager') }}
.arrow.float-right(@click='toggle("question5")')
.svg-icon(v-html="icons.upIcon", v-if='expandedQuestions.question5')
.svg-icon(v-html="icons.downIcon", v-else)
.question-body(v-if='expandedQuestions.question5')
p {{ $t('whatIsGroupManagerDesc') }}
.promote-leader.image-example
.col-12.text-center
button.btn.btn-primary.close-button(@click='close()') {{ $t('goToTaskBoard') }}
</template>
<style>
#group-plan-overview___BV_modal_header_ {
border-bottom: none;
}
</style>
<style lang="scss" scoped>
@import url('https://fonts.googleapis.com/css?family=Varela+Round');
.header-wrap {
padding-left: 4em;
padding-right: 4em;
h2 {
font-size: 32px;
font-weight: bold;
margin-top: 1em;
}
p {
color: #878190;
font-size: 16px;
}
}
.row {
margin-bottom: 2em;
.col-12 {
margin-bottom: .5em;
}
}
.card.expanded {
padding-bottom: 1em;
.title {
color: #4f2a93;
}
}
.card {
min-height: 60px;
border-radius: 4px;
background-color: #ffffff;
border: none;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
.question-head {
.q {
font-family: 'Varela Round', sans-serif;
font-size: 20px;
color: #a5a1ac;
margin: 1em;
}
.title {
font-weight: normal;
}
div {
display: inline-block;
}
.arrow {
margin: 1em;
padding-top: .9em;
.svg-icon {
width: 26px;
height: 16px;
}
}
.arrow:hover {
cursor: pointer;
}
}
.question-body {
padding-left: 4.4em;
padding-right: 4em;
p {
color: #4e4a57;
}
}
}
.image-example {
background-repeat: no-repeat;
margin: 0 auto;
background-position: center;
background-size: contain;
}
.assign-tasks {
background-image: url('~assets/images/group-plans/assign-task@3x.png');
width: 400px;
height: 150px;
}
.requires-approval {
background-image: url('~assets/images/group-plans/requires-approval@3x.png');
width: 402px;
height: 20px;
margin-bottom: 1em;
}
.approval-requested {
background-image: url('~assets/images/group-plans/approval-requested@3x.png');
width: 471px;
height: 204px;
}
.promote-leader {
background-image: url('~assets/images/group-plans/promote-leader@3x.png');
width: 423px;
height: 185px;
}
.close-button {
margin-top: 1em;
}
</style>
<script>
import * as Analytics from 'client/libs/analytics';
import { mapState } from 'client/libs/store';
import upIcon from 'assets/svg/up.svg';
import downIcon from 'assets/svg/down.svg';
export default {
data () {
return {
icons: Object.freeze({
upIcon,
downIcon,
}),
expandedQuestions: {
question1: false,
question2: false,
question3: false,
question4: false,
question5: false,
},
};
},
computed: {
...mapState({user: 'user.data'}),
},
methods: {
shown () {
Analytics.track({
hitType: 'event',
eventCategory: 'button',
eventAction: 'click',
eventLabel: 'viewed-group-plan-overview',
});
},
toggle (question) {
this.expandedQuestions[question] = !this.expandedQuestions[question];
},
close () {
this.$root.$emit('bv::hide::modal', 'group-plan-overview');
},
},
};
</script>
@@ -1,5 +1,16 @@
<template lang="pug">
.standard-page
group-plan-overview-modal
task-modal(
:task="workingTask",
:purpose="taskFormPurpose",
@cancel="cancelTaskModal()",
ref="taskModal",
:groupId="groupId",
v-on:taskCreated='taskCreated',
v-on:taskEdited='taskEdited',
v-on:taskDestroyed='taskDestroyed'
)
.row.tasks-navigation
.col-12.col-md-4
h1 Group's Tasks
@@ -53,27 +64,17 @@
.d-flex.align-items-center
span(v-once) {{ $t('filter') }}
.svg-icon.filter-icon(v-html="icons.filter")
#create-dropdown.col-12.col-md-1.offset-md-3
b-dropdown(:right="true", :variant="'success'")
div(slot="button-content")
#create-dropdown.col-12.col-md-4
b-dropdown.float-right(:right="true", :variant="'success'")
.button-label(slot="button-content")
.svg-icon.positive(v-html="icons.positive")
| {{ $t('addTaskToGroupPlan') }}
b-dropdown-item(v-for="type in columns", :key="type", @click="createTask(type)")
span.dropdown-icon-item(v-once)
span.svg-icon.inline(v-html="icons[type]")
span.text {{$t(type)}}
task-modal(
:task="workingTask",
:purpose="taskFormPurpose",
@cancel="cancelTaskModal()",
ref="taskModal",
:groupId="groupId",
v-on:taskCreated='taskCreated',
v-on:taskEdited='taskEdited',
v-on:taskDestroyed='taskDestroyed'
)
.row
task-column.col-12.col-sm-6.col-3(
task-column.col-12.col-md-3(
v-for="column in columns",
:type="column",
:key="column",
@@ -224,12 +225,17 @@
}
}
}
.button-label {
display: inline-block;
}
</style>
<script>
import taskDefaults from 'common/script/libs/taskDefaults';
import TaskColumn from '../tasks/column';
import TaskModal from '../tasks/taskModal';
import GroupPlanOverviewModal from './groupPlanOverviewModal';
import positiveIcon from 'assets/svg/positive.svg';
import filterIcon from 'assets/svg/filter.svg';
@@ -250,9 +256,11 @@ export default {
components: {
TaskColumn,
TaskModal,
GroupPlanOverviewModal,
},
data () {
return {
openCreateBtn: false,
searchId: '',
columns: ['habit', 'daily', 'todo', 'reward'],
tasksByType: {
@@ -294,6 +302,10 @@ export default {
mounted () {
if (!this.searchId) this.searchId = this.groupId;
this.load();
if (this.$route.query.showGroupOverview) {
this.$root.$emit('bv::show::modal', 'group-plan-overview');
}
},
computed: {
...mapState({user: 'user.data'}),
@@ -5,10 +5,6 @@
label
strong(v-once) {{$t('name')}} *
b-form-input(type="text", :placeholder="$t('newGuildPlaceholder')", v-model="workingGroup.name")
.form-group(v-if='workingGroup.id && members.length > 0')
label
strong(v-once) {{$t('guildOrPartyLeader')}} *
group-member-search-dropdown(:text="currentLeader", :members='members', :groupId='workingGroup.id', @member-selected='selectNewLeader')
.form-group
label
strong(v-once) {{$t('privacySettings')}} *
@@ -202,7 +198,6 @@ export default {
guildLeaderCantBeMessaged: true,
privateGuild: true,
allowGuildInvitationsFromNonMembers: true,
newLeader: '',
},
categoryOptions: [
{
@@ -306,13 +301,6 @@ export default {
isParty () {
return this.workingGroup.type === 'party';
},
currentLeader () {
const currentLeader = this.members.find(member => {
return member._id === this.workingGroup.newLeader;
});
const currentLeaderName = currentLeader.profile ? currentLeader.profile.name : '';
return currentLeaderName;
},
},
watch: {
editingGroup () {
@@ -343,17 +331,10 @@ export default {
this.workingGroup.onlyLeaderCreatesChallenges = editingGroup.leaderOnly.challenges;
if (editingGroup.leader._id) {
this.workingGroup.newLeader = editingGroup.leader._id;
this.workingGroup.currentLeaderId = editingGroup.leader._id;
}
if (editingGroup._id) this.getMembers();
},
},
methods: {
selectNewLeader (member) {
this.workingGroup.newLeader = member._id;
},
async getMembers () {
if (!this.workingGroup.id) return;
let members = await this.$store.dispatch('members:getGroupMembers', {
@@ -427,9 +408,6 @@ export default {
this.workingGroup.categories = serverCategories;
let groupData = Object.assign({}, this.workingGroup);
if (groupData.newLeader === this.workingGroup.currentLeaderId) {
groupData.leader = this.workingGroup.currentLeaderId;
}
let newgroup;
if (groupData.id) {
@@ -474,7 +452,6 @@ export default {
guildLeaderCantBeMessaged: true,
privateGuild: true,
allowGuildInvitationsFromNonMembers: true,
newLeader: '',
};
},
},
@@ -171,6 +171,8 @@ div
color: #fff;
padding: 2em;
height: 356px;
margin-left: -12px;
margin-right: -12px;
h1 {
font-size: 48px;
@@ -340,7 +342,6 @@ export default {
UPGRADE_GROUP: 'upgrade-group',
PAY: 'pay',
},
// @TODO: Import from payment library?
PAYMENTS: {
AMAZON: 'amazon',
STRIPE: 'stripe',
@@ -55,10 +55,12 @@ div
.row.boss-details
.col-6
span.float-left
| {{parseFloat(group.quest.progress.hp).toFixed(2)}} / {{parseFloat(questData.boss.hp).toFixed(2)}}
| {{ Math.ceil(parseFloat(group.quest.progress.hp) * 100) / 100 }} / {{ parseFloat(questData.boss.hp).toFixed(2) }}
// current boss hp uses ceil so you don't underestimate damage needed to end quest
.col-6(v-if='userIsOnQuest')
// @TODO: Why do we not sync quset progress on the group doc? Each user could have different progress
span.float-right {{parseFloat(user.party.quest.progress.up).toFixed(1) || 0}} pending damage
// @TODO: Why do we not sync quest progress on the group doc? Each user could have different progress.
span.float-right {{ user.party.quest.progress.up | floor(10) }} {{ $t('pendingDamageLabel') }}
// player's pending damage uses floor so you don't overestimate damage you've already done
.row.rage-bar-row(v-if='questData.boss.rage')
.col-12
.grey-progress-bar
+2 -1
View File
@@ -765,7 +765,8 @@ export default {
},
pendingDamage () {
if (!this.user.party.quest.progress.up) return 0;
return parseFloat(this.user.party.quest.progress.up).toFixed(1);
return this.$options.filters.floor(this.user.party.quest.progress.up, 10);
// keep user's pending damage consistent with how it's displayed on the party page
},
bossCurrentHealth () {
if (!this.group.quest.progress.hp) return 0;
+2 -1
View File
@@ -62,7 +62,7 @@ div
span {{ userHourglasses }}
.item-with-icon
.top-menu-icon.svg-icon.gem(v-html="icons.gem", @click='showBuyGemsModal("gems")', v-b-tooltip.hover.bottom="$t('gems')")
span {{userGems | roundBigNumber}}
span {{userGems}}
.item-with-icon.gold
.top-menu-icon.svg-icon(v-html="icons.gold", v-b-tooltip.hover.bottom="$t('gold')")
span {{Math.floor(user.stats.gp * 100) / 100}}
@@ -210,6 +210,7 @@ div
&:hover {
background: $purple-300;
color: $white;
&:last-child {
border-bottom-right-radius: 5px;
@@ -351,7 +351,10 @@ export default {
},
hatchPet (potion, egg) {
this.$store.dispatch('common:hatch', {egg: egg.key, hatchingPotion: potion.key});
this.$root.$emit('hatchedPet::open', createAnimal(egg, potion, 'pet', this.content, this.user.items));
this.text(this.$t('hatchedPet', {egg: egg.key, potion: potion.key}));
if (this.user.preferences.suppressModals.hatchPet) return;
const newPet = createAnimal(egg, potion, 'pet', this.content, this.user.items);
this.$root.$emit('hatchedPet::open', newPet);
},
onDragEnd () {
this.currentDraggingPotion = null;
@@ -1,22 +1,14 @@
<template lang="pug">
b-modal#hatchedPet-modal(
:hide-header="true"
)
div.content(v-if="pet != null")
div.dialog-header.title(v-once) {{ $t('hatchedPetGeneric') }}
div.inner-content
div.pet-background
div(:class="pet.class")
h4.title {{ pet.name }}
div.text(v-if="!hideText", v-markdown="$t('hatchedPetHowToUse')")
button.btn.btn-primary(@click="close()") {{ $t('onward') }}
div.clearfix(slot="modal-footer")
b-modal#hatchedPet-modal(:hide-header="true")
div.content(v-if="pet != null")
div.dialog-header.title(v-once) {{ $t('hatchedPetGeneric') }}
div.inner-content
div.pet-background
div(:class="pet.class")
h4.title {{ pet.name }}
div.text(v-if="!hideText", v-markdown="$t('hatchedPetHowToUse')")
button.btn.btn-primary(@click="close()") {{ $t('onward') }}
div.clearfix(slot="modal-footer")
</template>
<style lang="scss">
@@ -56,7 +48,6 @@
color: $purple-200;
}
}
</style>
<script>
@@ -82,7 +73,6 @@
this.pet = item;
this.$root.$emit('bv::show::modal', 'hatchedPet-modal');
},
close () {
this.$emit('closed', this.item);
this.$root.$emit('bv::hide::modal', 'hatchedPet-modal');
@@ -52,7 +52,6 @@
:checked="hideMissing",
@change="updateHideMissing"
)
.standard-page
.clearfix
h1.float-left.mb-4.page-header(v-once) {{ $t('stable') }}
@@ -196,7 +195,6 @@
@itemDragStart="onDragStart($event, context.item)",
@itemClick="onFoodClicked($event, context.item)"
)
b-modal#welcome-modal(
:ok-only="true",
:ok-title="$t('gotIt')",
@@ -208,7 +206,6 @@
div.npc_matt
h1.page-header(v-once) {{ $t('welcomeStable') }}
div.content-text(v-once) {{ $t('welcomeStableText') }}
b-modal#hatching-modal(
@change="resetHatchablePet($event)"
)
@@ -218,7 +215,6 @@
div(:class="'Pet_HatchingPotion_'+hatchablePet.potionKey")
div.potionEggBackground
div(:class="'Pet_Egg_'+hatchablePet.eggKey")
h4.title {{ hatchablePet.name }}
div.text(v-html="$t('hatchDialogText', { potionName: hatchablePet.potionName, eggName: hatchablePet.eggName, petName: hatchablePet.name })")
@@ -243,6 +239,7 @@
div.food-icon(:class="'Pet_Food_'+currentDraggingFood.key")
div.popover
div.popover-content {{ $t('clickOnPetToFeed', {foodName: currentDraggingFood.text() }) }}
mount-raised-modal
</template>
<style lang='scss' scoped>
@@ -494,6 +491,7 @@
import MountItem from './mountItem.vue';
import FoodItem from './foodItem';
import HatchedPetDialog from './hatchedPetDialog';
import MountRaisedModal from './mountRaisedModal';
import Drawer from 'client/components/ui/drawer';
import toggleSwitch from 'client/components/ui/toggleSwitch';
import StarBadge from 'client/components/ui/starBadge';
@@ -533,6 +531,7 @@
CountBadge,
DrawerSlider,
HatchedPetDialog,
MountRaisedModal,
},
directives: {
resize: ResizeDirective,
@@ -543,10 +542,8 @@
return {
viewOptions: {},
hideMissing: false,
searchText: null,
searchTextThrottled: '',
// sort has the translation-keys as values
selectedSortBy: 'standard',
sortByItems: [
@@ -555,7 +552,6 @@
'sortByColor',
'sortByHatchable',
],
icons: Object.freeze({
information: svgInformation,
close: svgClose,
@@ -573,7 +569,6 @@
watch: {
searchText: _throttle(function throttleSearch () {
let search = this.searchText.toLowerCase();
this.searchTextThrottled = search;
}, 250),
},
@@ -584,8 +579,8 @@
currentMount: 'user.data.items.currentMount',
userItems: 'user.data.items',
hideDialog: 'user.data.flags.tutorial.common.mounts',
user: 'user.data',
}),
petGroups () {
let petGroups = [
{
@@ -676,7 +671,6 @@
return mountGroups;
},
drawerTabs () {
return [
{
@@ -751,7 +745,6 @@
return animals;
},
listAnimals (animalGroup, type, hideMissing, sort, searchText) {
let animals = this.getAnimalList(animalGroup, type);
let isPetList = type === 'pet';
@@ -805,7 +798,6 @@
return animalRows;
},
countOwnedAnimals (animalGroup, type) {
let animals = this.getAnimalList(animalGroup, type);
@@ -817,7 +809,6 @@
return `${countOwned.length}/${countAll}`;
},
pets (animalGroup, hideMissing, sortBy, searchText) {
let pets = this.listAnimals(animalGroup, 'pet', hideMissing, sortBy, searchText);
@@ -835,7 +826,6 @@
return groupBy(pets, groupKey);
},
mounts (animalGroup, hideMissing, sortBy, searchText) {
let mounts = this.listAnimals(animalGroup, 'mount', hideMissing, sortBy, searchText);
@@ -853,7 +843,6 @@
return groupBy(mounts, groupKey);
},
getPetItemClass (pet) {
if (pet.isOwned()) {
return `Pet Pet-${pet.key} ${pet.eggKey}`;
@@ -869,31 +858,25 @@
return 'GreyedOut PixelPaw';
},
hasDrawerTabItems (index) {
return this.drawerTabs && this.drawerTabs[index].items.length !== 0;
},
// Actions
updateHideMissing (newVal) {
this.hideMissing = newVal;
},
selectPet (item) {
this.$store.dispatch('common:equip', {key: item.key, type: 'pet'});
},
selectMount (item) {
this.$store.dispatch('common:equip', {key: item.key, type: 'mount'});
},
hatchPet (pet) {
this.$store.dispatch('common:hatch', {egg: pet.eggKey, hatchingPotion: pet.potionKey});
this.closeHatchPetDialog();
// this.$root.$emit('hatchedPet::open', pet);
},
this.$store.dispatch('common:hatch', {egg: pet.eggKey, hatchingPotion: pet.potionKey});
this.text(this.$t('hatchedPet', {egg: pet.eggKey, potion: pet.potionKey}));
},
onDragStart (ev, food) {
this.currentDraggingFood = food;
@@ -903,7 +886,6 @@
dragEvent.dataTransfer.setDragImage(itemRef, -20, -20);
},
onDragOver (ev, pet) {
if (!pet.isAllowedToFeed()) {
ev.dropable = false;
@@ -911,7 +893,6 @@
this.highlightPet = pet.key;
}
},
async onDrop (ev, pet) {
this.highlightPet = '';
@@ -922,11 +903,9 @@
this.currentDraggingFood = null;
this.highlightPet = '';
},
onDragLeave () {
this.highlightPet = '';
},
petClicked (pet) {
if (this.currentDraggingFood !== null) {
if (pet.isAllowedToFeed()) {
@@ -944,18 +923,22 @@
if (!pet.isHatchable()) {
return;
}
// opens the hatch dialog
this.hatchablePet = pet;
if (this.user.preferences.suppressModals.raisePet) {
this.hatchPet(pet);
return;
}
// Confirm
this.hatchablePet = pet;
this.$root.$emit('bv::show::modal', 'hatching-modal');
}
},
async feedAction (petKey, foodKey) {
const result = await this.$store.dispatch('common:feed', {pet: petKey, food: foodKey});
if (result.message) {
this.text(result.message);
}
if (result.message) this.text(result.message);
if (this.user.preferences.suppressModals.raisePet) return;
if (this.user.items.pets[petKey] === -1) this.$root.$emit('habitica::mount-raised', petKey);
},
closeHatchPetDialog () {
this.$root.$emit('bv::hide::modal', 'hatching-modal');
@@ -986,7 +969,6 @@
lastMouseMoveEvent = $event;
}
},
hideFlag () {
this.$store.dispatch('user:set', {
'flags.tutorial.common.mounts': true,
@@ -0,0 +1,97 @@
<template lang="pug">
b-modal#mount-raised-modal(:hide-header="true")
div.content(v-if="mount != null")
div.dialog-header.title(v-once) {{ $t('raisedPet', {pet: mount.text()}) }}
div.inner-content
div.pet-background
.mount(:class="`Mount_Icon_${mount.key}`")
h4.title {{ mount.text() }}
button.btn.btn-primary.onward(@click="close()") {{ $t('onward') }}
div.clearfix(slot="modal-footer")
</template>
<style lang="scss" scoped>
@import '~client/assets/scss/colors.scss';
@import '~client/assets/scss/modal.scss';
#mount-raised-modal {
@include centeredModal();
.modal-dialog {
width: 330px;
}
.content {
text-align: center;
}
.inner-content {
margin: 24px auto auto;
display: flex;
flex-direction: column;
align-items: center;
}
.pet-background {
width: 112px;
height: 112px;
border-radius: 4px;
background-color: $gray-700;
}
.mount {
margin: 0 auto;
}
.dialog-header {
color: $purple-200;
}
.onward {
margin-top: 1em;
margin-bottom: 1em;
}
}
</style>
<script>
import markdownDirective from 'client/directives/markdown';
import {mountInfo} from 'common/script/content/stable';
export default {
data () {
return {
mount: null,
};
},
directives: {
markdown: markdownDirective,
},
created () {
},
mounted () {
this.$root.$on('habitica::mount-raised', this.openDialog);
},
destroyed () {
this.$root.$off('habitica::mount-raised', this.openDialog);
},
methods: {
openDialog (mountKey) {
this.mount = mountInfo[mountKey];
this.$root.$emit('bv::show::modal', 'mount-raised-modal');
},
close () {
this.$root.$emit('bv::hide::modal', 'mount-raised-modal');
this.mount = null;
},
},
props: {
hideText: {
type: Boolean,
},
},
};
</script>
@@ -24,6 +24,7 @@
</style>
<script>
import * as Analytics from 'client/libs/analytics';
import axios from 'axios';
import { mapState } from 'client/libs/store';
@@ -222,6 +223,21 @@ export default {
let newGroup = response.data.data;
if (newGroup && newGroup._id) {
// Handle new user signup
if (!this.$store.state.isUserLoggedIn) {
const habiticaUrl = `${location.protocol}//${location.host}`;
Analytics.track({
hitType: 'event',
eventCategory: 'group-plans-static',
eventAction: 'view',
eventLabel: 'paid-with-amazon',
});
location.href = `${habiticaUrl}/group-plans/${newGroup._id}/task-information?showGroupOverview=true`;
return;
}
// @TODO: Just append? or $emit?
this.$router.push(`/group-plans/${newGroup._id}/task-information`);
this.user.guilds.push(newGroup._id);
@@ -181,11 +181,13 @@ export default {
this.members = members;
}
if (this.$store.state.memberModalOptions.viewingMembers.length > 0) {
this.members = this.$store.state.viewingMembers;
if ((!this.members || this.members.length === 0) &&
this.$store.state.memberModalOptions.viewingMembers.length > 0
) {
this.members = this.$store.state.memberModalOptions.viewingMembers;
}
if (this.members.length === 0 && !this.groupId) {
if (!this.members || this.members.length === 0 && !this.groupId) {
this.members = [this.user];
}
},
@@ -59,7 +59,7 @@ transition(name="fade")
.text {
text-align: center;
padding: .5em;
padding: .5em 1.5em;
}
.svg-icon {
+209 -47
View File
@@ -1,74 +1,236 @@
<template lang="pug">
div
.container-fluid
.row
.group-plan-static.text-center
amazon-payments-modal
.container
.row.top
.top-left
.col-6.offset-3
button.btn.btn-primary.btn-lg.btn-block(@click="goToNewGroupPage()") {{ $t('getAGroupPlanToday') }}
img.party(src='../../assets/images/group-plans-static/party@3x.png')
h1 {{ $t('groupPlanTitle') }}
p {{ $t('groupPlanDesc') }}
.pricing
span Just
span.number $9
span.bold per month +
span.number $3
span.bold per member*
.text-center
button.btn.btn-primary.cta-button(@click="goToNewGroupPage()") {{ $t('getStarted') }}
small {{ $t('billedMonthly') }}
.top-right
.row
.text-col.col-12.col-md-6.text-left
h2 {{ $t('teamBasedTasksList') }}
p {{ $t('teamBasedTasksListDesc') }}
.col-12.col-md-6
.team-based(v-html='svg.teamBased')
.row
.col-12.col-md-6
.group-management(v-html='svg.groupManagement')
.text-col.col-12.col-md-6.text-left
h2 {{ $t('groupManagementControls') }}
p {{ $t('groupManagementControlsDesc') }}
.row
.col-12.col-md-6.offset-md-3.text-center
img.big-gem(src='../../assets/images/group-plans-static/big-gem@3x.png')
h2 {{ $t('inGameBenefits') }}
p {{ $t('inGameBenefitsDesc') }}
.row
.bot-left
.col-6.offset-3
br
.text-center {{ $t('groupSubscriptionPrice') }}
hr
.col-6.offset-3.text-center
.row.row-margin(style="font-size: 2rem;")
span {{ $t('enterprisePlansDescription') }}
.row.row-margin
// TODO
a.btn.btn-primary.btn-lg.btn-block(:href="'mailto:vicky@habitica.com?subject=' + enterprisePlansEmailSubject") {{ $t('enterprisePlansButton') }}
br
.row.row-margin(style="font-size: 2rem;")
span {{ $t('familyPlansDescription') }}
.row.row-margin
a.btn.btn-primary.btn-lg.btn-block(href="https://docs.google.com/forms/d/e/1FAIpQLSerMKkaCg3UcgpcMvBJtlNgnF9DNY8sxCebpAT-GHeDAQASPQ/viewform?usp=sf_link") {{ $t('familyPlansButton') }}
h2.purple {{ $t('inspireYourParty') }}
.pricing
span Just
span.number $9
span.bold per month +
span.number $3
span.bold per member*
.text-center
button.btn.btn-primary.cta-button(@click="goToNewGroupPage()") {{ $t('getStarted') }}
small {{ $t('billedMonthly') }}
.bot-right
b-modal#group-plan(title="", size='md', :hide-footer='true', :hide-header='true')
div(v-if='modalPage === "account"')
h2 {{ $t('letsMakeAccount') }}
auth-form(@authenticate='authenticate()')
div(v-if='modalPage === "purchaseGroup"')
create-group-modal-pages
</template>
<style lang='scss' scoped>
.main {
@import url('https://fonts.googleapis.com/css?family=Varela+Round');
h1, h2 {
font-family: 'Varela Round', sans-serif;
font-weight: normal;
}
.party {
width: 386px;
margin-top: 4em;
}
.team-based {
background-image: url('../../assets/images/group-plans-static/group-management@3x.png');
background-size: contain;
position: absolute;
height: 356px;
width: 411px;
margin-top: -2em;
}
.group-management {
background-image: url('../../assets/images/group-plans-static/team-based@3x.png');
background-size: contain;
position: absolute;
height: 294px;
width: 411px;
}
.top-left, .top-right, .bot-left, .bot-right {
width: 273px;
height: 396px;
background-size: contain;
position: absolute;
}
.top-left {
background-image: url('../../assets/images/group-plans-static/top-left@3x.png');
left: 4em;
height: 420px;
}
.top-right {
background-image: url('../../assets/images/group-plans-static/top-right@3x.png');
right: 4em;
height: 420px;
}
.bot-left {
background-image: url('../../assets/images/group-plans-static/bot-left@3x.png');
left: 4em;
bottom: 1em;
}
.bot-right {
background-image: url('../../assets/images/group-plans-static/bot-right@3x.png');
right: 4em;
bottom: 1em;
}
h1 {
font-size: 42px;
color: #34313a;
line-height: 1.17;
}
h2 {
font-size: 29px;
color: #34313a;
margin-top: 1em;
}
.purple {
color: #6133b4;
}
p {
font-size: 20px;
color: #878190;
}
.group-plan-static {
margin-top: 6em;
position: relative;
}
.row {
margin-top: 10em;
margin-bottom: 10em;
}
.text-col {
margin-top: 3em;
}
.big-gem {
width: 138.5px;
}
.cta-button {
font-family: 'Varela Round', sans-serif;
font-weight: normal;
padding: 1em 2em;
margin-top: 1em;
margin-bottom: 1em;
border-radius: 4px;
background-color: #6133b4;
box-shadow: inset 0 -4px 0 0 rgba(52, 49, 58, 0.4);
font-size: 20px;
color: #fff;
}
.pricing {
color: #878190;
font-size: 24px;
span {
margin-right: .2em;
}
.bold {
font-weight: bold;
}
.number {
color: #1ca372;
font-weight: bold;
}
}
small {
font-size: 16px;
color: #a5a1ac;
}
</style>
<script>
import { setup as setupPayments } from 'client/libs/payments';
import amazonPaymentsModal from 'client/components/payments/amazonModal';
import StaticHeader from './header.vue';
import * as Analytics from 'client/libs/analytics';
import AuthForm from '../auth/authForm.vue';
import CreateGroupModalPages from '../group-plans/createGroupModalPages.vue';
import party from '../../assets/images/group-plans-static/party.svg';
export default {
components: {
StaticHeader,
AuthForm,
CreateGroupModalPages,
amazonPaymentsModal,
},
data () {
return {
enterprisePlansEmailSubject: 'Question regarding Enterprise Plans',
svg: {
party,
},
modalTitle: this.$t('register'),
modalPage: 'account',
};
},
mounted () {
this.$nextTick(() => {
// Load external scripts after the app has been rendered
setupPayments();
});
},
methods: {
goToNewGroupPage () {
if (!this.$store.state.isUserLoggedIn) {
this.$router.push({
name: 'register',
query: {
redirectTo: '/group-plans',
},
});
return;
}
this.$router.push('/group-plans');
this.$root.$emit('bv::show::modal', 'group-plan');
},
contactUs () {
Analytics.track({
hitType: 'event',
eventCategory: 'button',
eventAction: 'click',
eventLabel: 'Contact Us (Plans)',
});
window.location.href = `mailto:vicky@habitica.com?subject=${ this.enterprisePlansEmailSubject }`;
authenticate () {
this.modalPage = 'purchaseGroup';
},
},
};
+4 -1
View File
@@ -2,7 +2,8 @@
nav.navbar.navbar-inverse.fixed-top.navbar-expand-sm
.navbar-header
router-link.nav-item(:to='!isUserLoggedIn ? "/static/home" : "/"')
.logo.svg-icon(v-html='icons.logo')
.logo.svg-icon(v-html='icons.purpleLogo', v-if='this.$route.name === "plans"')
.logo.svg-icon(v-html='icons.logo', v-else)
.collapse.navbar-collapse
ul.navbar-nav.mr-auto(v-if='$route.name !== "home"')
router-link.nav-item(tag='li', to='/static/features')
@@ -152,6 +153,7 @@
<script>
import logo from 'assets/svg/logo.svg';
import purpleLogo from 'assets/svg/purple-logo.svg';
import * as Analytics from 'client/libs/analytics';
export default {
@@ -159,6 +161,7 @@ export default {
return {
icons: Object.freeze({
logo,
purpleLogo,
}),
};
},
@@ -1,14 +1,14 @@
<template lang="pug">
div
static-header(v-if='showContentWrap', :class='{"home-header": ["home", "front"].indexOf($route.name) !== -1}')
static-header(v-if='showContentWrap', :class='{"home-header": ["home", "front"].indexOf($route.name) !== -1, "white-header": this.$route.name === "plans"}')
.static-wrapper
router-view
#purple-footer(v-if='showContentWrap')
div(:id='footerId', v-if='showContentWrap')
app-footer
#bottom-wrap.purple-4(v-if='showContentWrap')
#bottom-wrap.purple-4(v-if='showContentWrap && footerId')
#bottom-background
.seamless_mountains_demo_repeat
.midground_foreground_extended2
@@ -57,6 +57,19 @@ div
}
}
.white-header {
background: #fff !important;
background-color: #fff !important;
a {
color: #271b3d !important;
}
a:hover {
color: #fff !important;
}
}
#bottom-wrap.purple-4 {
background-color: #271b3d;
}
@@ -156,6 +169,10 @@ export default {
showContentWrap () {
return this.$route.name !== 'news';
},
footerId () {
if (this.$route.name === 'plans') return;
return 'purple-footer';
},
},
};
</script>
+1 -1
View File
@@ -584,7 +584,7 @@ export default {
/* eslint-disable no-extra-parens */
return (
task.text.toLowerCase().indexOf(searchTextLowerCase) > -1 ||
(task.note && task.note.toLowerCase().indexOf(searchTextLowerCase) > -1) ||
(task.notes && task.notes.toLowerCase().indexOf(searchTextLowerCase) > -1) ||
(task.checklist && task.checklist.length > 0 &&
task.checklist.some(checkItem => checkItem.text.toLowerCase().indexOf(searchTextLowerCase) > -1))
);
@@ -1,6 +1,6 @@
<template lang="pug">
form(v-if="task", @submit.stop.prevent="submit()")
b-modal#task-modal(size="sm", @hidden="onClose()")
b-modal#task-modal(size="sm", @hidden="onClose()", @shown="focusInput()")
.task-modal-header(slot="modal-header", :class="cssClass('bg')")
.clearfix
h1.float-left {{ title }}
@@ -12,7 +12,8 @@
input.form-control.title-input(
type="text",
required, v-model="task.text",
autofocus, spellcheck="true",
ref="inputToFocus",
spellcheck="true",
:disabled="groupAccessRequiredAndOnPersonalPage || challengeAccessRequired"
)
.form-group
@@ -963,6 +964,9 @@ export default {
userId: memberId,
});
},
focusInput () {
this.$refs.inputToFocus.focus();
},
},
};
</script>
+14 -387
View File
@@ -24,7 +24,7 @@ div
@click="adminReinstateChat()", v-b-tooltip.hover.bottom="'Admin - Reinstate Chat Privileges'")
.svg-icon.positive-icon(v-html="icons.challenge")
button.btn.btn-secondary.positive-icon(v-if='!hero.auth.blocked',
@click="adminBlockUser()", v-b-tooltip.hover.right="'Admin - Block User'")
@click="adminBlockUser()", v-b-tooltip.hover.right="'Admin - Ban User'")
.svg-icon.positive-icon(v-html="icons.lock")
button.btn.btn-secondary.positive-icon(v-if='hero.auth.blocked',
@click="adminUnblockUser()", v-b-tooltip.hover.right="'Admin - Unblock User'")
@@ -134,146 +134,11 @@ div
h2.text-center {{$t('questsCompleted')}}
div(v-for='(value, key) in user.achievements.quests')
span {{ content.quests[key].text() }} ({{ value }})
#stats.standard-page(v-show='selectedPage === "stats"', v-if='user.preferences')
.row
.col-12.col-md-6
h2.text-center {{$t('equipment')}}
.well
.col-12.col-md-4.item-wrapper(v-for="(label, key) in equipTypes")
.box(
:id="key",
v-if="label !== 'skip'",
:class='{white: equippedItems[key] && equippedItems[key].indexOf("base_0") === -1}'
)
div(:class="`shop_${equippedItems[key]}`")
b-popover(
v-if="label !== 'skip' && equippedItems[key] && equippedItems[key].indexOf('base_0') === -1",
:target="key",
triggers="hover",
:placement="'bottom'",
:preventOverflow="false",
)
h4.gearTitle {{ getGearTitle(equippedItems[key]) }}
attributesGrid.attributesGrid(
:item="content.gear.flat[equippedItems[key]]",
)
h3(v-if="label !== 'skip'") {{ label }}
.col-12.col-md-6
h2.text-center {{$t('costume')}}
.well
// Use similar for loop for costume items, except show background if label is 'skip'.
.col-12.col-md-4.item-wrapper(v-for="(label, key) in equipTypes")
// Append a "C" to the key name since HTML IDs have to be unique.
.box(
:id="key + 'C'",
v-if="label !== 'skip'",
:class='{white: costumeItems[key] && costumeItems[key].indexOf("base_0") === -1}'
)
div(:class="`shop_${costumeItems[key]}`")
// Show background on 8th tile rather than a piece of equipment.
.box(v-if="label === 'skip'",
:class='{white: user.preferences.background}', style="overflow:hidden"
)
div(:class="'icon_background_' + user.preferences.background")
b-popover(
v-if="label !== 'skip' && costumeItems[key] && costumeItems[key].indexOf('base_0') === -1",
:target="key + 'C'",
triggers="hover",
:placement="'bottom'",
:preventOverflow="false",
)
h4.gearTitle {{ getGearTitle(costumeItems[key]) }}
attributesGrid.attributesGrid(
:item="content.gear.flat[costumeItems[key]]",
)
h3(v-if="label !== 'skip'") {{ label }}
h3(v-else) {{ $t('background') }}
.row.pet-mount-row
.col-12.col-md-6
h2.text-center(v-once) {{ $t('pets') }}
.well.pet-mount-well
.row.col-12
.col-12.col-md-4
.box(:class='{white: user.items.currentPet}')
.Pet(:class="`Pet-${user.items.currentPet}`")
.col-12.col-md-8
div
| {{ formatAnimal(user.items.currentPet, 'pet') }}
div
strong {{ $t('petsFound') }}:
| {{ totalCount(user.items.pets) }}
div
strong {{ $t('beastMasterProgress') }}:
| {{ beastMasterProgress(user.items.pets) }}
.col-12.col-md-6
h2.text-center(v-once) {{ $t('mounts') }}
.well.pet-mount-well
.row.col-12
.col-12.col-md-4
.box(:class='{white: user.items.currentMount}')
.mount(:class="`Mount_Icon_${user.items.currentMount}`")
.col-12.col-md-8
div
| {{ formatAnimal(user.items.currentMount, 'mount') }}
div
strong {{ $t('mountsTamed') }}:
span {{ totalCount(user.items.mounts) }}
div
strong {{ $t('mountMasterProgress') }}:
span {{ mountMasterProgress(user.items.mounts) }}
#attributes.row
hr.col-12
h2.col-12 {{$t('attributes')}}
.col-12.col-md-6(v-for="(statInfo, stat) in stats")
.row.col-12.stats-column
.col-12.col-md-4.attribute-label
span.hint(:popover-title='$t(statInfo.title)', popover-placement='right',
:popover='$t(statInfo.popover)', popover-trigger='mouseenter')
.stat-title(:class='stat') {{ $t(statInfo.title) }}
strong.number {{ statsComputed[stat] | floorWholeNumber }}
.col-12.col-md-6
ul.bonus-stats
li
strong {{$t('level')}}:
| {{statsComputed.levelBonus[stat]}}
li
strong {{$t('equipment')}}:
| {{statsComputed.gearBonus[stat]}}
li
strong {{$t('class')}}:
| {{statsComputed.classBonus[stat]}}
li
strong {{$t('allocated')}}:
| {{user.stats[stat]}}
li
strong {{$t('buffs')}}:
| {{user.stats.buffs[stat]}}
#allocation(v-if='user._id === userLoggedIn._id && hasClass')
.row.title-row
.col-12.col-md-6
h3(v-if='userLevel100Plus', v-once, v-html="$t('noMoreAllocate')")
h3(v-if='user.stats.points || userLevel100Plus')
| {{$t('pointsAvailable')}}
.counter.badge(v-if='user.stats.points || userLevel100Plus')
| {{user.stats.points}}&nbsp;
.col-12.col-md-6
.float-right
toggle-switch(:label="$t('autoAllocation')",
v-model='user.preferences.automaticAllocation',
@change='userset({"preferences.automaticAllocation": Boolean(user.preferences.automaticAllocation), "preferences.allocationMode": "taskbased"})')
.row
.col-12.col-md-3(v-for='(statInfo, stat) in allocateStatsList')
.box.white.row.col-12
.col-12
div(:class='stat') {{ $t(stats[stat].title) }}
.number {{ user.stats[stat] }}
.points {{$t('pts')}}
.col-12.col-md-4
.up(v-if='user.stats.points', @click='allocate(stat)')
profileStats(
:user='user',
v-show='selectedPage === "stats"',
:showAllocation='showAllocation()',
v-if='user.preferences')
send-gems-modal(:userReceivingGems='userReceivingGems')
</template>
@@ -345,15 +210,6 @@ div
color: #686274;
}
.pet-mount-row {
margin-top: 2em;
margin-bottom: 2em;
}
.mount {
margin-top: -0.2em !important;
}
.photo img {
max-width: 100%;
}
@@ -385,33 +241,6 @@ div
cursor: pointer;
}
#attributes {
.number {
font-size: 64px;
font-weight: bold;
color: #686274;
}
.attribute-label {
text-align: center;
}
}
.well {
background-color: #edecee;
border-radius: 2px;
padding: 0.4em;
padding-top: 1em;
}
.well.pet-mount-well {
padding-bottom: 1em;
strong {
margin-right: .2em;
}
}
#achievements {
.box {
margin: 0 auto;
@@ -470,107 +299,7 @@ div
}
}
#stats {
.box div {
margin: 0 auto;
margin-top: 1em;
}
}
.stats-column {
border-radius: 2px;
background-color: #ffffff;
padding: .5em;
margin-bottom: 1em;
ul {
list-style-type: none;
li strong {
margin-right: .3em;
}
}
}
.stat-title {
text-transform: uppercase;
}
.str {
color: #f74e52;
}
.int {
color: #2995cd;
}
.con {
color: #ffa623;
}
.per {
color: #4f2a93;
}
#allocation {
.title-row {
margin-top: 1em;
margin-bottom: 1em;
}
.counter.badge {
position: relative;
top: -0.25em;
left: 0.5em;
color: #fff;
background-color: #ff944c;
box-shadow: 0 1px 1px 0 rgba(26, 24, 29, 0.12);
width: 24px;
height: 24px;
border-radius: 50%;
}
.box {
width: 148px;
height: 84px;
padding: .5em;
margin: 0 auto;
div {
margin-top: 0;
}
.number {
font-size: 40px;
text-align: left;
color: #686274;
display: inline-block;
}
.points {
display: inline-block;
font-weight: bold;
line-height: 1.67;
text-align: left;
color: #878190;
margin-left: .5em;
}
.up {
border: solid #a5a1ac;
border-width: 0 3px 3px 0;
display: inline-block;
padding: 3px;
transform: rotate(-135deg);
-webkit-transform: rotate(-135deg);
margin-top: 1em;
}
.up:hover {
cursor: pointer;
}
}
}
</style>
<script>
@@ -578,25 +307,17 @@ import moment from 'moment';
import axios from 'axios';
import each from 'lodash/each';
import { mapState } from 'client/libs/store';
import size from 'lodash/size';
import keys from 'lodash/keys';
import cloneDeep from 'lodash/cloneDeep';
import { beastMasterProgress, mountMasterProgress } from '../../../common/script/count';
import statsComputed from '../../../common/script/libs/statsComputed';
import autoAllocate from '../../../common/script/fns/autoAllocate';
import allocate from '../../../common/script/ops/stats/allocate';
import MemberDetails from '../memberDetails';
import sendGemsModal from 'client/components/payments/sendGemsModal';
import markdown from 'client/directives/markdown';
import toggleSwitch from 'client/components/ui/toggleSwitch';
import achievementsLib from '../../../common/script/libs/achievements';
// @TODO: EMAILS.COMMUNITY_MANAGER_EMAIL
const COMMUNITY_MANAGER_EMAIL = 'admin@habitica.com';
import Content from '../../../common/script/content';
import attributesGrid from 'client/components/inventory/equipment/attributesGrid';
const DROP_ANIMALS = keys(Content.pets);
const TOTAL_NUMBER_OF_DROP_ANIMALS = DROP_ANIMALS.length;
import profileStats from './profileStats';
import message from 'assets/svg/message.svg';
import gift from 'assets/svg/gift.svg';
@@ -616,8 +337,7 @@ export default {
components: {
sendGemsModal,
MemberDetails,
toggleSwitch,
attributesGrid,
profileStats,
},
data () {
return {
@@ -649,41 +369,6 @@ export default {
selectedPage: 'profile',
achievements: {},
content: Content,
equipTypes: {
eyewear: this.$t('eyewear'),
head: this.$t('headgearCapitalized'),
headAccessory: this.$t('headAccess'),
back: this.$t('backAccess'),
armor: this.$t('armorCapitalized'),
body: this.$t('bodyAccess'),
weapon: this.$t('mainHand'),
_skip: 'skip',
shield: this.$t('offHand'),
},
stats: {
str: {
title: 'strength',
popover: 'strengthText',
},
int: {
title: 'intelligence',
popover: 'intText',
},
con: {
title: 'constitution',
popover: 'conText',
},
per: {
title: 'perception',
popover: 'perText',
},
},
allocateStatsList: {
str: { title: 'allocateStr', popover: 'strengthText', allocatepop: 'allocateStrPop' },
int: { title: 'allocateInt', popover: 'intText', allocatepop: 'allocateIntPop' },
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
},
};
},
mounted () {
@@ -746,12 +431,7 @@ export default {
incentivesProgress () {
return this.getIncentivesProgress();
},
statsComputed () {
return statsComputed(this.user);
},
userLevel100Plus () {
return this.user.stats.lvl >= 100;
},
classText () {
let classTexts = {
warrior: this.$t('warrior'),
@@ -786,9 +466,6 @@ export default {
userName: this.user.profile.name,
});
},
getGearTitle (key) {
return this.flatGear[key].text();
},
getProgressDisplay () {
// let currentLoginDay = Content.loginIncentives[this.user.loginIncentives];
// if (!currentLoginDay) return this.$t('checkinReceivedAllRewardsMessage');
@@ -828,60 +505,6 @@ export default {
this.editing = false;
},
formatAnimal (animalName, type) {
if (type === 'pet') {
if (Content.petInfo.hasOwnProperty(animalName)) {
return Content.petInfo[animalName].text();
} else {
return this.$t('noActivePet');
}
} else if (type === 'mount') {
if (Content.mountInfo.hasOwnProperty(animalName)) {
return Content.mountInfo[animalName].text();
} else {
return this.$t('noActiveMount');
}
}
},
formatBackground (background) {
let bg = Content.appearances.background;
if (bg.hasOwnProperty(background)) {
return `${bg[background].text()} (${this.$t(bg[background].set.text)})`;
}
return this.$t('noBackground');
},
totalCount (objectToCount) {
let total = size(objectToCount);
return total;
},
beastMasterProgress (pets) {
let dropPetsFound = beastMasterProgress(pets);
let display = this.formatOutOfTotalDisplay(dropPetsFound, TOTAL_NUMBER_OF_DROP_ANIMALS);
return display;
},
mountMasterProgress (mounts) {
let dropMountsFound = mountMasterProgress(mounts);
let display = this.formatOutOfTotalDisplay(dropMountsFound, TOTAL_NUMBER_OF_DROP_ANIMALS);
return display;
},
formatOutOfTotalDisplay (stat, totalStat) {
let display = `${stat}/${totalStat}`;
return display;
},
allocate (stat) {
allocate(this.user, {query: { stat }});
axios.post(`/api/v3/user/allocate?stat=${stat}`);
},
allocateNow () {
autoAllocate(this.user);
},
userset (settings) {
this.$store.dispatch('user:set', settings);
},
blockUser () {
this.userLoggedIn.inbox.blocks.push(this.user._id);
axios.post(`/api/v3/user/block/${this.user._id}`);
@@ -925,6 +548,10 @@ export default {
this.hero = await this.$store.dispatch('hall:getHero', { uuid: this.user._id });
this.adminToolsLoaded = true;
},
showAllocation () {
return this.user._id === this.userLoggedIn._id && this.hasClass;
},
},
};
</script>
@@ -0,0 +1,460 @@
<template lang="pug">
#stats.standard-page
.row
.col-12.col-md-6
h2.text-center {{$t('equipment')}}
.well
.col-12.col-md-4.item-wrapper(v-for="(label, key) in equipTypes")
.box(
:id="key",
v-if="label !== 'skip'",
:class='{white: equippedItems[key] && equippedItems[key].indexOf("base_0") === -1}'
)
div(:class="`shop_${equippedItems[key]}`")
b-popover(
v-if="label !== 'skip' && equippedItems[key] && equippedItems[key].indexOf('base_0') === -1",
:target="key",
triggers="hover",
:placement="'bottom'",
:preventOverflow="false",
)
h4.gearTitle {{ getGearTitle(equippedItems[key]) }}
attributesGrid.attributesGrid(
:item="content.gear.flat[equippedItems[key]]",
)
h3(v-if="label !== 'skip'") {{ label }}
.col-12.col-md-6
h2.text-center {{$t('costume')}}
.well
// Use similar for loop for costume items, except show background if label is 'skip'.
.col-12.col-md-4.item-wrapper(v-for="(label, key) in equipTypes")
// Append a "C" to the key name since HTML IDs have to be unique.
.box(
:id="key + 'C'",
v-if="label !== 'skip'",
:class='{white: costumeItems[key] && costumeItems[key].indexOf("base_0") === -1}'
)
div(:class="`shop_${costumeItems[key]}`")
// Show background on 8th tile rather than a piece of equipment.
.box(v-if="label === 'skip'",
:class='{white: user.preferences.background}', style="overflow:hidden"
)
div(:class="'icon_background_' + user.preferences.background")
b-popover(
v-if="label !== 'skip' && costumeItems[key] && costumeItems[key].indexOf('base_0') === -1",
:target="key + 'C'",
triggers="hover",
:placement="'bottom'",
:preventOverflow="false",
)
h4.gearTitle {{ getGearTitle(costumeItems[key]) }}
attributesGrid.attributesGrid(
:item="content.gear.flat[costumeItems[key]]",
)
h3(v-if="label !== 'skip'") {{ label }}
h3(v-else) {{ $t('background') }}
.row.pet-mount-row
.col-12.col-md-6
h2.text-center(v-once) {{ $t('pets') }}
.well.pet-mount-well
.row.col-12
.col-12.col-md-4
.box(:class='{white: user.items.currentPet}')
.Pet(:class="`Pet-${user.items.currentPet}`")
.col-12.col-md-8
div
| {{ formatAnimal(user.items.currentPet, 'pet') }}
div
strong {{ $t('petsFound') }}:
| {{ totalCount(user.items.pets) }}
div
strong {{ $t('beastMasterProgress') }}:
| {{ beastMasterProgress(user.items.pets) }}
.col-12.col-md-6
h2.text-center(v-once) {{ $t('mounts') }}
.well.pet-mount-well
.row.col-12
.col-12.col-md-4
.box(:class='{white: user.items.currentMount}')
.mount(:class="`Mount_Icon_${user.items.currentMount}`")
.col-12.col-md-8
div
| {{ formatAnimal(user.items.currentMount, 'mount') }}
div
strong {{ $t('mountsTamed') }}:
span {{ totalCount(user.items.mounts) }}
div
strong {{ $t('mountMasterProgress') }}:
span {{ mountMasterProgress(user.items.mounts) }}
#attributes.row
hr.col-12
h2.col-12 {{$t('attributes')}}
.col-12.col-md-6(v-for="(statInfo, stat) in stats")
.row.col-12.stats-column
.col-12.col-md-4.attribute-label
span.hint(:popover-title='$t(statInfo.title)', popover-placement='right',
:popover='$t(statInfo.popover)', popover-trigger='mouseenter')
.stat-title(:class='stat') {{ $t(statInfo.title) }}
strong.number {{ statsComputed[stat] | floorWholeNumber }}
.col-12.col-md-6
ul.bonus-stats
li
strong {{$t('level')}}:
| {{statsComputed.levelBonus[stat]}}
li
strong {{$t('equipment')}}:
| {{statsComputed.gearBonus[stat]}}
li
strong {{$t('class')}}:
| {{statsComputed.classBonus[stat]}}
li
strong {{$t('allocated')}}:
| {{user.stats[stat]}}
li
strong {{$t('buffs')}}:
| {{user.stats.buffs[stat]}}
#allocation(v-if='showAllocation')
.row.title-row
.col-12.col-md-6
h3(v-if='userLevel100Plus', v-once, v-html="$t('noMoreAllocate')")
h3(v-if='user.stats.points || userLevel100Plus')
| {{$t('pointsAvailable')}}
.counter.badge(v-if='user.stats.points || userLevel100Plus')
| {{user.stats.points}}&nbsp;
.col-12.col-md-6
.float-right
toggle-switch(
:label="$t('autoAllocation')",
v-model='user.preferences.automaticAllocation',
@change='setAutoAllocate()'
)
.row
.col-12.col-md-3(v-for='(statInfo, stat) in allocateStatsList')
.box.white.row.col-12
.col-12
div(:class='stat') {{ $t(stats[stat].title) }}
.number {{ user.stats[stat] }}
.points {{$t('pts')}}
.col-12.col-md-4
.up(v-if='user.stats.points', @click='allocate(stat)')
</template>
<script>
import toggleSwitch from 'client/components/ui/toggleSwitch';
import attributesGrid from 'client/components/inventory/equipment/attributesGrid';
import { mapState } from 'client/libs/store';
import Content from '../../../common/script/content';
import { beastMasterProgress, mountMasterProgress } from '../../../common/script/count';
import autoAllocate from '../../../common/script/fns/autoAllocate';
import allocate from '../../../common/script/ops/stats/allocate';
import statsComputed from '../../../common/script/libs/statsComputed';
import axios from 'axios';
import size from 'lodash/size';
import keys from 'lodash/keys';
const DROP_ANIMALS = keys(Content.pets);
const TOTAL_NUMBER_OF_DROP_ANIMALS = DROP_ANIMALS.length;
export default {
props: ['user', 'showAllocation'],
components: {
toggleSwitch,
attributesGrid,
},
data () {
return {
equipTypes: {
eyewear: this.$t('eyewear'),
head: this.$t('headgearCapitalized'),
headAccessory: this.$t('headAccess'),
back: this.$t('backAccess'),
armor: this.$t('armorCapitalized'),
body: this.$t('bodyAccess'),
weapon: this.$t('mainHand'),
_skip: 'skip',
shield: this.$t('offHand'),
},
allocateStatsList: {
str: { title: 'allocateStr', popover: 'strengthText', allocatepop: 'allocateStrPop' },
int: { title: 'allocateInt', popover: 'intText', allocatepop: 'allocateIntPop' },
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
},
stats: {
str: {
title: 'strength',
popover: 'strengthText',
},
int: {
title: 'intelligence',
popover: 'intText',
},
con: {
title: 'constitution',
popover: 'conText',
},
per: {
title: 'perception',
popover: 'perText',
},
},
content: Content,
};
},
computed: {
...mapState({
flatGear: 'content.gear.flat',
}),
equippedItems () {
return this.user.items.gear.equipped;
},
costumeItems () {
return this.user.items.gear.costume;
},
statsComputed () {
return statsComputed(this.user);
},
userLevel100Plus () {
return this.user.stats.lvl >= 100;
},
},
methods: {
getGearTitle (key) {
return this.flatGear[key].text();
},
totalCount (objectToCount) {
let total = size(objectToCount);
return total;
},
formatAnimal (animalName, type) {
if (type === 'pet') {
if (Content.petInfo.hasOwnProperty(animalName)) {
return Content.petInfo[animalName].text();
} else {
return this.$t('noActivePet');
}
} else if (type === 'mount') {
if (Content.mountInfo.hasOwnProperty(animalName)) {
return Content.mountInfo[animalName].text();
} else {
return this.$t('noActiveMount');
}
}
},
formatBackground (background) {
let bg = Content.appearances.background;
if (bg.hasOwnProperty(background)) {
return `${bg[background].text()} (${this.$t(bg[background].set.text)})`;
}
return this.$t('noBackground');
},
beastMasterProgress (pets) {
let dropPetsFound = beastMasterProgress(pets);
let display = this.formatOutOfTotalDisplay(dropPetsFound, TOTAL_NUMBER_OF_DROP_ANIMALS);
return display;
},
mountMasterProgress (mounts) {
let dropMountsFound = mountMasterProgress(mounts);
let display = this.formatOutOfTotalDisplay(dropMountsFound, TOTAL_NUMBER_OF_DROP_ANIMALS);
return display;
},
formatOutOfTotalDisplay (stat, totalStat) {
let display = `${stat}/${totalStat}`;
return display;
},
allocate (stat) {
allocate(this.user, {query: { stat }});
axios.post(`/api/v3/user/allocate?stat=${stat}`);
},
allocateNow () {
autoAllocate(this.user);
},
setAutoAllocate () {
let settings = {
'preferences.automaticAllocation': Boolean(this.user.preferences.automaticAllocation),
'preferences.allocationMode': 'taskbased',
};
this.$store.dispatch('user:set', settings);
},
},
};
</script>
<style lang="scss" scoped>
@import '~client/assets/scss/colors.scss';
#stats {
.box div {
margin: 0 auto;
margin-top: 1em;
}
}
.stats-column {
border-radius: 2px;
background-color: #ffffff;
padding: .5em;
margin-bottom: 1em;
ul {
list-style-type: none;
li strong {
margin-right: .3em;
}
}
}
.stat-title {
text-transform: uppercase;
}
.str {
color: #f74e52;
}
.int {
color: #2995cd;
}
.con {
color: #ffa623;
}
.per {
color: #4f2a93;
}
#allocation {
.title-row {
margin-top: 1em;
margin-bottom: 1em;
}
.counter.badge {
position: relative;
top: -0.25em;
left: 0.5em;
color: #fff;
background-color: #ff944c;
box-shadow: 0 1px 1px 0 rgba(26, 24, 29, 0.12);
width: 24px;
height: 24px;
border-radius: 50%;
}
.box {
width: 148px;
height: 84px;
padding: .5em;
margin: 0 auto;
div {
margin-top: 0;
}
.number {
font-size: 40px;
text-align: left;
color: #686274;
display: inline-block;
}
.points {
display: inline-block;
font-weight: bold;
line-height: 1.67;
text-align: left;
color: #878190;
margin-left: .5em;
}
.up {
border: solid #a5a1ac;
border-width: 0 3px 3px 0;
display: inline-block;
padding: 3px;
transform: rotate(-135deg);
-webkit-transform: rotate(-135deg);
margin-top: 1em;
}
.up:hover {
cursor: pointer;
}
}
}
#attributes {
.number {
font-size: 64px;
font-weight: bold;
color: #686274;
}
.attribute-label {
text-align: center;
}
}
.well {
background-color: #edecee;
border-radius: 2px;
padding: 0.4em;
padding-top: 1em;
}
.well.pet-mount-well {
padding-bottom: 1em;
strong {
margin-right: .2em;
}
}
.box {
width: 94px;
height: 92px;
border-radius: 2px;
border: dotted 1px #c3c0c7;
}
.white {
border-radius: 2px;
background: #FFFFFF;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.15), 0 1px 4px 0 rgba(26, 24, 29, 0.1);
border: 1px solid transparent;
}
.item-wrapper {
h3 {
text-align: center;
}
}
.pet-mount-row {
margin-top: 2em;
margin-bottom: 2em;
}
.mount {
margin-top: -0.2em !important;
}
</style>
+3 -3
View File
@@ -1,3 +1,3 @@
export default function floor (val) {
return Math.floor(val * 100) / 100;
}
export default function floor (val, power = 100) {
return Math.floor(val * power) / power;
}
+23
View File
@@ -0,0 +1,23 @@
import axios from 'axios';
import moment from 'moment';
export function setUpAxios (AUTH_SETTINGS) {
if (!AUTH_SETTINGS) {
AUTH_SETTINGS = localStorage.getItem('habit-mobile-settings');
if (!AUTH_SETTINGS) return false;
AUTH_SETTINGS = JSON.parse(AUTH_SETTINGS);
}
let browserTimezoneOffset = moment().zone();
if (AUTH_SETTINGS.auth && AUTH_SETTINGS.auth.apiId && AUTH_SETTINGS.auth.apiToken) {
axios.defaults.headers.common['x-api-user'] = AUTH_SETTINGS.auth.apiId;
axios.defaults.headers.common['x-api-key'] = AUTH_SETTINGS.auth.apiToken;
axios.defaults.headers.common['x-user-timezoneOffset'] = browserTimezoneOffset;
return true;
}
return false;
}
+17 -1
View File
@@ -5,6 +5,7 @@ import subscriptionBlocks from '../../common/script/content/subscriptionBlocks';
import { mapState } from 'client/libs/store';
import encodeParams from 'client/libs/encodeParams';
import notificationsMixin from 'client/mixins/notifications';
import * as Analytics from 'client/libs/analytics';
export default {
mixins: [notificationsMixin],
@@ -95,6 +96,22 @@ export default {
if (newGroup && newGroup._id) {
// @TODO this does not do anything as we reload just below
// @TODO: Just append? or $emit?
// Handle new user signup
if (!this.$store.state.isUserLoggedIn) {
const habiticaUrl = `${location.protocol}//${location.host}`;
Analytics.track({
hitType: 'event',
eventCategory: 'group-plans-static',
eventAction: 'view',
eventLabel: 'paid-with-stripe',
});
location.href = `${habiticaUrl}/group-plans/${newGroup._id}/task-information?showGroupOverview=true`;
return;
}
this.$router.push(`/group-plans/${newGroup._id}/task-information`);
// @TODO action
this.user.guilds.push(newGroup._id);
@@ -144,7 +161,6 @@ export default {
return true;
},
amazonPaymentsInit (data) {
// @TODO: Do we need this? if (!this.isAmazonReady) return;
if (!this.checkGemAmount(data)) return;
if (data.type !== 'single' && data.type !== 'subscription') return;
+22 -4
View File
@@ -32,10 +32,11 @@ export default {
return this.castEnd(party, spell.target);
}
let party = this.$store.state.partyMembers;
party = isArray(party) ? party : [];
party = party.concat(this.user);
this.castEnd(party, spell.target);
let partyMembers = this.$store.state.partyMembers.data;
if (!isArray(partyMembers)) {
partyMembers = [this.user];
}
this.castEnd(partyMembers, spell.target);
} else if (spell.target === 'tasks') {
let userTasks = this.$store.state.tasks.data;
// exclude rewards
@@ -129,6 +130,23 @@ export default {
this.markdown(msg); // @TODO: mardown directive?
// If using mpheal and there are other mages in the party, show extra notification
if (type === 'party' && spell.key === 'mpheal') {
// Counting mages
let magesCount = 0;
for (let i = 0; i < target.length; i++) {
if (target[i].stats.class === 'wizard') {
magesCount++;
}
}
// If there are mages, show message telling that the mpheal don't work on other mages
// The count must be bigger than 1 because the user casting the spell is a mage
if (magesCount > 1) {
this.markdown(this.$t('spellWizardNoEthOnMage'));
}
}
// @TODO:
if (!beforeQuestProgress) return apiResult;
let questProgress = this.questProgress() - beforeQuestProgress;
-1
View File
@@ -26,7 +26,6 @@ export function hatch (store, params) {
export async function feed (store, params) {
const user = store.state.user.data;
feedOp(user, {params});
const response = await axios
.post(`/api/v3/user/feed/${params.pet}/${params.food}`);
return response.data;
+2 -10
View File
@@ -4,6 +4,7 @@ import content from 'common/script/content/index';
import * as commonConstants from 'common/script/constants';
import { DAY_MAPPING } from 'common/script/cron';
import { asyncResourceFactory } from 'client/libs/asyncResource';
import { setUpAxios } from 'client/libs/auth';
import axios from 'axios';
import moment from 'moment';
@@ -19,18 +20,9 @@ let browserTimezoneOffset = moment().zone(); // eg, 240 - this will be converted
axios.defaults.headers.common['x-client'] = 'habitica-web';
let AUTH_SETTINGS = localStorage.getItem('habit-mobile-settings');
if (AUTH_SETTINGS) {
AUTH_SETTINGS = JSON.parse(AUTH_SETTINGS);
if (AUTH_SETTINGS.auth && AUTH_SETTINGS.auth.apiId && AUTH_SETTINGS.auth.apiToken) {
axios.defaults.headers.common['x-api-user'] = AUTH_SETTINGS.auth.apiId;
axios.defaults.headers.common['x-api-key'] = AUTH_SETTINGS.auth.apiToken;
axios.defaults.headers.common['x-user-timezoneOffset'] = browserTimezoneOffset;
isUserLoggedIn = true;
}
isUserLoggedIn = setUpAxios(AUTH_SETTINGS);
}
const i18nData = window && window['habitica-i18n'];
+3
View File
@@ -167,6 +167,9 @@
"questEggBadgerText": "Язовец",
"questEggBadgerMountText": "Язовец",
"questEggBadgerAdjective": "немирен",
"questEggSquirrelText": "Squirrel",
"questEggSquirrelMountText": "Squirrel",
"questEggSquirrelAdjective": "bushy-tailed",
"eggNotes": "Намерете излюпваща отвара, която да излеете върху това яйце и от него ще се излюпи <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
"hatchingPotionBase": "Нормален цвят",
"hatchingPotionWhite": "Бял цвят",
+2 -2
View File
@@ -140,7 +140,7 @@
"playButtonFull": "Влизане в Хабитика",
"presskit": "Медийни материали",
"presskitDownload": "Сваляне на всички изображения:",
"presskitText": "Благодарим за интереса Ви в Хабитика! Можете да използвате следните изображения в статии или видеа относно Хабитика. За повече информация, моля, свържете се със Сиене Лесли на <%= pressEnquiryEmail %>.",
"presskitText": "Благодарим за интереса Ви в Хабитика! Можете да използвате следните изображения в статии или видеа относно Хабитика. За повече информация, моля, свържете се с нас на <%= pressEnquiryEmail %>.",
"pkQuestion1": "Какво вдъхнови Хабитика? Как започна всичко?",
"pkAnswer1": "Ако някога сте играли игра, в която трябва да вложите доста време, за ад развиете героя си, можете да си представите колко по-страхотен би бил животът Ви, ако бяхте вложили цялото това усилие в подобряване на истинската си личност, вместо на тази на героя. Хабитика започна точно с тази цел. <br /> Хабитика официално започна чрез кампания в Kickstarter през 2013 г. и постига голям успех. Оттогава досега тя се превърна в голям проект, който се поддържа и развива от страхотните ни разработчици от общността и потребителите ни.",
"pkQuestion2": "Защо Хабитика работи?",
@@ -157,7 +157,7 @@
"pkAnswer7": "Хабитика използва пикселни изображения по няколко причини. Освен приятния носталгичен вид, пикселните изображения са по-удобни, тъй като искаме много хора да могат да се включат в създаването на изображения. С този вид изображения е много по-лесно да се поддържа един и същ стил на рисуване, дори когато в рисуването участват много различни художници, а това означава, че можем бързо да създаваме много съдържание!",
"pkQuestion8": "Променя ли Хабитика наистина живота на хората?",
"pkAnswer8": "Можете да откриете много истории как Хабитика е помогнала на хората тук: https://habitversary.tumblr.com",
"pkMoreQuestions": "Имате въпрос, чийто отговор не виждате тук? Изпратете ни е-писмо на: leslie@habitica.com!",
"pkMoreQuestions": "Имате въпрос, чийто отговор не виждате тук? Изпратете ни е-писмо на: admin@habitica.com!",
"pkVideo": "Видео",
"pkPromo": "Рекламни материали",
"pkLogo": "Лога",
+32 -1
View File
@@ -253,6 +253,8 @@
"userCountRequestsApproval": "<%= userCount %> потребители искат одобрение",
"youAreRequestingApproval": "Вие искате одобрение",
"chatPrivilegesRevoked": "Привилегиите Ви в чата Ви бяха отнети.",
"cannotCreatePublicGuildWhenMuted": "Не можете да създадете обществена гилдия, защото привилегиите Ви в чата са Ви били отнети.",
"cannotInviteWhenMuted": "Не можете да изпратите покана за гилдия или група, защото привилегиите Ви в чата са Ви били отнети.",
"newChatMessagePlainNotification": "Има ново съобщение в <%= groupName %> от <%= authorName %>. Щракнете тук, за да отворите страницата!",
"newChatMessageTitle": "Има ново съобщение в <%= groupName %>",
"exportInbox": "Изнасяне на съобщенията",
@@ -430,5 +432,34 @@
"worldBossBullet2": "Главатарят няма да Ви нанесе щети за пропуснатите задачи, но яростомерът му ще се запълни. Ако лентата се запълни, главатарят ще нападне някой от продавачите на Хабитика!",
"worldBossBullet3": "Можете да продължите с нормалните главатари от мисиите си, като щетите ще се прилагат и на двамата главатари.",
"worldBossBullet4": "Проверявайте в кръчмата, за да видите напредъка за световния главатар и яростните удари.",
"worldBoss": "Световен главатар"
"worldBoss": "Световен главатар",
"groupPlanTitle": "Нуждаете се от повече за екипа си?",
"groupPlanDesc": "Управлявате малък екип или организирате задълженията у дома? Груповите ни планове Ви дават изключителен достъп до частна дъска със задачи и място в чата, специално за Вас и членовете на групата Ви!",
"billedMonthly": "* таксува се като месечен абонамент",
"teamBasedTasksList": "Екипен списък от задачи",
"teamBasedTasksListDesc": "Създайте споделен списък от задачи за групата си, който всеки може лесно да разглежда. Назначете задачи на членовете, или ги оставете сами да си ги назначат, за да е ясно кой с какво се занимава!",
"groupManagementControls": "Възможности за управление на групата",
"groupManagementControlsDesc": "Използвайте възможността за одобрение на задачите, за да потвърждавате, че дадена задача наистина е изпълнена; добавете управители на групата, за да споделите отговорностите; и се възползвайте от груповия чат за членовете на екипа.",
"inGameBenefits": "Облаги в играта",
"inGameBenefitsDesc": "Членовете на групов план получават изключителния превоз „Рогат заек“, както и всички облаги на абонамента, включително специална месечна екипировка и възможността за закупуване на диаманти със злато.",
"inspireYourParty": "Вдъхновете групата си, превърнете заедно живота си в игра.",
"letsMakeAccount": "Първо, трябва да си създадете профил",
"nameYourGroup": "След това трябва да дадете име на групата си",
"exampleGroupName": "Например: „Академия за отмъстители“",
"exampleGroupDesc": "За онези, избрани да се присъединят към академията за обучение на супергероите „Отмъстители“",
"thisGroupInviteOnly": "Тази група е достъпна само чрез покана.",
"gettingStarted": "Първи стъпки",
"congratsOnGroupPlan": "Поздравления за създаването на групата! Тук ще намерите отговори на някои от най-често задаваните въпроси.",
"whatsIncludedGroup": "Какво включва абонаментът?",
"whatsIncludedGroupDesc": "Всички членове на груповия план получават всички облаги на абонаментите, включително месечните предмети за абонати, възможността за закупуване на диаманти със злато и специалния превоз „Царствено лилав рогат заек“, който е достъпен само за членовете на групов план.",
"howDoesBillingWork": "Как работи таксуването?",
"howDoesBillingWorkDesc": "Водачите на групата се таксуват ежемесечно, според размера на групата. Това включва таксата от 9 щатски долара за абонамента на водача на групата, плюс още по 3 долара за всеки допълнителен член. Например: група от четирима потребители ще струва 18$, тъй като групата се състои от 1 водач + 3-ма други членове.",
"howToAssignTask": "Как се назначава задача?",
"howToAssignTaskDesc": "Можете да назначите всяка задача на един или повече членове на групата (включително на водача или на управителите), като въведете потребителско име или имена в полето „Назначаване на“ в прозорчето за създаване на задача. Можете да решите кого да назначите и по-късно, след създаването на задачата, като я редактирате и добавите потребител в полето „Назначаване на“!",
"howToRequireApproval": "Как се отбелязва, че задачата изисква одобрение?",
"howToRequireApprovalDesc": "Включете настройката „Изисква одобрение“, за да отбележите, че задачата изисква потвърждението на водач или управител на групата. Потребителят, който е отметнал задачата, няма да получи наградата си, докато задачата не бъде одобрена.",
"howToRequireApprovalDesc2": "Водачите и управителите на групата могат да одобряват завършените задачи направо от дъската със задачи или от областта за известия.",
"whatIsGroupManager": "Какво е „управител на групата“?",
"whatIsGroupManagerDesc": "Управител на групата е такъв потребител, който няма достъп до информацията за таксуването на групата, но може да създава, назначава и одобрява споделени задачи за членовете на групата. Можете да определите кои са управителите на групата от списъка с членовете.",
"goToTaskBoard": "Към дъската със задачи"
}
+1 -1
View File
@@ -59,7 +59,7 @@
"messageUserOperationProtected": "Пътят `<%= operation %>` не беше запазен, тъй като е защитен път.",
"messageUserOperationNotFound": "Операцията „<%= operation %>“ не е намерена",
"messageNotificationNotFound": "Известието не е намерено.",
"messageNotAbleToBuyInBulk": "This item cannot be purchased in quantities above 1.",
"messageNotAbleToBuyInBulk": "Не може да се закупи повече от един брой от този предмет.",
"notificationsRequired": "Идентификаторите на известията са задължителни.",
"unallocatedStatsPoints": "Имате <span class=\"notification-bold-blue\"><%= points %> неразпределени показателни точки</span>",
"beginningOfConversation": "Това е началото на разговора Ви с <%= userName %>. Запомнете да спазвате добрия тон, да уважавате другия и да следвате Обществените правила!"
+1
View File
@@ -122,6 +122,7 @@
"buyQuestBundle": "Купуване на пакет мисии",
"noQuestToStart": "Не можете да намерите мисия, която да започнете? Погледнете в магазина за мисии или на пазара за нови попълнения!",
"pendingDamage": "<%= damage %> чакащи щети",
"pendingDamageLabel": "чакащи щети",
"bossHealth": "<%= currentHealth %> / <%= maxHealth %> здраве",
"rageAttack": "Яростна атака:",
"bossRage": "<%= currentRage %> / <%= maxRage %> ярост",
+7 -1
View File
@@ -594,5 +594,11 @@
"questDysheartenerDropHippogriffMount": "Обнадежден хипогриф (превоз)",
"dysheartenerArtCredit": "Графиките са от @AnnDeLune",
"hugabugText": "Пакет мисии „Любими буболечки“",
"hugabugNotes": "Съдържа: „КРИТИЧНИЯТ БРЪМБАР“, „Охлювът на черноработната утайка“ и „Сбогом, пеперудке“. Наличен до 31 март."
"hugabugNotes": "Съдържа: „КРИТИЧНИЯТ БРЪМБАР“, „Охлювът на черноработната утайка“ и „Сбогом, пеперудке“. Наличен до 31 март.",
"questSquirrelText": "The Sneaky Squirrel",
"questSquirrelNotes": "You wake up and find youve overslept! Why didnt your alarm go off? … How did an acorn get stuck in the ringer?<br><br>When you try to make breakfast, the toaster is stuffed with acorns. When you go to retrieve your mount, @Shtut is there, trying unsuccessfully to unlock their stable. They look into the keyhole. “Is that an acorn in there?”<br><br>@randomdaisy cries out, “Oh no! I knew my pet squirrels had gotten out, but I didnt know theyd made such trouble! Can you help me round them up before they make any more of a mess?”<br><br>Following the trail of mischievously placed oak nuts, you track and catch the wayward sciurines, with @Cantras helping secure each one safely at home. But just when you think your task is almost complete, an acorn bounces off your helm! You look up to see a mighty beast of a squirrel, crouched in defense of a prodigious pile of seeds.<br><br>“Oh dear,” says @randomdaisy, softly. “Shes always been something of a resource guarder. Well have to proceed very carefully!” You circle up with your party, ready for trouble!",
"questSquirrelCompletion": "With a gentle approach, offers of trade, and a few soothing spells, youre able to coax the squirrel away from its hoard and back to the stables, which @Shtut has just finished de-acorning. Theyve set aside a few of the acorns on a worktable. “These ones are squirrel eggs! Maybe you can raise some that dont play with their food quite so much.”",
"questSquirrelBoss": "Sneaky Squirrel",
"questSquirrelDropSquirrelEgg": "Squirrel (Egg)",
"questSquirrelUnlockText": "Unlocks purchasable Squirrel eggs in the Market"
}
+2 -1
View File
@@ -2,7 +2,8 @@
"spellWizardFireballText": "Пламъчен взрив",
"spellWizardFireballNotes": "Получавате точки опит и нанасяте допълнителни щети на главатарите! (Зависи от: ИНТ)",
"spellWizardMPHealText": "Неземен изблик",
"spellWizardMPHealNotes": "Жертвате мана, за да могат останалите от групата да получат точки мана! (Зависи от: ИНТ)",
"spellWizardMPHealNotes": "Жертвате мана, за да могат останалите от групата (освен магьосниците) да получат точки мана! (Зависи от: ИНТ)",
"spellWizardNoEthOnMage": "Умението Ви бива отклонено обратно към Вас, когато се смесва с магията на другиго. Само не-магьосниците получават точки мана.",
"spellWizardEarthText": "Земетресение",
"spellWizardEarthNotes": "Вашата умствена сила разлюлява земята. Цялата група получава подсилка на интелигентността! (Зависи от: неподсилената ИНТ)",
"spellWizardFrostText": "Смразяващ студ",
+1 -1
View File
@@ -212,5 +212,5 @@
"repeatDayError": "Моля, уверете се, че сте избрали поне един ден от седмицата.",
"searchTasks": "Търсене в заглавията и описанията…",
"sessionOutdated": "Сесията Ви е изтекла. Моля, опреснете или синхронизирайте.",
"errorTemporaryItem": "This item is temporary and cannot be pinned."
"errorTemporaryItem": "Този предмет е временен и не може да бъде закачен."
}
+3
View File
@@ -167,6 +167,9 @@
"questEggBadgerText": "Jezevec",
"questEggBadgerMountText": "Jezevec",
"questEggBadgerAdjective": "Rušný",
"questEggSquirrelText": "Squirrel",
"questEggSquirrelMountText": "Squirrel",
"questEggSquirrelAdjective": "bushy-tailed",
"eggNotes": "Najdi líhnoucí lektvar, nalij ho na vejce a to se vylíhne v <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
"hatchingPotionBase": "Základní",
"hatchingPotionWhite": "Bílý",
+2 -2
View File
@@ -140,7 +140,7 @@
"playButtonFull": "Vstup do země Habitica",
"presskit": "Pro novináře",
"presskitDownload": "Stáhnout všechny obrázky:",
"presskitText": "Thanks for your interest in Habitica! The following images can be used for articles or videos about Habitica. For more information, please contact Siena Leslie at <%= pressEnquiryEmail %>.",
"presskitText": "Thanks for your interest in Habitica! The following images can be used for articles or videos about Habitica. For more information, please contact us at <%= pressEnquiryEmail %>.",
"pkQuestion1": "Co inspirovalo Habiticu? Jak to začalo?",
"pkAnswer1": "If youve ever invested time in leveling up a character in a game, its hard not to wonder how great your life would be if you put all of that effort into improving your real-life self instead of your avatar. We starting building Habitica to address that question. <br /> Habitica officially launched with a Kickstarter in 2013, and the idea really took off. Since then, its grown into a huge project, supported by our awesome open-source volunteers and our generous users.",
"pkQuestion2": "Why does Habitica work?",
@@ -157,7 +157,7 @@
"pkAnswer7": "Habitica uses pixel art for several reasons. In addition to the fun nostalgia factor, pixel art is very approachable to our volunteer artists who want to chip in. It's much easier to keep our pixel art consistent even when lots of different artists contribute, and it lets us quickly generate a ton of new content!",
"pkQuestion8": "How has Habitica affected people's real lives?",
"pkAnswer8": "You can find lots of testimonials for how Habitica has helped people here: https://habitversary.tumblr.com",
"pkMoreQuestions": "Do you have a question thats not on this list? Send an email to leslie@habitica.com!",
"pkMoreQuestions": "Do you have a question thats not on this list? Send an email to admin@habitica.com!",
"pkVideo": "Video",
"pkPromo": "Propagace",
"pkLogo": "Loga",
+32 -1
View File
@@ -253,6 +253,8 @@
"userCountRequestsApproval": "<%= userCount %> request approval",
"youAreRequestingApproval": "You are requesting approval",
"chatPrivilegesRevoked": "Your chat privileges have been revoked.",
"cannotCreatePublicGuildWhenMuted": "You cannot create a public guild because your chat privileges have been revoked.",
"cannotInviteWhenMuted": "You cannot invite anyone to a guild or party because your chat privileges have been revoked.",
"newChatMessagePlainNotification": "New message in <%= groupName %> by <%= authorName %>. Click here to open the chat page!",
"newChatMessageTitle": "New message in <%= groupName %>",
"exportInbox": "Vyjmuté zprávy",
@@ -430,5 +432,34 @@
"worldBossBullet2": "The World Boss wont damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habiticas shopkeepers!",
"worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both",
"worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks",
"worldBoss": "World Boss"
"worldBoss": "World Boss",
"groupPlanTitle": "Need more for your crew?",
"groupPlanDesc": "Managing a small team or organizing household chores? Our group plans grant you exclusive access to a private task board and chat area dedicated to you and your group members!",
"billedMonthly": "*billed as a monthly subscription",
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",
"letsMakeAccount": "First, lets make you an account",
"nameYourGroup": "Next, Name Your Group",
"exampleGroupName": "Example: Avengers Academy",
"exampleGroupDesc": "For those selected to join the training academy for The Avengers Superhero Initiative",
"thisGroupInviteOnly": "This group is invitation only.",
"gettingStarted": "Getting Started",
"congratsOnGroupPlan": "Congratulations on creating your new Group! Here are a few answers to some of the more commonly asked questions.",
"whatsIncludedGroup": "What's included in the subscription",
"whatsIncludedGroupDesc": "All members of the Group receive full subscription benefits, including the monthly subscriber items, the ability to buy Gems with Gold, and the Royal Purple Jackalope mount, which is exclusive to users with a Group Plan membership.",
"howDoesBillingWork": "How does billing work?",
"howDoesBillingWorkDesc": "Group Leaders are billed based on group member count on a monthly basis. This charge includes the $9 (USD) price for the Group Leader subscription, plus $3 USD for each additional group member. For example: A group of four users will cost $18 USD/month, as the group consists of 1 Group Leader + 3 group members.",
"howToAssignTask": "How do you assign a Task?",
"howToAssignTaskDesc": "Assign any Task to one or more Group members (including the Group Leader or Managers themselves) by entering their usernames in the \"Assign To\" field within the Create Task modal. You can also decide to assign a Task after creating it, by editing the Task and adding the user in the \"Assign To\" field!",
"howToRequireApproval": "How do you mark a Task as requiring approval?",
"howToRequireApprovalDesc": "Toggle the \"Requires Approval\" setting to mark a specific task as requiring Group Leader or Manager confirmation. The user who checked off the task won't get their rewards for completing it until it has been approved.",
"howToRequireApprovalDesc2": "Group Leaders and Managers can approve completed Tasks directly from the Task Board or from the Notifications panel.",
"whatIsGroupManager": "What is a Group Manager?",
"whatIsGroupManagerDesc": "A Group Manager is a user role that do not have access to the group's billing details, but can create, assign, and approve shared Tasks for the Group's members. Promote Group Managers from the Groups member list.",
"goToTaskBoard": "Go to Task Board"
}
+1
View File
@@ -122,6 +122,7 @@
"buyQuestBundle": "Buy Quest Bundle",
"noQuestToStart": "Cant find a quest to start? Try checking out the Quest Shop in the Market for new releases!",
"pendingDamage": "<%= damage %> pending damage",
"pendingDamageLabel": "pending damage",
"bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health",
"rageAttack": "Rage Attack:",
"bossRage": "<%= currentRage %> / <%= maxRage %> Rage",
+7 -1
View File
@@ -594,5 +594,11 @@
"questDysheartenerDropHippogriffMount": "Hopeful Hippogriff (Mount)",
"dysheartenerArtCredit": "Artwork by @AnnDeLune",
"hugabugText": "Hug a Bug Quest Bundle",
"hugabugNotes": "Contains 'The CRITICAL BUG,' 'The Snail of Drudgery Sludge,' and 'Bye, Bye, Butterfry.' Available until March 31."
"hugabugNotes": "Contains 'The CRITICAL BUG,' 'The Snail of Drudgery Sludge,' and 'Bye, Bye, Butterfry.' Available until March 31.",
"questSquirrelText": "The Sneaky Squirrel",
"questSquirrelNotes": "You wake up and find youve overslept! Why didnt your alarm go off? … How did an acorn get stuck in the ringer?<br><br>When you try to make breakfast, the toaster is stuffed with acorns. When you go to retrieve your mount, @Shtut is there, trying unsuccessfully to unlock their stable. They look into the keyhole. “Is that an acorn in there?”<br><br>@randomdaisy cries out, “Oh no! I knew my pet squirrels had gotten out, but I didnt know theyd made such trouble! Can you help me round them up before they make any more of a mess?”<br><br>Following the trail of mischievously placed oak nuts, you track and catch the wayward sciurines, with @Cantras helping secure each one safely at home. But just when you think your task is almost complete, an acorn bounces off your helm! You look up to see a mighty beast of a squirrel, crouched in defense of a prodigious pile of seeds.<br><br>“Oh dear,” says @randomdaisy, softly. “Shes always been something of a resource guarder. Well have to proceed very carefully!” You circle up with your party, ready for trouble!",
"questSquirrelCompletion": "With a gentle approach, offers of trade, and a few soothing spells, youre able to coax the squirrel away from its hoard and back to the stables, which @Shtut has just finished de-acorning. Theyve set aside a few of the acorns on a worktable. “These ones are squirrel eggs! Maybe you can raise some that dont play with their food quite so much.”",
"questSquirrelBoss": "Sneaky Squirrel",
"questSquirrelDropSquirrelEgg": "Squirrel (Egg)",
"questSquirrelUnlockText": "Unlocks purchasable Squirrel eggs in the Market"
}

Some files were not shown because too many files have changed in this diff Show More