Compare commits

..

131 Commits

Author SHA1 Message Date
Matteo Pagliazzi be86812900 4.140.10 2020-04-24 21:00:08 +02:00
Matteo Pagliazzi c879560445 add ability to log amplitude events (#12120) 2020-04-24 19:02:27 +02:00
Matteo Pagliazzi 188023b197 fix #12118: pass mandatory second parameter to markdown-it parse method 2020-04-24 12:06:05 +02:00
Sabe Jones c4343379a1 4.140.9 2020-04-23 13:59:54 -05:00
Sabe Jones ce07d06c15 chore(news): Bailey 2020-04-23 13:59:48 -05:00
Matteo Pagliazzi a0041221be fix(webpack): correct typo in vue.config.js 2020-04-23 11:58:53 +02:00
Matteo Pagliazzi ebfb6f96b3 Merge branch 'hamboomger-bugfix-extramonths-lost-when-subscription-terminated' into develop 2020-04-20 23:54:52 +02:00
Matteo Pagliazzi 22d696219a Revert "Squashed commit of the following:"
This reverts commit 9014943a86.
2020-04-20 23:53:41 +02:00
Matteo Pagliazzi 9014943a86 Squashed commit of the following:
commit 6a70487fa6
Author: Matteo Pagliazzi <matteopagliazzi@gmail.com>
Date:   Mon Apr 20 23:48:48 2020 +0200

    remove un-needed code

commit 4fa381f153
Merge: 97209e40ad b7448e2cfe
Author: Matteo Pagliazzi <matteopagliazzi@gmail.com>
Date:   Mon Apr 20 23:30:19 2020 +0200

    Merge branch 'bugfix-extramonths-lost-when-subscription-terminated' of https://github.com/hamboomger/habitica into hamboomger-bugfix-extramonths-lost-when-subscription-terminated

commit b7448e2cfe
Author: hamboomger <hamboomger@gmail.com>
Date:   Tue Mar 31 18:23:08 2020 +0300

    fix(server-api): cancelSubscription() is no longer called twice when user leaves group

commit 0bc836b490
Author: hamboomger <hamboomger@gmail.com>
Date:   Sun Mar 29 15:54:13 2020 +0300

    refactor(payments): unit tests created for calculation of subscription termination date

commit fdf7e3a665
Author: hamboomger <hamboomger@gmail.com>
Date:   Thu Mar 26 19:33:35 2020 +0200

    fix(db-schema): typo fixed in group.hasCancelled() schema metod name

commit 00d12e83bd
Author: hamboomger <hamboomger@gmail.com>
Date:   Thu Mar 26 19:31:07 2020 +0200

    refactor(db-schema): group.isSubscribed() method name changed to group.hasActiveGroupPlan()
2020-04-20 23:50:08 +02:00
Matteo Pagliazzi 6a70487fa6 remove un-needed code 2020-04-20 23:48:48 +02:00
Matteo Pagliazzi 4fa381f153 Merge branch 'bugfix-extramonths-lost-when-subscription-terminated' of https://github.com/hamboomger/habitica into hamboomger-bugfix-extramonths-lost-when-subscription-terminated 2020-04-20 23:30:19 +02:00
Matteo Pagliazzi 97209e40ad Collection quests: make sure users cannot earn "excess" items (#12098)
* fix(collection quests): make sure users cannot earn "excess" collection items

* add test
2020-04-20 23:12:05 +02:00
Matteo Pagliazzi 2e97f9864e fix(package.json): remove unused package 2020-04-20 22:27:20 +02:00
Jack Somers 6d6adfd919 Fixes #11119: Added check for wacky pet before feeding (#12106)
* Added check for wacky pet before feeding

* added test for feeding wacky pets

* Fixed typo in test for feeding wacky pets

Co-authored-by: Jack Somers <somersjw9@gmail.com>
2020-04-20 22:17:42 +02:00
anoopravella 13123c0bae Allow changing name of party without adding description (#12095)
* fixed behavior of editing parties, guilds

* removed unnecessary whitespace

* added v-if, removed v-once(s), simplified group type logic
2020-04-20 18:34:24 +02:00
Laurel Thomson 577e6f005e Fixing the equipment popover message when equipment is from a different class - Fixes #11988 (#11993)
* Updating the equipment attributes popover to display the correct message when the equipment doesn't match the user's class

* Rewriting 'is wrong class' and abstracting logic into computed property of shop item

* Moving isWrongClass computed function from shopItem to popoverAttribute component

* Reverting accidental whitespace change

* Adding newline to end of profile.vue to get client to compile

* Reverting profile.vue back to develop branch

Co-authored-by: Laurel Thomson <laurel.beth.thomson@gmai.com>
2020-04-20 17:23:40 +02:00
Matteo Pagliazzi 1361fea2d4 Update year number on the footer component (#12108)
Happy belated new year :P
2020-04-20 16:36:52 +02:00
negue cbcc7cd479 remove search from private-messages (#12044)
* remove search from private-messages + paged conversations + fixes

* remove autoSize call

* add conversation border at the top

* border-bottom under `Disable Private Messages` - revert border-bottom on conversation items
2020-04-20 16:32:54 +02:00
dependabot-preview[bot] 0e36c1aa0f build(deps-dev): bump monk from 7.1.2 to 7.2.0 (#12110)
Bumps [monk](https://github.com/Automattic/monk) from 7.1.2 to 7.2.0.
- [Release notes](https://github.com/Automattic/monk/releases)
- [Changelog](https://github.com/Automattic/monk/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/monk/commits/v7.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-20 11:45:48 +02:00
dependabot-preview[bot] 5b4505ac62 build(deps): bump jwks-rsa from 1.7.0 to 1.8.0 (#12112)
Bumps [jwks-rsa](https://github.com/auth0/node-jwks-rsa) from 1.7.0 to 1.8.0.
- [Release notes](https://github.com/auth0/node-jwks-rsa/releases)
- [Changelog](https://github.com/auth0/node-jwks-rsa/blob/master/CHANGELOG.md)
- [Commits](https://github.com/auth0/node-jwks-rsa/compare/1.7.0...v1.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-20 11:44:53 +02:00
dependabot-preview[bot] aa3d972cb4 build(deps): bump mongoose from 5.9.7 to 5.9.9 (#12113)
Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.9.7 to 5.9.9.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md)
- [Commits](https://github.com/Automattic/mongoose/compare/5.9.7...5.9.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-20 11:44:08 +02:00
Rarysson d4b729c95e Update year number on the footer component
Happy belated new year :P
2020-04-19 22:17:19 -03:00
Matteo Pagliazzi d4b867acc3 fix(static overview): correctly scope css in apple redirect page to avoid polluting other pages 2020-04-19 12:29:30 +02:00
Matteo Pagliazzi 15c09691af Merge branch 'release' into develop 2020-04-18 17:42:47 +02:00
Matteo Pagliazzi 27263e9b2f 4.140.8 2020-04-18 17:41:40 +02:00
Matteo Pagliazzi 2d9715b657 fix(apple auth): add needed env var to client and encode redirect url 2020-04-18 17:41:25 +02:00
Matteo Pagliazzi 8ca5ee99b0 Merge branch 'release' into develop 2020-04-18 16:09:40 +02:00
Matteo Pagliazzi 9f9da5632d 4.140.7 2020-04-18 16:02:23 +02:00
Matteo Pagliazzi 9364cdc2b4 fix(apple auth): do not try to parse name if it is missing, add query parameters to logs 2020-04-18 16:02:18 +02:00
Carl Vuorinen 2896cf77e0 Handle simultaneous quest accept/reject (#12090)
* Implement atomic quest accept/reject

* Persist quest.members early to avoid simultaneous handling of accept/reject

* Fix quest accept test (missing expectation)

* PR fixes
2020-04-17 22:57:31 +02:00
kareenf 936d3ffc98 Delete merch page [fixes #12039] (#12094)
* delete merch.vue and all mentions of links to merch page

* Added comments about why merch page is being deleted

Co-authored-by: Kareen <kareenf@umich.edu>
2020-04-17 22:55:22 +02:00
Bart Enkelaar 9608b9fa9f Don't link user in markdown code blocks - Fixes #[11504] (#12069)
* Improve whitespacing in highlightMentions.js unit test

* Issue 11504 - Don't link users in markdown code blocks

Use the markdown-it parser to determine what parts of the message are code block first.
Then work from those parser tokens back to content parts that should not be handled.

Still convoluted, but can be improved once a "user mention plugin" is added to habitica-markdown.

* Issue 11504 - Put functions in JavaScript order and fix linting issues

* Issue 11504 - Use includes i.o. multiple or checks and added some context.

* Issue 11504 - Add docstring for highlightMentions and simplify fence regex

* Issue 11504 - Replace inline recursor with default parameter value
2020-04-17 22:19:11 +02:00
kareenf 657327edd7 Fixes issue where usernames that are sandwiched with underscores are not properly formatted [fixes #12033] (#12071)
* For some reason this file shows as modified, however I checked and it seems as though the same code chunk was 'deleted' and 'added' back in

* Added in logic to take care of issue pertaining to usernames with underscores such as @_spider_ was not showing up in the proper username format

* Added component test to test underscores in username issue

* I accidentally forgot to change the expected result to be @_user_

* Fixed strange spacing issue in profile.vue to match the original

* Another place where I needed to put _user_

* Accidentally left in describe.only in highlightUsers.spec.js,so removed .only

* Added in suggestions from @benkelaar and added in support for fixing double underscore sandwiched usernames which is Markdown's way of bolding

* Added component test to test that usernames sandwiched with double underscores are properly formatted

* Added fixes to test case input and variable mismatch in function

* Updated expect result statement to not be a user mention instance

Co-authored-by: Kareen <kareenf@umich.edu>
2020-04-17 21:45:01 +02:00
Sabe Jones 9706a9c8be Merge branch 'release' into develop 2020-04-17 14:25:58 -05:00
Sabe Jones 484bae40cd 4.140.6 2020-04-17 14:24:42 -05:00
Sabe Jones c0b6353ded chore(analytics): change up drop tracking 2020-04-17 14:24:34 -05:00
Matteo Pagliazzi f71062e86c Merge branch 'release' into develop 2020-04-17 20:50:11 +02:00
Matteo Pagliazzi 8da36bf27c 4.140.5 2020-04-17 15:09:12 +02:00
Matteo Pagliazzi 1800fabaaa Merge pull request #129 from HabitRPG/cache-fixes-3
API Cache fixes
2020-04-17 15:08:15 +02:00
Matteo Pagliazzi 193e7062c3 Merge branch 'release' into develop 2020-04-17 15:00:58 +02:00
Matteo Pagliazzi cda5c6fbb0 res.header -> res.set 2020-04-17 14:57:53 +02:00
Matteo Pagliazzi 495d01f386 fix(static files): cache more static files (#12102) 2020-04-17 14:52:28 +02:00
Matteo Pagliazzi 24e1bfdfba add basic test, disable etag on post routes as well, paypal ipn: prevent set headers after response error 2020-04-17 14:50:09 +02:00
Matteo Pagliazzi f757e645b7 disable caching for the /status api route 2020-04-17 14:22:32 +02:00
Matteo Pagliazzi bf492933cc fix(cache): explicitly disable caching for most api routes 2020-04-17 14:22:20 +02:00
Matteo Pagliazzi 86d2fed76e fix(apple auth): minor fixes, make sure apple auth users are considered when sending emails 2020-04-16 23:23:08 +02:00
Melior 2b7fe7c1d5 Merge branch 'origin/develop' into Weblate. 2020-04-16 22:19:38 +02:00
Melior 999b62df43 Translated using Weblate (Dutch)
Currently translated at 95.0% (76 of 80 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/nl/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (248 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/

Translated using Weblate (Vietnamese)

Currently translated at 21.6% (31 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/vi/

Translated using Weblate (Vietnamese)

Currently translated at 11.1% (16 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/vi/

Translated using Weblate (Japanese)

Currently translated at 91.5% (227 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (126 of 126 strings)

Translation: Habitica/Communityguidelines
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (80 of 80 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/

Translated using Weblate (Dutch)

Currently translated at 90.0% (72 of 80 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/nl/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (134 of 134 strings)

Translation: Habitica/Challenge
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 88.7% (71 of 80 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (80 of 80 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (694 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
2020-04-16 22:19:26 +02:00
Sabe Jones cc7dac47c4 4.140.4 2020-04-16 15:18:00 -05:00
Sabe Jones c8189360d6 Merge branch 'develop' into release 2020-04-16 15:17:56 -05:00
Sabe Jones 88183149c5 chore(news): Bailey 2020-04-16 15:17:14 -05:00
Matteo Pagliazzi a8f397c674 fix(join group): do not throw if inviter has does not exist 2020-04-15 21:43:24 +02:00
Matteo Pagliazzi c5aeab652d Push Notifications Fixes - Part 2 (#12092)
* push notifications: handle some more error codes and when the user is loaded using .lean()

* fix lint

* do not send push notification if message is missing
2020-04-15 21:36:53 +02:00
Melior cc04761c24 Merge branch 'origin/develop' into Weblate. 2020-04-14 22:55:19 +02:00
Melior 29dccdd148 Translated using Weblate (Dutch)
Currently translated at 95.9% (666 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/nl/

Merge branch 'origin/develop' into Weblate.

Translated using Weblate (Swedish)

Currently translated at 95.0% (133 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/sv/

Translated using Weblate (German)

Currently translated at 99.7% (2086 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/

Translated using Weblate (Romanian)

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ro/

Translated using Weblate (Dutch)

Currently translated at 95.3% (662 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/nl/

Translated using Weblate (German)

Currently translated at 99.8% (693 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/

Translated using Weblate (German)

Currently translated at 99.8% (693 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/

Translated using Weblate (Romanian)

Currently translated at 100.0% (126 of 126 strings)

Translation: Habitica/Communityguidelines
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ro/

Translated using Weblate (Japanese)

Currently translated at 100.0% (67 of 67 strings)

Translation: Habitica/Messages
Translate-URL: https://translate.habitica.com/projects/habitica/messages/ja/

Translated using Weblate (Japanese)

Currently translated at 100.0% (492 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/

Translated using Weblate (Japanese)

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/

Translated using Weblate (Romanian)

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (492 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/

Translated using Weblate (German)

Currently translated at 99.4% (2080 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/

Translated using Weblate (Russian)

Currently translated at 99.5% (691 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ru/

Translated using Weblate (Japanese)

Currently translated at 90.3% (224 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/

Translated using Weblate (Russian)

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/ru/

Translated using Weblate (Dutch)

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/nl/

Translated using Weblate (Romanian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (67 of 67 strings)

Translation: Habitica/Messages
Translate-URL: https://translate.habitica.com/projects/habitica/messages/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (31 of 31 strings)

Translation: Habitica/Maintenance
Translate-URL: https://translate.habitica.com/projects/habitica/maintenance/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (63 of 63 strings)

Translation: Habitica/Defaulttasks
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ro/

Translated using Weblate (Russian)

Currently translated at 98.7% (685 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ru/

Translated using Weblate (Dutch)

Currently translated at 94.6% (657 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/nl/

Translated using Weblate (French)

Currently translated at 100.0% (694 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/

Translated using Weblate (French)

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (694 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
2020-04-14 22:55:14 +02:00
Denys Dorokhov 186b929e59 API-v4 route added: 'api/v4/faq' fixes #11801 (#11905)
* feat(api-v4): new /faq route added

* refactor(server): change of function name in libs/content.js
2020-04-14 22:14:53 +02:00
Matteo Pagliazzi 551abf292c Removed loading screen tips, fixes #11834 (#12063)
* removed loading tip div

* removed loading tip number logic

* removed loadingScreenTips.json
2020-04-14 22:03:57 +02:00
Sabe Jones 1e1c058d82 Merge branch 'release' into develop 2020-04-14 14:50:46 -05:00
Sabe Jones 2ea9070a9b 4.140.3 2020-04-14 14:50:10 -05:00
Sabe Jones 168a3a6e89 Merge branch 'sabrecat/potion-time' into release 2020-04-14 14:49:18 -05:00
Sabe Jones 67bd2d9130 feat(content): enable spring avatar customizations 2020-04-14 14:49:11 -05:00
Matteo Pagliazzi cb0280ca8b fix(lint): move old migration to archive 2020-04-14 19:15:29 +02:00
Matteo Pagliazzi 259b15877b chore(deps): remove unused aws-sdk file and dependency 2020-04-14 17:03:42 +02:00
Matteo Pagliazzi dd31f559c7 onboarding guide improvements (#12068) 2020-04-13 16:19:46 +02:00
dependabot-preview[bot] 6c29ea8c4c build(deps): bump @vue/cli-plugin-unit-mocha in /website/client (#12081)
Bumps [@vue/cli-plugin-unit-mocha](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-unit-mocha) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.1/packages/@vue/cli-plugin-unit-mocha)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-13 14:53:29 +02:00
dependabot-preview[bot] dc316ad1c8 build(deps): bump @vue/cli-plugin-eslint in /website/client (#12076)
Bumps [@vue/cli-plugin-eslint](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-eslint) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.1/packages/@vue/cli-plugin-eslint)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-13 13:35:39 +02:00
dependabot-preview[bot] a5b37fcc02 build(deps): bump @vue/cli-service in /website/client (#12080)
Bumps [@vue/cli-service](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-service) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.1/packages/@vue/cli-service)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-13 13:31:25 +02:00
Matteo Pagliazzi 16f1c7286b Merge pull request #12084 from HabitRPG/dependabot/npm_and_yarn/website/client/vue/cli-plugin-router-4.3.1
build(deps): bump @vue/cli-plugin-router from 4.3.0 to 4.3.1 in /website/client
2020-04-13 13:28:15 +02:00
Matteo Pagliazzi d5b3e4ec9f Merge pull request #12075 from HabitRPG/dependabot/npm_and_yarn/website/client/bootstrap-vue-2.11.0
build(deps): bump bootstrap-vue from 2.10.1 to 2.11.0 in /website/client
2020-04-13 13:27:53 +02:00
Matteo Pagliazzi 47eb9bf3ff Merge pull request #12073 from HabitRPG/dependabot/npm_and_yarn/website/client/vue/cli-plugin-babel-4.3.1
build(deps): bump @vue/cli-plugin-babel from 4.3.0 to 4.3.1 in /website/client
2020-04-13 13:27:31 +02:00
Matteo Pagliazzi 2977346ccb Merge pull request #12074 from HabitRPG/dependabot/npm_and_yarn/website/client/amplitude-js-5.11.0
build(deps): bump amplitude-js from 5.10.0 to 5.11.0 in /website/client
2020-04-13 13:27:23 +02:00
Matteo Pagliazzi a545cc72d0 Merge pull request #12077 from HabitRPG/dependabot/npm_and_yarn/website/client/core-js-3.6.5
build(deps): bump core-js from 3.6.4 to 3.6.5 in /website/client
2020-04-13 13:27:08 +02:00
Matteo Pagliazzi 82548f69e5 Merge pull request #12078 from HabitRPG/dependabot/npm_and_yarn/website/client/jquery-3.5.0
build(deps): bump jquery from 3.4.1 to 3.5.0 in /website/client
2020-04-13 13:27:02 +02:00
Matteo Pagliazzi 5aacae3ead build(deps): bump aws-sdk from 2.653.0 to 2.656.0 (#12082)
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.653.0 to 2.656.0.
- [Release notes](https://github.com/aws/aws-sdk-js/releases)
- [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js/compare/v2.653.0...v2.656.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-13 13:25:56 +02:00
dependabot-preview[bot] 9f8162b82c build(deps): bump @babel/preset-env from 7.9.0 to 7.9.5 (#12087)
Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.9.0 to 7.9.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.9.0...v7.9.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-13 13:25:39 +02:00
dependabot-preview[bot] 98a749b239 build(deps): bump @vue/cli-plugin-router in /website/client
Bumps [@vue/cli-plugin-router](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-router) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.1/packages/@vue/cli-plugin-router)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 05:30:11 +00:00
dependabot-preview[bot] 0cef9eff87 build(deps): bump aws-sdk from 2.653.0 to 2.656.0
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.653.0 to 2.656.0.
- [Release notes](https://github.com/aws/aws-sdk-js/releases)
- [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js/compare/v2.653.0...v2.656.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 05:29:33 +00:00
dependabot-preview[bot] 3189a944d7 build(deps): bump jquery from 3.4.1 to 3.5.0 in /website/client
Bumps [jquery](https://github.com/jquery/jquery) from 3.4.1 to 3.5.0.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Commits](https://github.com/jquery/jquery/compare/3.4.1...3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 05:26:48 +00:00
dependabot-preview[bot] 79066165e2 build(deps): bump core-js from 3.6.4 to 3.6.5 in /website/client
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.4 to 3.6.5.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.4...v3.6.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 05:25:49 +00:00
dependabot-preview[bot] c6f6df3f14 build(deps): bump bootstrap-vue from 2.10.1 to 2.11.0 in /website/client
Bumps [bootstrap-vue](https://github.com/bootstrap-vue/bootstrap-vue) from 2.10.1 to 2.11.0.
- [Release notes](https://github.com/bootstrap-vue/bootstrap-vue/releases)
- [Changelog](https://github.com/bootstrap-vue/bootstrap-vue/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.10.1...v2.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 05:23:51 +00:00
dependabot-preview[bot] 7bfd6ceca1 build(deps): bump amplitude-js from 5.10.0 to 5.11.0 in /website/client
Bumps [amplitude-js](https://github.com/amplitude/amplitude-javascript) from 5.10.0 to 5.11.0.
- [Release notes](https://github.com/amplitude/amplitude-javascript/releases)
- [Changelog](https://github.com/amplitude/Amplitude-JavaScript/blob/master/CHANGELOG.md)
- [Commits](https://github.com/amplitude/amplitude-javascript/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 05:22:44 +00:00
dependabot-preview[bot] 400f4dfb01 build(deps): bump @vue/cli-plugin-babel in /website/client
Bumps [@vue/cli-plugin-babel](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-babel) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.1/packages/@vue/cli-plugin-babel)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 05:21:52 +00:00
Alys 57a9fb5241 add comment to contributor.critical flag in user model 2020-04-13 15:15:26 +10:00
Sabe Jones 08c63f94fc fix(shops): improve featured potion and quest 2020-04-10 16:17:15 -05:00
Sabe Jones 9c6c90a2e9 fix(potions): call out limited time 2020-04-10 15:15:23 -05:00
Sabe Jones 39765895ee fix(quest): call out limited time 2020-04-10 13:53:52 -05:00
Matteo Pagliazzi 2a8fc7aea2 Push Notifications Improvements (#12019)
* start fixing push notitifications

* push notifications: refactor error handling

* remove comment and improve logging

* improve emails errors

* wip: start improving webhooks tests

* add max length to push notifications and tests

* fix typos
2020-04-10 16:41:44 +02:00
Melior 0a86d04a15 Merge branch 'origin/develop' into Weblate. 2020-04-09 13:32:31 +02:00
Melior 3afa7e6da5 Translated using Weblate (Romanian)
Currently translated at 100.0% (248 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (67 of 67 strings)

Translation: Habitica/Messages
Translate-URL: https://translate.habitica.com/projects/habitica/messages/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (31 of 31 strings)

Translation: Habitica/Maintenance
Translate-URL: https://translate.habitica.com/projects/habitica/maintenance/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (180 of 180 strings)

Translation: Habitica/Limited
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (492 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (2091 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (63 of 63 strings)

Translation: Habitica/Defaulttasks
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (694 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (126 of 126 strings)

Translation: Habitica/Communityguidelines
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (77 of 77 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ro/

Translated using Weblate (Japanese)

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/

Translated using Weblate (Romanian)

Currently translated at 87.5% (7 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (57 of 57 strings)

Translation: Habitica/Spells
Translate-URL: https://translate.habitica.com/projects/habitica/spells/ro/

Translated using Weblate (Romanian)

Currently translated at 93.7% (134 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ro/

Translated using Weblate (Romanian)

Currently translated at 87.5% (7 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (6 of 6 strings)

Translation: Habitica/Inventory
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/ro/

Translated using Weblate (Romanian)

Currently translated at 83.5% (1747 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ro/

Translated using Weblate (Romanian)

Currently translated at 41.2% (26 of 63 strings)

Translation: Habitica/Defaulttasks
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (28 of 28 strings)

Translation: Habitica/Rebirth
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/ro/

Translated using Weblate (Romanian)

Currently translated at 96.7% (30 of 31 strings)

Translation: Habitica/Maintenance
Translate-URL: https://translate.habitica.com/projects/habitica/maintenance/ro/

Translated using Weblate (Romanian)

Currently translated at 98.7% (324 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/

Translated using Weblate (Romanian)

Currently translated at 96.0% (121 of 126 strings)

Translation: Habitica/Communityguidelines
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/ro/

Translated using Weblate (Romanian)

Currently translated at 11.6% (9 of 77 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ro/

Translated using Weblate (Dutch)

Currently translated at 97.8% (137 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/nl/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (694 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (694 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (694 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/nl/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.8% (686 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/

Translated using Weblate (English (United Kingdom))

Currently translated at 99.4% (690 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/

Translated using Weblate (German)

Currently translated at 99.1% (688 of 694 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/de/

Translated using Weblate (German)

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
2020-04-09 13:32:17 +02:00
Sabe Jones 0ac0723be5 4.140.2 2020-04-09 06:28:11 -05:00
Sabe Jones 0f2d2ddad6 Merge branch 'develop' into release 2020-04-09 06:28:06 -05:00
Phillip Thelen 9d16ab7dba Sign in with Apple (#11793)
* add date check

* achievements modal polishing

* refresh private-messages page when you are already on it

* add countbadge knob to change the example

* fix lint

* typos

* typos

* typos

* add toggle for achievements categories

* typo

* fix test

* fix edit avatar modal cannot be closed

* WIP(settings): subscriber page improvements

* WIP(subscriptions): more design build-out

* fix(css): disabled button styles

* fix(css): better Amazon targeting

* fix hide tooltip + align header correctly

* disable perfect scroll

* load messages on refresh event

* fix header label + conversation actions not breaking layout on hover

* WIP(g1g1): notif

* WIP(g1g1): notif cont'd

* fix(test): snowball change

* fix(event): feature NYE card

* chore(sprites): compile

* fix(bgs): include TT required field

* add gifting banner to the max height calculation

* chore(event): enable winter customizations

* WIP(gifting): partial modal implementation

* feat(gifting): select giftee modal

* fix(gifting): notification order, modal dismiss

* Begin implementing sign in with apple

# Conflicts:
#	package-lock.json
#	website/common/script/constants.js
#	website/server/libs/auth/social.js
#	website/server/models/user/schema.js

* Add apple sign in button to website

* fix lint errors

* fix config json

* fix(modals): correct some repops

* fix(gifting): style updates

* fix(buy): modal style changes

* fix(modals): also clean out "prev"

* Attempt workaround for sign in with apple on android

* temporarily log everything as error

* refactor(modals): hide in dismiss event

* fix temporary test failure

* changes to sign in with apple

* fix: first batch of layout issues for private messages + auto sizing textarea

* fix(modals): new dismiss logic

* fix(modals): new dismiss no go??

* Only use email scope

* print debugging

* .

* ..

* ...

* username second line - open profile on face-avatar/conversation name - fix textarea height

* temporarily disable apple auth and just return data for debugging

* Hopefully this works

* .....

* WIP(subscription): unsubscribed state

* .

* ..

* MAYBE THIS ACTUALLY WORKS???

* Implement apple sign in

* fix some urls

* fix urls

* fix redirect and auth

* attempt to also request name

* fix lint error

* WIP(subscription): partial subscribed

* chore(sprites): compile

* Change approach so that it actually works

* fix config error

* fix lint errors

* Fix

* fix lint error

* lint error

* WIP(subscription): finish subscribed

* refresh on sync

* new "you dont have any messages" style + changed min textarea height

* new conversationItem style / layout

* reset message unread on reload

* chore(npm): update package-locks

* fix styles / textarea height

* feat(subscription): revised sub page RC

* list optOut / chatRevoked informations for each conversation + show why its disabled

* Improve apple redirect view

* Fix apple icon on group task registration page

* WIP(adventure): prereqs

* Block / Unblock - correct disabled states - $gray-200 instead of 300/400

* canReceive not checking chatRevoked

* fix: faceAvatar / userLink open the selected conversation user

* check if the target user is blocking the logged-in user

* fix(subs): style tweaks

* fix(profiles): short circuit contributor
Attempted fix for #11830

* chore(sprites): compile

* fix(content): missing potion data

* fix(content): missing string

* WIP(drops): new modal

* fix(subs): moar style tweaks

* check if blocks is undefined

* max-height instead of height

* fix "no messages" state + canReceive on a new conversation

* WIP(adventure): analytics fixes etc

* Improve apple signin handling

* fixed conversations width (280px on max 768 width page)

* feat(adventure): random egg+potion on 2nd task

* fix(lint): noworkies

* fix(modal): correctly construct classes

* fix(tests): expectations and escape

* Fix typo

* use base url from env variables

* fix lint

* call autosize after message is sent

* fix urls

* always verify token

* throw error when social auth could not retrieve id

* Store emails correctly for apple auth

* Retrieve name when authenticating through apple

* Fix lint errors

* fix all lint errors

* fix(content): missing strings

* Revert "always verify token"

This reverts commit 8ac40c76bf.

# Conflicts:
#	website/server/libs/auth/social.js

* Correctly load name

* remove extra changes

* remove extra logger call

* reset package and package-lock

* add back missing packages

* use name from apple

* add support for multiple apple public keys

* add some unit and integration tests

* add apple auth integration test

* tweak social signup buttons

* pixel pushing

Co-authored-by: Matteo Pagliazzi <matteopagliazzi@gmail.com>
Co-authored-by: Sabe Jones <sabrecat@gmail.com>
Co-authored-by: negue <eugen.bolz@gmail.com>
Co-authored-by: Phillip Thelen <phillip@habitica.com>
2020-04-08 18:44:30 +02:00
Anoop Ravella 776e9834f3 removed loadingScreenTips.json 2020-04-08 11:18:18 -04:00
Melior 1d98929453 Merge branch 'origin/develop' into Weblate.
Merge branch 'origin/develop' into Weblate.

Translated using Weblate (Dutch)

Currently translated at 100.0% (248 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/nl/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (2091 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2091 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2091 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2091 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (2091 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (2091 of 2091 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (522 of 522 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
2020-04-08 00:18:20 +02:00
Matteo Pagliazzi 80664b6c5f Merge pull request #12016 from inftp/ptsFix
stop 'pts' from overflowing to next line
2020-04-07 22:22:12 +02:00
Matteo Pagliazzi 01123367b1 Merge pull request #12045 from JohnJSal/patch-1
Removed an unnecessary word in quest completion text
2020-04-07 22:20:10 +02:00
Sabe Jones f6a80d18b6 Merge branch 'release' into develop 2020-04-07 14:08:41 -05:00
Matteo Pagliazzi 9ac7840940 chore(winston-loggly-bulk): upgrade 2020-04-07 15:18:52 +02:00
Anoop Ravella 100275f460 removed loading tip number logic 2020-04-06 17:20:40 -04:00
Anoop Ravella 489b9c4019 removed loading tip div 2020-04-06 17:05:25 -04:00
Melior cbc6e7aa0c Merge branch 'origin/develop' into Weblate. 2020-04-06 17:48:06 +02:00
Sabe Jones b6eab67e6a Merge branch 'release' into develop 2020-04-06 10:42:45 -05:00
Melior f920a441a5 Translated using Weblate (Romanian)
Currently translated at 98.6% (227 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (36 of 36 strings)

Translation: Habitica/Loadingscreentips
Translate-URL: https://translate.habitica.com/projects/habitica/loadingscreentips/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Tasks
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/ro/

Translated using Weblate (Dutch)

Currently translated at 99.5% (247 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/nl/

Translated using Weblate (Romanian)

Currently translated at 100.0% (57 of 57 strings)

Translation: Habitica/Spells
Translate-URL: https://translate.habitica.com/projects/habitica/spells/ro/

Translated using Weblate (Dutch)

Currently translated at 100.0% (28 of 28 strings)

Translation: Habitica/Rebirth
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/nl/

Translated using Weblate (Romanian)

Currently translated at 100.0% (12 of 12 strings)

Translation: Habitica/Merch
Translate-URL: https://translate.habitica.com/projects/habitica/merch/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (27 of 27 strings)

Translation: Habitica/Loginincentives
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/ro/

Translated using Weblate (Romanian)

Currently translated at 98.7% (324 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/

Translated using Weblate (Romanian)

Currently translated at 100.0% (15 of 15 strings)

Translation: Habitica/Death
Translate-URL: https://translate.habitica.com/projects/habitica/death/ro/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (485 of 485 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 99.3% (142 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ru/

Translated using Weblate (Russian)

Currently translated at 96.1% (173 of 180 strings)

Translation: Habitica/Limited
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/

Translated using Weblate (Russian)

Currently translated at 97.9% (2042 of 2085 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2085 of 2085 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/

Translated using Weblate (Russian)

Currently translated at 98.6% (508 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2085 of 2085 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (685 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt_BR/
2020-04-06 13:53:15 +02:00
Matteo Pagliazzi 12a9eec540 build(deps): bump @vue/cli-plugin-eslint in /website/client (#12054)
Bumps [@vue/cli-plugin-eslint](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-eslint) from 4.2.3 to 4.3.0.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.0/packages/@vue/cli-plugin-eslint)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 11:34:51 +02:00
dependabot-preview[bot] f83d86b7f3 build(deps): bump @vue/cli-plugin-unit-mocha in /website/client (#12058)
Bumps [@vue/cli-plugin-unit-mocha](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-unit-mocha) from 4.2.3 to 4.3.0.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.0/packages/@vue/cli-plugin-unit-mocha)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 11:34:41 +02:00
dependabot-preview[bot] 0410c97001 build(deps): bump @vue/cli-plugin-eslint in /website/client
Bumps [@vue/cli-plugin-eslint](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-eslint) from 4.2.3 to 4.3.0.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.0/packages/@vue/cli-plugin-eslint)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-06 09:33:11 +00:00
dependabot-preview[bot] 4482b734a5 build(deps): bump @vue/cli-plugin-router in /website/client (#12056)
Bumps [@vue/cli-plugin-router](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-router) from 4.2.3 to 4.3.0.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.0/packages/@vue/cli-plugin-router)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 11:30:38 +02:00
dependabot-preview[bot] 0131cc07bf build(deps): bump @vue/cli-service in /website/client (#12051)
Bumps [@vue/cli-service](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-service) from 4.2.3 to 4.3.0.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.0/packages/@vue/cli-service)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 11:30:26 +02:00
dependabot-preview[bot] 70a9f66dcd build(deps): bump @vue/cli-plugin-babel in /website/client (#12049)
Bumps [@vue/cli-plugin-babel](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-babel) from 4.2.3 to 4.3.0.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.3.0/packages/@vue/cli-plugin-babel)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 11:30:10 +02:00
dependabot-preview[bot] 3057fdbd4a build(deps): bump @storybook/addon-links in /website/client (#12047)
Bumps [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/addons/links) from 5.3.17 to 5.3.18.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.18/addons/links)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 11:01:56 +02:00
Matteo Pagliazzi cc48479c66 Merge branch 'release' into develop 2020-04-06 11:01:29 +02:00
dependabot-preview[bot] f4e573f684 build(deps): bump bootstrap-vue from 2.9.0 to 2.10.1 in /website/client (#12050)
Bumps [bootstrap-vue](https://github.com/bootstrap-vue/bootstrap-vue) from 2.9.0 to 2.10.1.
- [Release notes](https://github.com/bootstrap-vue/bootstrap-vue/releases)
- [Changelog](https://github.com/bootstrap-vue/bootstrap-vue/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.9.0...v2.10.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 10:53:56 +02:00
dependabot-preview[bot] a2e59d0920 build(deps): bump @storybook/addon-knobs in /website/client (#12048)
Bumps [@storybook/addon-knobs](https://github.com/storybookjs/storybook/tree/HEAD/addons/knobs) from 5.3.17 to 5.3.18.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.18/addons/knobs)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 10:53:48 +02:00
dependabot-preview[bot] 39fe86c688 build(deps): bump @storybook/addon-notes in /website/client (#12046)
Bumps [@storybook/addon-notes](https://github.com/storybookjs/storybook/tree/HEAD/addons/notes) from 5.3.17 to 5.3.18.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v5.3.18/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.18/addons/notes)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 10:53:38 +02:00
dependabot-preview[bot] 78ceb427a3 build(deps): bump @storybook/addon-actions in /website/client (#12052)
Bumps [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/addons/actions) from 5.3.17 to 5.3.18.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.18/addons/actions)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 10:50:15 +02:00
dependabot-preview[bot] 7c17a32bbb build(deps): bump @storybook/vue in /website/client (#12057)
Bumps [@storybook/vue](https://github.com/storybookjs/storybook/tree/HEAD/app/vue) from 5.3.17 to 5.3.18.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.18/app/vue)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 10:49:52 +02:00
dependabot-preview[bot] 9a34c16fa2 build(deps): bump aws-sdk from 2.648.0 to 2.653.0 (#12061)
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.648.0 to 2.653.0.
- [Release notes](https://github.com/aws/aws-sdk-js/releases)
- [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js/compare/v2.648.0...v2.653.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 10:48:57 +02:00
dependabot-preview[bot] 38c24763fa build(deps): bump mongoose from 5.9.6 to 5.9.7 (#12062)
Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.9.6 to 5.9.7.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md)
- [Commits](https://github.com/Automattic/mongoose/compare/5.9.6...5.9.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-04-06 10:48:17 +02:00
JohnJSal 776f3d288b Removed an unnecessary word in quest completion text
Changed "Great job catching the that would-be arsonist..." to "Great job catching that would-be arsonist..." in the quest completion text for "Bye, Bye, Butterfry."
2020-04-05 12:09:17 -05:00
hamboomger b7448e2cfe fix(server-api): cancelSubscription() is no longer called twice when user leaves group 2020-04-05 15:06:16 +03:00
hamboomger 0bc836b490 refactor(payments): unit tests created for calculation of subscription termination date 2020-04-05 15:06:16 +03:00
hamboomger fdf7e3a665 fix(db-schema): typo fixed in group.hasCancelled() schema metod name 2020-04-05 15:06:16 +03:00
hamboomger 00d12e83bd refactor(db-schema): group.isSubscribed() method name changed to group.hasActiveGroupPlan() 2020-04-05 15:06:16 +03:00
Matteo Pagliazzi e4661c3763 Merge branch 'release' into develop 2020-04-04 13:49:59 +02:00
inftp 156d15c540 Merge remote-tracking branch 'upstream/develop' into ptsFix 2020-04-04 16:29:34 +11:00
inftp 7d9b8a5ceb use bootstrap native style rather than custom 2020-04-04 16:28:10 +11:00
Matteo Pagliazzi 95c9dbaa73 Merge branch 'release' into develop 2020-04-04 00:19:17 +02:00
Matteo Pagliazzi d9f7772453 chore(deps): upgrade slack to v4 2020-04-04 00:03:28 +02:00
Melior 8efed37241 Merge branch 'origin/develop' into Weblate. 2020-04-02 23:19:42 +02:00
Melior 66422d4235 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (248 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hant/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hant/

Translated using Weblate (Dutch)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/nl/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (2085 of 2085 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2085 of 2085 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 98.8% (170 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (4 of 4 strings)

Translation: Habitica/Noscript
Translate-URL: https://translate.habitica.com/projects/habitica/noscript/nl/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/en_GB/

Translated using Weblate (French)

Currently translated at 100.0% (248 of 248 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/

Translated using Weblate (French)

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/fr/

Translated using Weblate (German)

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/de/

Translated using Weblate (French)

Currently translated at 100.0% (2085 of 2085 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/

Translated using Weblate (German)

Currently translated at 99.4% (2074 of 2085 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
2020-04-02 13:30:18 +02:00
inftp eb4e382ecf stop 'pts' from overflowing to next line 2020-03-26 14:52:25 +11:00
271 changed files with 15890 additions and 12201 deletions
+1
View File
@@ -37,6 +37,7 @@ yarn.lock
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml
/.vscode
# webstorm fake webpack for path intellisense
webpack.webstorm.config
+1
View File
@@ -9,3 +9,4 @@ test/**
*.swp
*.swx
website/raw_sprites/**
content_cache/**
+1
View File
@@ -12,6 +12,7 @@ ENV GOOGLE_CLIENT_ID 1035232791481-32vtplgnjnd1aufv3mcu1lthf31795fq.apps.googleu
ENV LOGGLY_CLIENT_TOKEN ab5663bf-241f-4d14-8783-7d80db77089a
ENV NODE_ENV production
ENV STRIPE_PUB_KEY pk_85fQ0yMECHNfHTSsZoxZXlPSwSNfA
ENV APPLE_AUTH_CLIENT_ID 9Q9SMRMCNN.com.habitrpg.ios.Habitica
# Install global packages
RUN npm install -g gulp-cli mocha
+6 -1
View File
@@ -75,5 +75,10 @@
"WEB_CONCURRENCY": 1,
"SKIP_SSL_CHECK_KEY": "key",
"ENABLE_STACKDRIVER_TRACING": "false",
"BLOCKED_IPS": ""
"APPLE_AUTH_PRIVATE_KEY": "",
"APPLE_TEAM_ID": "",
"APPLE_AUTH_CLIENT_ID": "",
"APPLE_AUTH_KEY_ID": "",
"BLOCKED_IPS": "",
"LOG_AMPLITUDE_EVENTS": "false"
}
+2 -2
View File
@@ -6,7 +6,7 @@ gulp.task('content:cache', done => {
// Requiring at runtime because these files access `common`
// code which in production works only if transpiled so after
// gulp build:babel:common has run
const { CONTENT_CACHE_PATH, getLocalizedContent } = require('../website/server/libs/content'); // eslint-disable-line global-require
const { CONTENT_CACHE_PATH, getLocalizedContentResponse } = require('../website/server/libs/content'); // eslint-disable-line global-require
const { langCodes } = require('../website/server/libs/i18n'); // eslint-disable-line global-require
try {
@@ -23,7 +23,7 @@ gulp.task('content:cache', done => {
langCodes.forEach(langCode => {
fs.writeFileSync(
`${CONTENT_CACHE_PATH}${langCode}.json`,
getLocalizedContent(langCode),
getLocalizedContentResponse(langCode),
'utf8',
);
});
+498 -274
View File
File diff suppressed because it is too large Load Diff
+9 -7
View File
@@ -1,11 +1,11 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.140.1",
"version": "4.140.10",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.9.0",
"@babel/preset-env": "^7.9.0",
"@babel/preset-env": "^7.9.5",
"@babel/register": "^7.9.0",
"@google-cloud/trace-agent": "^4.2.5",
"@slack/client": "^4.12.0",
@@ -14,7 +14,7 @@
"amplitude": "^3.5.0",
"apidoc": "^0.17.5",
"apn": "^2.2.0",
"aws-sdk": "^2.648.0",
"apple-auth": "^1.0.5",
"bcrypt": "^3.0.8",
"body-parser": "^1.18.3",
"compression": "^1.7.4",
@@ -41,18 +41,20 @@
"image-size": "^0.8.3",
"in-app-purchase": "^1.11.3",
"js2xmlparser": "^4.0.1",
"jsonwebtoken": "^8.5.1",
"jwks-rsa": "^1.8.0",
"lodash": "^4.17.15",
"merge-stream": "^2.0.0",
"method-override": "^3.0.0",
"moment": "^2.24.0",
"moment-recur": "^1.0.7",
"mongoose": "^5.9.6",
"mongoose": "^5.9.9",
"morgan": "^1.10.0",
"nconf": "^0.10.0",
"node-gcm": "^1.0.2",
"on-headers": "^1.0.2",
"passport": "^0.4.1",
"passport-facebook": "^3.0.0",
"passport-google-oauth2": "^0.2.0",
"passport-google-oauth20": "1.0.0",
"paypal-ipn": "3.0.0",
"paypal-rest-sdk": "^1.8.1",
@@ -69,7 +71,7 @@
"validator": "^11.0.0",
"vinyl-buffer": "^1.0.1",
"winston": "^3.2.1",
"winston-loggly-bulk": "^3.0.1",
"winston-loggly-bulk": "^3.1.0",
"xml2js": "^0.4.23"
},
"private": true,
@@ -109,7 +111,7 @@
"expect.js": "^0.3.1",
"istanbul": "^1.1.0-alpha.1",
"mocha": "^5.1.1",
"monk": "^7.1.2",
"monk": "^7.2.0",
"require-again": "^2.0.0",
"sinon": "^7.2.4",
"sinon-chai": "^3.5.0",
+2 -2
View File
@@ -8,9 +8,9 @@ describe('contentLib', () => {
});
});
describe('getLocalizedContent', () => {
describe('getLocalizedContentResponse', () => {
it('clones, not modify, the original content data', () => {
contentLib.getLocalizedContent();
contentLib.getLocalizedContentResponse();
expect(typeof content.backgrounds.backgrounds062014.beach.text).to.equal('function');
});
});
+48
View File
@@ -18,6 +18,16 @@ function getUser () {
value: 'email@facebook',
}],
},
google: {
emails: [{
value: 'email@google',
}],
},
apple: {
emails: [{
value: 'email@apple',
}],
},
},
profile: {
name: 'profile name',
@@ -58,6 +68,8 @@ describe('emails', () => {
const user = getUser();
delete user.profile.name;
delete user.auth.local.email;
delete user.auth.google.emails;
delete user.auth.apple.emails;
const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']);
@@ -67,12 +79,48 @@ describe('emails', () => {
expect(data).to.have.property('canSend', true);
});
it('returns correct user data [google users]', () => {
const attachEmail = requireAgain(pathToEmailLib);
const { getUserInfo } = attachEmail;
const user = getUser();
delete user.profile.name;
delete user.auth.local.email;
delete user.auth.facebook.emails;
delete user.auth.apple.emails;
const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']);
expect(data).to.have.property('name', user.auth.local.username);
expect(data).to.have.property('email', user.auth.google.emails[0].value);
expect(data).to.have.property('_id', user._id);
expect(data).to.have.property('canSend', true);
});
it('returns correct user data [apple users]', () => {
const attachEmail = requireAgain(pathToEmailLib);
const { getUserInfo } = attachEmail;
const user = getUser();
delete user.profile.name;
delete user.auth.local.email;
delete user.auth.google.emails;
delete user.auth.facebook.emails;
const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']);
expect(data).to.have.property('name', user.auth.local.username);
expect(data).to.have.property('email', user.auth.apple.emails[0].value);
expect(data).to.have.property('_id', user._id);
expect(data).to.have.property('canSend', true);
});
it('has fallbacks for missing data', () => {
const attachEmail = requireAgain(pathToEmailLib);
const { getUserInfo } = attachEmail;
const user = getUser();
delete user.auth.local.email;
delete user.auth.facebook;
delete user.auth.google;
delete user.auth.apple;
const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']);
-60
View File
@@ -1,60 +0,0 @@
import mongoose from 'mongoose';
import {
highlightMentions,
} from '../../../../website/server/libs/highlightMentions';
describe('highlightMentions', () => {
beforeEach(() => {
const mockFind = {
select () {
return this;
},
lean () {
return this;
},
exec () {
return Promise.resolve([{
auth: { local: { username: 'user' } }, _id: '111',
}, { auth: { local: { username: 'user2' } }, _id: '222' }, { auth: { local: { username: 'user3' } }, _id: '333' }, { auth: { local: { username: 'user-dash' } }, _id: '444' }, { auth: { local: { username: 'user_underscore' } }, _id: '555' },
]);
},
};
sinon.stub(mongoose.Model, 'find').returns(mockFind);
});
afterEach(() => {
sinon.restore();
});
it('doesn\'t change text without mentions', async () => {
const text = 'some chat text';
const result = await highlightMentions(text);
expect(result[0]).to.equal(text);
});
it('highlights existing users', async () => {
const text = '@user: message';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@user](/profile/111): message');
});
it('highlights special characters', async () => {
const text = '@user-dash: message @user_underscore';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
});
it('doesn\'t highlight nonexisting users', async () => {
const text = '@nouser message';
const result = await highlightMentions(text);
expect(result[0]).to.equal('@nouser message');
});
it('highlights multiple existing users', async () => {
const text = '@user message (@user2) @user3 @user';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@user](/profile/111) message ([@user2](/profile/222)) [@user3](/profile/333) [@user](/profile/111)');
});
it('doesn\'t highlight more than 5 users', async () => {
const text = '@user @user2 @user3 @user4 @user5 @user6';
const result = await highlightMentions(text);
expect(result[0]).to.equal(text);
});
});
@@ -0,0 +1,122 @@
import mongoose from 'mongoose';
import highlightMentions from '../../../../website/server/libs/highlightMentions';
describe('highlightMentions', () => {
beforeEach(() => {
const mockFind = {
select () {
return this;
},
lean () {
return this;
},
exec () {
return Promise.resolve([
{ auth: { local: { username: 'user' } }, _id: '111' },
{ auth: { local: { username: 'user2' } }, _id: '222' },
{ auth: { local: { username: 'user3' } }, _id: '333' },
{ auth: { local: { username: 'user-dash' } }, _id: '444' },
{ auth: { local: { username: 'user_underscore' } }, _id: '555' },
]);
},
};
sinon.stub(mongoose.Model, 'find').returns(mockFind);
});
afterEach(() => {
sinon.restore();
});
it('doesn\'t change text without mentions', async () => {
const text = 'some chat text';
const result = await highlightMentions(text);
expect(result[0]).to.equal(text);
});
it('highlights existing users', async () => {
const text = '@user: message';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@user](/profile/111): message');
});
it('highlights special characters', async () => {
const text = '@user-dash: message @user_underscore';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
});
it('doesn\'t highlight nonexisting users', async () => {
const text = '@nouser message';
const result = await highlightMentions(text);
expect(result[0]).to.equal('@nouser message');
});
it('highlights multiple existing users', async () => {
const text = '@user message (@user2) @user3 @user';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@user](/profile/111) message ([@user2](/profile/222)) [@user3](/profile/333) [@user](/profile/111)');
});
it('doesn\'t highlight more than 5 users', async () => {
const text = '@user @user2 @user3 @user4 @user5 @user6';
const result = await highlightMentions(text);
expect(result[0]).to.equal(text);
});
describe('exceptions in code blocks', () => {
it('doesn\'t highlight user in inline code block', async () => {
const text = '`@user`';
const result = await highlightMentions(text);
expect(result[0]).to.equal(text);
});
it('doesn\'t highlight user in fenced code block', async () => {
const text = 'Text\n\n```\n// code referencing @user\n```\n\nText';
const result = await highlightMentions(text);
expect(result[0]).to.equal(text);
});
it('doesn\'t highlight user in indented code block', async () => {
const text = ' @user';
const result = await highlightMentions(text);
expect(result[0]).to.equal(text);
});
it('does highlight user that\'s after in-line code block', async () => {
const text = '`<code />` for @user';
const result = await highlightMentions(text);
expect(result[0]).to.equal('`<code />` for [@user](/profile/111)');
});
it('does highlight same content properly', async () => {
const text = '@user `@user`';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@user](/profile/111) `@user`');
});
});
it('github issue 12118, method crashes when square brackets are used', async () => {
const text = '[test]';
let err;
try {
await highlightMentions(text);
} catch (e) {
err = e;
}
expect(err).to.be.undefined;
});
});
+22
View File
@@ -0,0 +1,22 @@
import faq from '../../../../website/common/script/content/faq';
import common from '../../../../website/common';
import { localizeContentData } from '../../../../website/server/libs/content';
const { i18n } = common;
describe('localizeContentData', () => {
it('Should take a an object with localization identifiers and '
+ 'return an object with actual translations in English', () => {
const faqInEnglish = localizeContentData(faq, 'en');
expect(faqInEnglish).to.have.property('stillNeedHelp');
expect(faqInEnglish.stillNeedHelp.ios).to.equal(i18n.t('iosFaqStillNeedHelp', 'en'));
});
it('Should take an object with localization identifiers and '
+ 'return an object with actual translations in German', () => {
const faqInEnglish = localizeContentData(faq, 'de');
expect(faqInEnglish).to.have.property('stillNeedHelp');
expect(faqInEnglish.stillNeedHelp.ios).to.equal(i18n.t('iosFaqStillNeedHelp', 'de'));
});
});
@@ -0,0 +1,64 @@
import moment from 'moment';
import { calculateSubscriptionTerminationDate } from '../../../../../../website/server/libs/payments/util';
import api from '../../../../../../website/server/libs/payments/payments';
describe('#calculateSubscriptionTerminationDate', () => {
let plan;
let nextBill;
beforeEach(() => {
plan = {
customerId: 'customer-id',
extraMonths: 0,
};
nextBill = moment();
});
it('should extend date to the exact amount of days left before the next bill will occur', () => {
nextBill = moment()
.add(5, 'days');
const expectedTerminationDate = moment()
.add(5, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('if nextBill is null, add 30 days to termination date', () => {
nextBill = null;
const expectedTerminationDate = moment()
.add(30, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('if nextBill is null and it\'s a group plan, add 2 days instead of 30', () => {
nextBill = null;
plan.customerId = api.constants.GROUP_PLAN_CUSTOMER_ID;
const expectedTerminationDate = moment()
.add(2, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('should add 30.5 days for each extraMonth', () => {
plan.extraMonths = 4;
const expectedTerminationDate = moment()
.add(30.5 * 4, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('should round up if total days gained by extraMonth is a decimal number', () => {
plan.extraMonths = 5;
const expectedTerminationDate = moment()
.add(Math.ceil(30.5 * 5), 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('behaves like extraMonths is 0 if it\'s set to a negative number', () => {
plan.extraMonths = -5;
const expectedTerminationDate = moment();
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
});
+66 -5
View File
@@ -1,13 +1,15 @@
import requireAgain from 'require-again';
import apn from 'apn/mock';
import _ from 'lodash';
import nconf from 'nconf';
import gcmLib from 'node-gcm'; // works with FCM notifications too
import { model as User } from '../../../../website/server/models/user';
import {
sendNotification as sendPushNotification,
MAX_MESSAGE_LENGTH,
} from '../../../../website/server/libs/pushNotifications';
describe('pushNotifications', () => {
let user;
let sendPushNotification;
const pathToPushNotifications = '../../../../website/server/libs/pushNotifications';
let fcmSendSpy;
let apnSendSpy;
@@ -28,8 +30,6 @@ describe('pushNotifications', () => {
on: () => null,
send: apnSendSpy,
});
sendPushNotification = requireAgain(pathToPushNotifications).sendNotification;
});
afterEach(() => {
@@ -86,6 +86,67 @@ describe('pushNotifications', () => {
expect(apnSendSpy).to.not.have.been.called;
});
it('cuts the message to 300 chars', () => {
const longMessage = `12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345`;
expect(longMessage.length > MAX_MESSAGE_LENGTH).to.equal(true);
const details = {
identifier,
title,
message: longMessage,
payload: {
message: longMessage,
},
};
sendPushNotification(user, details);
expect(details.message).to.equal(_.truncate(longMessage, { length: MAX_MESSAGE_LENGTH }));
expect(details.payload.message)
.to.equal(_.truncate(longMessage, { length: MAX_MESSAGE_LENGTH }));
expect(details.message.length).to.equal(MAX_MESSAGE_LENGTH);
expect(details.payload.message.length).to.equal(MAX_MESSAGE_LENGTH);
});
it('cuts the message to 300 chars (no payload)', () => {
const longMessage = `12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345
12345 12345 12345 12345 12345 12345 12345 12345 12345 12345`;
expect(longMessage.length > MAX_MESSAGE_LENGTH).to.equal(true);
const details = {
identifier,
title,
message: longMessage,
};
sendPushNotification(user, details);
expect(details.message).to.equal(_.truncate(longMessage, { length: MAX_MESSAGE_LENGTH }));
expect(details.message.length).to.equal(MAX_MESSAGE_LENGTH);
});
// TODO disabled because APN relies on a Promise
xit('uses APN for iOS devices', () => {
user.pushDevices.push({
+5 -1
View File
@@ -16,7 +16,7 @@ import {
defer,
sleep,
} from '../../../helpers/api-unit.helper';
import logger from '../../../../website/server/libs/logger';
describe('webhooks', () => {
let webhooks; let
@@ -356,6 +356,7 @@ describe('webhooks', () => {
});
it('records failures', async () => {
sinon.stub(logger, 'error');
const body = {};
sendWebhook.send(user, body);
@@ -369,6 +370,9 @@ describe('webhooks', () => {
expect(user.webhooks[0].failures).to.equal(1);
expect((Date.now() - user.webhooks[0].lastFailureAt.getTime()) < 10000).to.be.true;
expect(logger.error).to.be.calledOnce;
logger.error.restore();
});
it('disables a webhook after 10 failures', async () => {
+31
View File
@@ -0,0 +1,31 @@
import {
generateRes,
generateReq,
generateNext,
} from '../../../helpers/api-unit.helper';
import {
disableCache,
} from '../../../../website/server/middlewares/cache';
describe('cache middlewares', () => {
let res; let req; let
next;
beforeEach(() => {
req = generateReq();
res = generateRes();
next = generateNext();
});
describe('disableCache', () => {
it('sets the correct headers', () => {
disableCache(req, res, next);
expect(res.set).to.have.been.calledWith('Cache-Control', 'no-store');
expect(next).to.have.been.calledOnce;
});
xit('removes the etag header', () => {
// @TODO how to stub onHeaders
});
});
});
@@ -170,6 +170,7 @@ describe('errorHandler', () => {
originalUrl: req.originalUrl,
headers: req.headers,
body: req.body,
query: req.query,
httpCode: 400,
isHandledError: true,
});
+63 -41
View File
@@ -538,52 +538,74 @@ describe('Group Model', () => {
});
});
it('sends a chat message if no progress is made on quest with multiple items', async () => {
progress.collectedItems = 0;
party.quest.key = 'dilatoryDistress1';
party.quest.active = false;
describe('collection quests with multiple items', () => {
it('sends a chat message if no progress is made on quest with multiple items', async () => {
progress.collectedItems = 0;
party.quest.key = 'dilatoryDistress1';
party.quest.active = false;
await party.startQuest(questLeader);
Group.prototype.sendChat.resetHistory();
await party.save();
await party.startQuest(questLeader);
Group.prototype.sendChat.resetHistory();
await party.save();
await Group.processQuestProgress(participatingMember, progress);
await Group.processQuestProgress(participatingMember, progress);
party = await Group.findOne({ _id: party._id });
party = await Group.findOne({ _id: party._id });
expect(Group.prototype.sendChat).to.be.calledOnce;
expect(Group.prototype.sendChat).to.be.calledWith({
message: '`Participating Member found 0 Fire Coral, 0 Blue Fins.`',
info: {
items: { blueFins: 0, fireCoral: 0 },
quest: 'dilatoryDistress1',
type: 'user_found_items',
user: 'Participating Member',
},
expect(Group.prototype.sendChat).to.be.calledOnce;
expect(Group.prototype.sendChat).to.be.calledWith({
message: '`Participating Member found 0 Fire Coral, 0 Blue Fins.`',
info: {
items: { blueFins: 0, fireCoral: 0 },
quest: 'dilatoryDistress1',
type: 'user_found_items',
user: 'Participating Member',
},
});
});
});
it('handles collection quests with multiple items', async () => {
progress.collectedItems = 10;
party.quest.key = 'evilsanta2';
party.quest.active = false;
it('handles correctly', async () => {
progress.collectedItems = 10;
party.quest.key = 'evilsanta2';
party.quest.active = false;
await party.startQuest(questLeader);
Group.prototype.sendChat.resetHistory();
await party.save();
await party.startQuest(questLeader);
Group.prototype.sendChat.resetHistory();
await party.save();
await Group.processQuestProgress(participatingMember, progress);
await Group.processQuestProgress(participatingMember, progress);
party = await Group.findOne({ _id: party._id });
party = await Group.findOne({ _id: party._id });
expect(Group.prototype.sendChat).to.be.calledOnce;
expect(Group.prototype.sendChat).to.be.calledWithMatch({
message: sinon.match(/`Participating Member found/).and(sinon.match(/\d* (Tracks|Broken Twigs)/)),
info: {
quest: 'evilsanta2',
type: 'user_found_items',
user: 'Participating Member',
},
expect(Group.prototype.sendChat).to.be.calledOnce;
expect(Group.prototype.sendChat).to.be.calledWithMatch({
message: sinon.match(/`Participating Member found/).and(sinon.match(/\d* (Tracks|Broken Twigs)/)),
info: {
quest: 'evilsanta2',
type: 'user_found_items',
user: 'Participating Member',
},
});
});
it('cannot collect excess items', async () => {
// Make sure the quest progress isn't erased
sandbox.stub(Group.prototype, 'finishQuest').returns(Promise.resolve());
progress.collectedItems = 500;
party.quest.key = 'evilsanta2';
party.quest.active = false;
await party.startQuest(questLeader);
await party.save();
await Group.processQuestProgress(participatingMember, progress);
party = await Group.findOne({ _id: party._id });
expect(party.quest.progress.collect.tracks)
.to.eql(questScrolls.evilsanta2.collect.tracks.count);
expect(party.quest.progress.collect.branches)
.to.eql(questScrolls.evilsanta2.collect.branches.count);
});
});
@@ -2380,29 +2402,29 @@ describe('Group Model', () => {
});
});
context('isSubscribed', () => {
context('hasActiveGroupPlan', () => {
it('returns false if group does not have customer id', () => {
expect(party.isSubscribed()).to.be.undefined;
expect(party.hasActiveGroupPlan()).to.be.undefined;
});
it('returns true if group does not have plan.dateTerminated', () => {
party.purchased.plan.customerId = 'test-id';
expect(party.isSubscribed()).to.be.true;
expect(party.hasActiveGroupPlan()).to.be.true;
});
it('returns true if group if plan.dateTerminated is after today', () => {
party.purchased.plan.customerId = 'test-id';
party.purchased.plan.dateTerminated = moment().add(1, 'days').toDate();
expect(party.isSubscribed()).to.be.true;
expect(party.hasActiveGroupPlan()).to.be.true;
});
it('returns false if group if plan.dateTerminated is before today', () => {
party.purchased.plan.customerId = 'test-id';
party.purchased.plan.dateTerminated = moment().subtract(1, 'days').toDate();
expect(party.isSubscribed()).to.be.false;
expect(party.hasActiveGroupPlan()).to.be.false;
});
});
@@ -2,6 +2,7 @@ import { v4 as generateUUID } from 'uuid';
import {
each,
} from 'lodash';
import moment from 'moment';
import {
generateChallenge,
checkExistence,
@@ -12,6 +13,7 @@ import {
} from '../../../../helpers/api-integration/v3';
import { model as User } from '../../../../../website/server/models/user';
import payments from '../../../../../website/server/libs/payments/payments';
import { calculateSubscriptionTerminationDate } from '../../../../../website/server/libs/payments/util';
describe('POST /groups/:groupId/leave', () => {
const typesOfGroups = {
@@ -338,4 +340,48 @@ describe('POST /groups/:groupId/leave', () => {
});
});
});
each(typesOfGroups, (groupDetails, groupType) => {
context(`Leaving a group with extraMonths left plan when the group is a ${groupType}`, () => {
const extraMonths = 12;
let groupWithPlan;
let member;
beforeEach(async () => {
const { group, members } = await createAndPopulateGroup({
groupDetails,
members: 1,
upgradeToGroupPlan: true,
});
[member] = members;
groupWithPlan = group;
await member.update({
'purchased.plan.extraMonths': extraMonths,
});
});
it('calculates dateTerminated and sets extraMonths to zero after user leaves the group', async () => {
const userBeforeLeave = await User.findById(member._id).exec();
await member.post(`/groups/${groupWithPlan._id}/leave`);
const userAfterLeave = await User.findById(member._id).exec();
const dateTerminatedBefore = userBeforeLeave.purchased.plan.dateTerminated;
const extraMonthsBefore = userBeforeLeave.purchased.plan.extraMonths;
const dateTerminatedAfter = userAfterLeave.purchased.plan.dateTerminated;
const extraMonthsAfter = userAfterLeave.purchased.plan.extraMonths;
const expectedTerminationDate = calculateSubscriptionTerminationDate(null, {
customerId: payments.constants.GROUP_PLAN_CUSTOMER_ID,
extraMonths,
}, payments.constants);
expect(extraMonthsBefore).to.gte(12);
expect(extraMonthsAfter).to.equal(0);
expect(dateTerminatedBefore).to.be.null;
expect(dateTerminatedAfter).to.exist;
expect(moment(dateTerminatedAfter).diff(expectedTerminationDate, 'days')).to.equal(0);
});
});
});
});
@@ -112,7 +112,7 @@ describe('POST /groups/:groupId/quests/accept', () => {
await Promise.all([partyMembers[0].sync(), questingGroup.sync()]);
expect(leader.party.quest.RSVPNeeded).to.equal(false);
expect(questingGroup.quest.members[partyMembers[0]._id]);
expect(questingGroup.quest.members[partyMembers[0]._id]).to.equal(true);
});
it('does not begin the quest if pending invitations remain', async () => {
@@ -346,4 +346,23 @@ describe('DELETE /user', () => {
await expect(checkExistence('users', user._id)).to.eventually.eql(false);
});
});
context('user with Apple auth', async () => {
beforeEach(async () => {
user = await generateUser({
auth: {
apple: {
id: 'apple-id',
},
},
});
});
it('deletes a Apple user', async () => {
await user.del('/user', {
password: DELETE_CONFIRMATION,
});
await expect(checkExistence('users', user._id)).to.eventually.eql(false);
});
});
});
@@ -95,4 +95,42 @@ describe('DELETE social registration', () => {
expect(user.auth.goodl).to.be.undefined;
});
});
context('Apple', () => {
it('fails if user does not have an alternative registration method', async () => {
await user.update({
'auth.apple.id': 'some-apple-id',
'auth.local': { ok: true },
});
await expect(user.del('/user/auth/social/apple')).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('cantDetachSocial'),
});
});
it('succeeds if user has a local registration', async () => {
await user.update({
'auth.apple.id': 'some-apple-id',
});
const response = await user.del('/user/auth/social/apple');
expect(response).to.eql({});
await user.sync();
expect(user.auth.apple).to.be.undefined;
});
it('succeeds if user has a facebook registration', async () => {
await user.update({
'auth.apple.id': 'some-apple-id',
'auth.facebook.id': 'some-facebook-id',
'auth.local': { ok: true },
});
const response = await user.del('/user/auth/social/apple');
expect(response).to.eql({});
await user.sync();
expect(user.auth.goodl).to.be.undefined;
});
});
});
@@ -0,0 +1,50 @@
import {
generateUser,
requester,
getProperty,
} from '../../../../../helpers/api-integration/v3';
import * as appleAuth from '../../../../../../website/server/libs/auth/apple';
describe('GET /user/auth/apple', () => {
let api;
let user;
const appleEndpoint = '/user/auth/apple';
before(async () => {
const expectedResult = { id: 'appleId', name: 'an apple user' };
sandbox.stub(appleAuth, 'appleProfile').returns(Promise.resolve(expectedResult));
});
beforeEach(async () => {
api = requester();
user = await generateUser();
});
it('registers a new user', async () => {
const response = await api.get(appleEndpoint);
expect(response.apiToken).to.exist;
expect(response.id).to.exist;
expect(response.newUser).to.be.true;
await expect(getProperty('users', response.id, 'auth.apple.id')).to.eventually.equal('appleId');
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('an apple user');
});
it('logs an existing user in', async () => {
const registerResponse = await api.get(appleEndpoint);
const response = await api.get(appleEndpoint);
expect(response.apiToken).to.eql(registerResponse.apiToken);
expect(response.id).to.eql(registerResponse.id);
expect(response.newUser).to.be.false;
});
it('add social auth to an existing user', async () => {
const response = await user.get(appleEndpoint);
expect(response.apiToken).to.exist;
expect(response.id).to.exist;
expect(response.newUser).to.be.false;
});
});
@@ -492,6 +492,74 @@ describe('POST /user/auth/local/register', () => {
});
});
context('attach to google user', () => {
let user;
const email = 'some@email-google.net';
const username = 'some-username-google';
const password = 'some-password';
beforeEach(async () => {
user = await generateUser();
});
it('checks onlySocialAttachLocal', async () => {
await expect(user.post('/user/auth/local/register', {
email,
username,
password,
confirmPassword: password,
})).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('onlySocialAttachLocal'),
});
});
it('succeeds', async () => {
await user.update({ 'auth.google.id': 'some-google-id', 'auth.local': { ok: true } });
await user.post('/user/auth/local/register', {
username,
email,
password,
confirmPassword: password,
});
await user.sync();
expect(user.auth.local.username).to.eql(username);
expect(user.auth.local.email).to.eql(email);
});
});
context('attach to apple user', () => {
let user;
const email = 'some@email-apple.net';
const username = 'some-username-apple';
const password = 'some-password';
beforeEach(async () => {
user = await generateUser();
});
it('checks onlySocialAttachLocal', async () => {
await expect(user.post('/user/auth/local/register', {
email,
username,
password,
confirmPassword: password,
})).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('onlySocialAttachLocal'),
});
});
it('succeeds', async () => {
await user.update({ 'auth.apple.id': 'some-apple-id', 'auth.local': { ok: true } });
await user.post('/user/auth/local/register', {
username,
email,
password,
confirmPassword: password,
});
await user.sync();
expect(user.auth.local.username).to.eql(username);
expect(user.auth.local.email).to.eql(email);
});
});
context('login is already taken', () => {
let username; let email; let
api;
@@ -51,6 +51,7 @@ describe('POST /user/auth/social', () => {
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a facebook user');
await expect(getProperty('users', response.id, 'auth.local.lowerCaseUsername')).to.exist;
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(facebookId);
});
it('logs an existing user in', async () => {
@@ -106,6 +107,7 @@ describe('POST /user/auth/social', () => {
expect(response.apiToken).to.exist;
expect(response.id).to.exist;
expect(response.newUser).to.be.true;
await expect(getProperty('users', response.id, 'auth.google.id')).to.eventually.equal(googleId);
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a google user');
});
+65
View File
@@ -0,0 +1,65 @@
import {
requester,
translate,
} from '../../../helpers/api-integration/v4';
import i18n from '../../../../website/common/script/i18n';
describe('GET /faq', () => {
describe('language parameter', () => {
it('returns faq (and does not require authentication)', async () => {
const res = await requester().get('/faq');
expect(res).to.have.property('stillNeedHelp');
expect(res.stillNeedHelp.ios).to.equal(translate('iosFaqStillNeedHelp'));
expect(res).to.have.property('questions');
expect(res.questions[0].question).to.equal(translate('faqQuestion0'));
});
it('returns faq not in English', async () => {
const res = await requester().get('/faq?language=de');
expect(res).to.have.nested.property('stillNeedHelp.ios');
expect(res.stillNeedHelp.ios).to.equal(i18n.t('iosFaqStillNeedHelp', 'de'));
});
it('falls back to English if the desired language is not found', async () => {
const res = await requester().get('/faq?language=wrong');
expect(res).to.have.nested.property('stillNeedHelp.ios');
expect(res.stillNeedHelp.ios).to.equal(translate('iosFaqStillNeedHelp'));
});
});
describe('platform parameter', () => {
it('returns faq with answers for ios platform only', async () => {
const res = await requester().get('/faq?platform=ios');
expect(res).to.have.property('stillNeedHelp');
expect(res.stillNeedHelp).to.eql({ ios: translate('iosFaqStillNeedHelp') });
expect(res).to.have.property('questions');
expect(res.questions[0]).to.eql({
question: translate('faqQuestion0'),
ios: translate('iosFaqAnswer0'),
});
});
it('returns an error when invalid platform parameter is specified', async () => {
const request = requester().get('/faq?platform=wrong');
await expect(request)
.to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
message: i18n.t('invalidReqParams'),
});
});
it('falls back to "web" description if there is no description for specified platform', async () => {
const res = await requester().get('/faq?platform=android');
expect(res).to.have.property('stillNeedHelp');
expect(res.stillNeedHelp).to.eql({ web: translate('webFaqStillNeedHelp') });
expect(res).to.have.property('questions');
expect(res.questions[0]).to.eql({
question: translate('faqQuestion0'),
android: translate('androidFaqAnswer0'),
});
});
});
});
@@ -457,6 +457,74 @@ describe('POST /user/auth/local/register', () => {
});
});
context('attach to google user', () => {
let user;
const email = 'some-google@email.net';
const username = 'some-username-google';
const password = 'some-password';
beforeEach(async () => {
user = await generateUser();
});
it('checks onlySocialAttachLocal', async () => {
await expect(user.post('/user/auth/local/register', {
email,
username,
password,
confirmPassword: password,
})).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('onlySocialAttachLocal'),
});
});
it('succeeds', async () => {
await user.update({ 'auth.google.id': 'some-google-id', 'auth.local': { ok: true } });
await user.post('/user/auth/local/register', {
username,
email,
password,
confirmPassword: password,
});
await user.sync();
expect(user.auth.local.username).to.eql(username);
expect(user.auth.local.email).to.eql(email);
});
});
context('attach to apple user', () => {
let user;
const email = 'some-apple@email.net';
const username = 'some-username-apple';
const password = 'some-password';
beforeEach(async () => {
user = await generateUser();
});
it('checks onlySocialAttachLocal', async () => {
await expect(user.post('/user/auth/local/register', {
email,
username,
password,
confirmPassword: password,
})).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('onlySocialAttachLocal'),
});
});
it('succeeds', async () => {
await user.update({ 'auth.apple.id': 'some-apple-id', 'auth.local': { ok: true } });
await user.post('/user/auth/local/register', {
username,
email,
password,
confirmPassword: password,
});
await user.sync();
expect(user.auth.local.username).to.eql(username);
expect(user.auth.local.email).to.eql(email);
});
});
context('login is already taken', () => {
let username; let email; let
api;
+12
View File
@@ -89,6 +89,18 @@ describe('shared.ops.feed', () => {
}
});
it('does not allow feeding of wacky pets', done => {
user.items.pets['Wolf-Veggie'] = 5;
user.items.food.Meat = 1;
try {
feed(user, { params: { pet: 'Wolf-Veggie', food: 'Meat' } });
} catch (err) {
expect(err).to.be.an.instanceof(NotAuthorized);
expect(err.message).to.equal(i18n.t('messageCannotFeedPet'));
done();
}
});
it('does not allow feeding of mounts', done => {
user.items.pets['Wolf-Base'] = -1;
user.items.mounts['Wolf-Base'] = true;
@@ -5,6 +5,8 @@ import { v4 as generateUUID } from 'uuid';
import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes';
import { requester } from '../requester';
import * as Tasks from '../../../../website/server/models/task';
import payments from '../../../../website/server/libs/payments/payments';
import { model as User } from '../../../../website/server/models/user';
// Creates a new user and returns it
// If you need the user to have specific requirements,
@@ -83,14 +85,35 @@ export async function generateGroup (leader, details = {}, update = {}) {
return apiGroup;
}
async function _upgradeToGroupPlan (groupLeader, group) {
const groupLeaderModel = await User.findById(groupLeader._id).exec();
// Create subscription
const paymentData = {
user: groupLeaderModel,
groupId: group._id,
sub: {
key: 'basic_3mo',
},
customerId: 'customer-id',
paymentMethod: 'Payment Method',
headers: {
'x-client': 'habitica-web',
'user-agent': '',
},
};
await payments.createSubscription(paymentData);
}
// This is generate group + the ability to create
// real users to populate it. The settings object
// takes in:
// members: Number - the number of group members to create.
// Defaults to 0. Does not include group leader.
// inivtes: Number - the number of users to create and invite to the group. Defaults to 0.
// invites: Number - the number of users to create and invite to the group. Defaults to 0.
// groupDetails: Object - how to initialize the group
// leaderDetails: Object - defaults for the leader, defaults with a gem balance so the user
// addGroupPlan: boolean - will add group plan with basic subscription. Defaults to false
// can create the group
//
// Returns an object with
@@ -101,6 +124,7 @@ export async function generateGroup (leader, details = {}, update = {}) {
export async function createAndPopulateGroup (settings = {}) {
const numberOfMembers = settings.members || 0;
const numberOfInvites = settings.invites || 0;
const upgradeToGroupPlan = settings.upgradeToGroupPlan || false;
const { groupDetails } = settings;
const leaderDetails = settings.leaderDetails || { balance: 10 };
@@ -130,6 +154,10 @@ export async function createAndPopulateGroup (settings = {}) {
await Promise.all(invitees.map(invitee => invitee.sync()));
if (upgradeToGroupPlan) {
await _upgradeToGroupPlan(groupLeader, group);
}
return {
groupLeader,
group,
+2103 -1143
View File
File diff suppressed because it is too large Load Diff
+14 -15
View File
@@ -13,25 +13,25 @@
"test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js"
},
"dependencies": {
"@vue/cli-plugin-babel": "^4.2.3",
"@vue/cli-plugin-eslint": "^4.2.3",
"@vue/cli-plugin-router": "^4.2.3",
"@vue/cli-plugin-unit-mocha": "^4.2.3",
"@vue/cli-service": "^4.2.3",
"@storybook/addon-actions": "^5.3.17",
"@storybook/addon-knobs": "^5.3.17",
"@storybook/addon-links": "^5.3.17",
"@storybook/addon-notes": "^5.3.17",
"@storybook/vue": "^5.3.17",
"@vue/cli-plugin-babel": "^4.3.1",
"@vue/cli-plugin-eslint": "^4.3.1",
"@vue/cli-plugin-router": "^4.3.1",
"@vue/cli-plugin-unit-mocha": "^4.3.1",
"@vue/cli-service": "^4.3.1",
"@storybook/addon-actions": "^5.3.18",
"@storybook/addon-knobs": "^5.3.18",
"@storybook/addon-links": "^5.3.18",
"@storybook/addon-notes": "^5.3.18",
"@storybook/vue": "^5.3.18",
"@vue/test-utils": "1.0.0-beta.29",
"amplitude-js": "^5.10.0",
"amplitude-js": "^5.11.0",
"axios": "^0.19.2",
"axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.4.1",
"bootstrap-vue": "^2.9.0",
"bootstrap-vue": "^2.11.0",
"chai": "^4.1.2",
"core-js": "^3.6.4",
"core-js": "^3.6.5",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
"eslint-plugin-mocha": "^5.3.0",
@@ -40,7 +40,7 @@
"hellojs": "^1.18.4",
"inspectpack": "^4.4.0",
"intro.js": "^2.9.3",
"jquery": "^3.4.1",
"jquery": "^3.5.0",
"lodash": "^4.17.15",
"moment": "^2.24.0",
"nconf": "^0.10.0",
@@ -58,7 +58,6 @@
"vue-mugen-scroll": "^0.2.6",
"vue-router": "^3.1.6",
"vue-template-compiler": "^2.6.11",
"vue2-perfect-scrollbar": "^1.4.0",
"vuedraggable": "^2.23.1",
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec",
"webpack": "^4.42.1"
+13
View File
@@ -0,0 +1,13 @@
The files in the following subfolders:
- audio
- emails
- icons
- merch
- presskit
are not processed by Webpack so their filenames don't get hashed, but given that they almost never change, they're still cached for 1 week.
In case one of the files needs to be updated the filename should be changed if possible.
For more information see `website/server/middlewares/static.js`.
-14
View File
@@ -20,10 +20,6 @@
</svg>
<!-- eslint-enable max-len -->
</div>
<div class="col-12 text-center">
<h2>{{ $t('tipTitle', {tipNumber: currentTipNumber}) }}</h2>
<p>{{ currentTip }}</p>
</div>
</div>
</div>
<div
@@ -297,7 +293,6 @@ export default {
audioSuffix: null,
loading: true,
currentTipNumber: 0,
bannerHidden: false,
};
},
@@ -310,15 +305,6 @@ export default {
castingSpell () {
return this.$store.state.spellOptions.castingSpell;
},
currentTip () {
const numberOfTips = 35 + 1;
const min = 1;
const randomNumber = Math.random() * (numberOfTips - min) + min;
const tipNumber = Math.floor(randomNumber);
this.currentTipNumber = tipNumber; // eslint-disable-line vue/no-side-effects-in-computed-properties, max-len
return this.$t(`tip${tipNumber}`);
},
showRestingBanner () {
return !this.bannerHidden && this.user && this.user.preferences.sleep;
},
@@ -1,12 +1,12 @@
.promo_april_fools_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -433px -337px;
background-position: -445px -184px;
width: 423px;
height: 147px;
}
.promo_armoire_backgrounds_202004 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -500px;
background-position: -433px -337px;
width: 423px;
height: 147px;
}
@@ -18,13 +18,25 @@
}
.promo_mystery_202004 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -355px -648px;
background-position: 0px -796px;
width: 282px;
height: 147px;
}
.promo_pastel_skin_hair {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -355px -648px;
width: 354px;
height: 147px;
}
.customize-option.promo_pastel_skin_hair {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -380px -663px;
width: 60px;
height: 60px;
}
.promo_seasonal_shop_spring {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -638px -648px;
background-position: -875px -524px;
width: 162px;
height: 138px;
}
@@ -48,16 +60,22 @@
}
.promo_spring_potions_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -445px -184px;
background-position: 0px -500px;
width: 423px;
height: 147px;
}
.promo_take_this {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -151px;
background-position: -875px -663px;
width: 96px;
height: 69px;
}
.scene_citrusella {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -196px;
width: 152px;
height: 176px;
}
.scene_hat_guild {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px 0px;
@@ -66,7 +84,13 @@
}
.scene_meditation {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px 0px;
background-position: -875px -373px;
width: 150px;
height: 150px;
}
.scene_tasks {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px 0px;
width: 240px;
height: 195px;
}
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
@@ -12,7 +12,7 @@
}
.quest_dustbunnies {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -660px;
background-position: -440px 0px;
width: 219px;
height: 219px;
}
@@ -30,19 +30,19 @@
}
.quest_evilsanta2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -232px;
background-position: 0px -232px;
width: 219px;
height: 219px;
}
.quest_falcon {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -232px;
background-position: -220px -232px;
width: 219px;
height: 219px;
}
.quest_ferret {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px 0px;
background-position: -440px -232px;
width: 219px;
height: 219px;
}
@@ -54,13 +54,13 @@
}
.quest_ghost_stag {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -452px;
background-position: -660px 0px;
width: 219px;
height: 219px;
}
.quest_goldenknight1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -452px;
background-position: -660px -220px;
width: 219px;
height: 219px;
}
@@ -84,13 +84,13 @@
}
.quest_guineapig {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -220px;
background-position: 0px -452px;
width: 219px;
height: 219px;
}
.quest_harpy {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -440px;
background-position: -220px -452px;
width: 219px;
height: 219px;
}
@@ -102,43 +102,43 @@
}
.quest_hippo {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -672px;
background-position: -440px -452px;
width: 219px;
height: 219px;
}
.quest_horse {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -672px;
background-position: -660px -452px;
width: 219px;
height: 219px;
}
.quest_kangaroo {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -672px;
background-position: -880px 0px;
width: 219px;
height: 219px;
}
.quest_kraken {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1311px -1332px;
background-position: -660px -1332px;
width: 216px;
height: 177px;
}
.quest_lostMasterclasser1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px 0px;
background-position: -880px -220px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -220px;
background-position: -880px -440px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -440px;
background-position: 0px -672px;
width: 219px;
height: 219px;
}
@@ -150,61 +150,61 @@
}
.quest_mayhemMistiflying2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -892px;
background-position: -220px -672px;
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -892px;
background-position: -440px -672px;
width: 219px;
height: 219px;
}
.quest_monkey {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -892px;
background-position: -660px -672px;
width: 219px;
height: 219px;
}
.quest_moon1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -1082px;
background-position: -1540px -214px;
width: 216px;
height: 216px;
}
.quest_moon2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -892px;
background-position: -880px -672px;
width: 219px;
height: 219px;
}
.quest_moon3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -892px;
background-position: -1100px 0px;
width: 219px;
height: 219px;
}
.quest_moonstone1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px 0px;
background-position: -1100px -220px;
width: 219px;
height: 219px;
}
.quest_moonstone2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -220px;
background-position: -1100px -440px;
width: 219px;
height: 219px;
}
.quest_moonstone3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -440px;
background-position: -1100px -660px;
width: 219px;
height: 219px;
}
.quest_nudibranch {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -865px;
background-position: -1540px -431px;
width: 216px;
height: 216px;
}
@@ -216,7 +216,7 @@
}
.quest_owl {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1112px;
background-position: 0px -892px;
width: 219px;
height: 219px;
}
@@ -234,25 +234,25 @@
}
.quest_pterodactyl {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -1112px;
background-position: -220px -892px;
width: 219px;
height: 219px;
}
.quest_rat {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -1112px;
background-position: -440px -892px;
width: 219px;
height: 219px;
}
.quest_robot {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -1112px;
background-position: -660px -892px;
width: 219px;
height: 219px;
}
.quest_rock {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -214px;
background-position: -1540px -865px;
width: 216px;
height: 216px;
}
@@ -264,43 +264,43 @@
}
.quest_ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -1112px;
background-position: -880px -892px;
width: 219px;
height: 219px;
}
.quest_sabretooth {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -1112px;
background-position: -1100px -892px;
width: 219px;
height: 219px;
}
.quest_seaserpent {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -880px;
background-position: -1320px 0px;
width: 219px;
height: 219px;
}
.quest_sheep {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -892px;
background-position: -1320px -220px;
width: 219px;
height: 219px;
}
.quest_silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -660px;
background-position: -1320px -440px;
width: 219px;
height: 219px;
}
.quest_slime {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -672px;
background-position: -1320px -660px;
width: 219px;
height: 219px;
}
.quest_sloth {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -672px;
background-position: -1320px -880px;
width: 219px;
height: 219px;
}
@@ -312,7 +312,7 @@
}
.quest_snake {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -1332px;
background-position: -877px -1332px;
width: 216px;
height: 177px;
}
@@ -324,43 +324,43 @@
}
.quest_squirrel {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px 0px;
background-position: 0px -1112px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -872px;
background-position: -1762px -721px;
width: 150px;
height: 150px;
}
.quest_stoikalmCalamity2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -452px;
background-position: -220px -1112px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -220px;
background-position: -440px -1112px;
width: 219px;
height: 219px;
}
.quest_taskwoodsTerror1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -721px;
background-position: -1762px -872px;
width: 150px;
height: 150px;
}
.quest_taskwoodsTerror2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -431px;
background-position: -1540px -1082px;
width: 216px;
height: 216px;
}
.quest_taskwoodsTerror3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -232px;
background-position: -660px -1112px;
width: 219px;
height: 219px;
}
@@ -378,19 +378,19 @@
}
.quest_trex_undead {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -877px -1332px;
background-position: -1311px -1332px;
width: 216px;
height: 177px;
}
.quest_triceratops {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px 0px;
background-position: -880px -1112px;
width: 219px;
height: 219px;
}
.quest_turtle {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -452px;
background-position: -1100px -1112px;
width: 219px;
height: 219px;
}
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
@@ -1,84 +1,84 @@
.Mount_Head_Wolf-RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -136px 0px;
background-position: 0px 0px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -136px -408px;
background-position: -136px 0px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -408px;
background-position: 0px -136px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -136px;
background-position: -136px -136px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -136px -136px;
background-position: -272px 0px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -272px 0px;
background-position: -272px -136px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -272px -136px;
background-position: 0px -272px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -272px;
background-position: -136px -272px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -136px -272px;
background-position: -272px -272px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -272px -272px;
background-position: -408px 0px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -408px 0px;
background-position: -408px -136px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Watery {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -408px -136px;
background-position: -408px -272px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -408px -272px;
background-position: 0px -408px;
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: 0px 0px;
background-position: -136px -408px;
width: 135px;
height: 135px;
}
@@ -90,55 +90,55 @@
}
.Mount_Head_Yarn-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -544px -212px;
background-position: -378px -408px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -378px -408px;
background-position: -544px 0px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -544px 0px;
background-position: -544px -106px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -544px -106px;
background-position: -544px -212px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -212px -544px;
background-position: -544px -318px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -544px -318px;
background-position: -544px -424px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -544px -424px;
background-position: 0px -544px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: 0px -544px;
background-position: -106px -544px;
width: 105px;
height: 105px;
}
.Mount_Head_Yarn-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -106px -544px;
background-position: -212px -544px;
width: 105px;
height: 105px;
}
@@ -942,7 +942,7 @@
}
.Mount_Icon_Cactus-Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -1716px -700px;
background-position: -492px -1150px;
width: 81px;
height: 99px;
}
@@ -1878,7 +1878,7 @@
}
.Mount_Icon_FlyingPig-IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-22.png');
background-position: -492px -1150px;
background-position: -1716px -700px;
width: 81px;
height: 99px;
}
File diff suppressed because it is too large Load Diff
@@ -1,12 +1,12 @@
.Mount_Icon_Rooster-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -82px 0px;
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Mount_Icon_Rooster-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -164px -1100px;
background-position: -82px 0px;
width: 81px;
height: 99px;
}
@@ -1002,7 +1002,7 @@
}
.Mount_Icon_Triceratops-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: 0px 0px;
background-position: -164px -1100px;
width: 81px;
height: 99px;
}
@@ -1242,757 +1242,757 @@
}
.Mount_Icon_Whale-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -1096px;
background-position: -1640px -400px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -1009px;
background-position: -1640px -487px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -922px;
background-position: -1640px -574px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -835px;
background-position: -1640px -661px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -1183px;
background-position: -1640px -748px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -661px;
background-position: -1640px -835px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -574px;
background-position: -1640px -922px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -487px;
background-position: -1640px -1009px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -748px;
background-position: -1640px -1096px;
width: 78px;
height: 86px;
}
.Mount_Icon_Whale-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -400px;
background-position: -1640px -1183px;
width: 78px;
height: 86px;
}
.Mount_Icon_Wolf-Amber {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -900px;
background-position: -1230px -1200px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Aquatic {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -1000px;
background-position: -1312px 0px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Aurora {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -1100px;
background-position: -1312px -100px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -1200px;
background-position: -1312px -200px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-BirchBark {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px 0px;
background-position: -1312px -300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Bronze {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -100px;
background-position: -1312px -400px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Celestial {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -200px;
background-position: -1312px -500px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -300px;
background-position: -1312px -600px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -400px;
background-position: -1312px -700px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Cupid {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -500px;
background-position: -1312px -800px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -600px;
background-position: -1312px -900px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Ember {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -700px;
background-position: -1312px -1000px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Fairy {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -800px;
background-position: -1312px -1100px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Floral {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -900px;
background-position: -1312px -1200px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -1000px;
background-position: -1394px 0px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Ghost {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -1100px;
background-position: -1394px -100px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -1200px;
background-position: -1394px -200px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Glow {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: 0px -1300px;
background-position: -1394px -300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -82px -1300px;
background-position: -1394px -400px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -164px -1300px;
background-position: -1394px -500px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -246px -1300px;
background-position: -1394px -600px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -328px -1300px;
background-position: -1394px -700px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -410px -1300px;
background-position: -1394px -800px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -492px -1300px;
background-position: -1394px -900px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-RoseQuartz {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -574px -1300px;
background-position: -1394px -1000px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -656px -1300px;
background-position: -1394px -1100px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -738px -1300px;
background-position: -1394px -1200px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -820px -1300px;
background-position: 0px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -902px -1300px;
background-position: -82px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -984px -1300px;
background-position: -164px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1066px -1300px;
background-position: -246px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1148px -1300px;
background-position: -328px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1230px -1300px;
background-position: -410px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -1300px;
background-position: -492px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -1300px;
background-position: -574px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px 0px;
background-position: -656px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Watery {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -100px;
background-position: -738px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -200px;
background-position: -820px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Wolf-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -300px;
background-position: -902px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -400px;
background-position: -984px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -500px;
background-position: -1066px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -600px;
background-position: -1148px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -700px;
background-position: -1230px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -800px;
background-position: -1312px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -900px;
background-position: -1394px -1300px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -1000px;
background-position: -1476px 0px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -1100px;
background-position: -1476px -100px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -1200px;
background-position: -1476px -200px;
width: 81px;
height: 99px;
}
.Mount_Icon_Yarn-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -1300px;
background-position: -1476px -300px;
width: 81px;
height: 99px;
}
.Pet-Alligator-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: 0px -1400px;
background-position: -1476px -400px;
width: 81px;
height: 99px;
}
.Pet-Alligator-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -82px -1400px;
background-position: -1476px -500px;
width: 81px;
height: 99px;
}
.Pet-Alligator-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -164px -1400px;
background-position: -1476px -600px;
width: 81px;
height: 99px;
}
.Pet-Alligator-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -246px -1400px;
background-position: -1476px -700px;
width: 81px;
height: 99px;
}
.Pet-Alligator-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -328px -1400px;
background-position: -1476px -800px;
width: 81px;
height: 99px;
}
.Pet-Alligator-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -410px -1400px;
background-position: -1476px -900px;
width: 81px;
height: 99px;
}
.Pet-Alligator-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -492px -1400px;
background-position: -1476px -1000px;
width: 81px;
height: 99px;
}
.Pet-Alligator-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -574px -1400px;
background-position: -1476px -1100px;
width: 81px;
height: 99px;
}
.Pet-Alligator-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -656px -1400px;
background-position: -1476px -1200px;
width: 81px;
height: 99px;
}
.Pet-Alligator-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -738px -1400px;
background-position: -1476px -1300px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -820px -1400px;
background-position: 0px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -902px -1400px;
background-position: -82px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -984px -1400px;
background-position: -164px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1066px -1400px;
background-position: -246px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1148px -1400px;
background-position: -328px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1230px -1400px;
background-position: -410px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -1400px;
background-position: -492px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -1400px;
background-position: -574px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -1400px;
background-position: -656px -1400px;
width: 81px;
height: 99px;
}
.Pet-Armadillo-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px 0px;
background-position: -738px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -100px;
background-position: -820px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -200px;
background-position: -902px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -300px;
background-position: -984px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -400px;
background-position: -1066px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -500px;
background-position: -1148px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -600px;
background-position: -1230px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -700px;
background-position: -1312px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -800px;
background-position: -1394px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -900px;
background-position: -1476px -1400px;
width: 81px;
height: 99px;
}
.Pet-Axolotl-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -1000px;
background-position: -1558px 0px;
width: 81px;
height: 99px;
}
.Pet-Badger-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -1100px;
background-position: -1558px -100px;
width: 81px;
height: 99px;
}
.Pet-Badger-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -1200px;
background-position: -1558px -200px;
width: 81px;
height: 99px;
}
.Pet-Badger-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -1300px;
background-position: -1558px -300px;
width: 81px;
height: 99px;
}
.Pet-Badger-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -1400px;
background-position: -1558px -400px;
width: 81px;
height: 99px;
}
.Pet-Badger-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: 0px -1500px;
background-position: -1558px -500px;
width: 81px;
height: 99px;
}
.Pet-Badger-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -82px -1500px;
background-position: -1558px -600px;
width: 81px;
height: 99px;
}
.Pet-Badger-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -164px -1500px;
background-position: -1558px -700px;
width: 81px;
height: 99px;
}
.Pet-Badger-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -246px -1500px;
background-position: -1558px -800px;
width: 81px;
height: 99px;
}
.Pet-Badger-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -328px -1500px;
background-position: -1558px -900px;
width: 81px;
height: 99px;
}
.Pet-Badger-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -410px -1500px;
background-position: -1558px -1000px;
width: 81px;
height: 99px;
}
.Pet-Bear-Veteran {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -492px -1500px;
background-position: -1558px -1100px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Amber {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -574px -1500px;
background-position: -1558px -1200px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Aquatic {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -656px -1500px;
background-position: -1558px -1300px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Aurora {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -738px -1500px;
background-position: -1558px -1400px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -820px -1500px;
background-position: 0px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-BirchBark {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -902px -1500px;
background-position: -82px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Bronze {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -984px -1500px;
background-position: -164px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Celestial {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1066px -1500px;
background-position: -246px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1148px -1500px;
background-position: -328px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1230px -1500px;
background-position: -410px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Cupid {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -1500px;
background-position: -492px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1394px -1500px;
background-position: -574px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Dessert {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1476px -1500px;
background-position: -656px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Ember {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1558px -1500px;
background-position: -738px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Fairy {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px 0px;
background-position: -820px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Floral {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -100px;
background-position: -902px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1640px -200px;
background-position: -984px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Ghost {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -800px;
background-position: -1066px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -700px;
background-position: -1148px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Glow {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -600px;
background-position: -1230px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -500px;
background-position: -1312px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -400px;
background-position: -1394px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -300px;
background-position: -1476px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -200px;
background-position: -1558px -1500px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Polar {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px -100px;
background-position: -1640px 0px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1312px 0px;
background-position: -1640px -100px;
width: 81px;
height: 99px;
}
.Pet-BearCub-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-24.png');
background-position: -1230px -1200px;
background-position: -1640px -200px;
width: 81px;
height: 99px;
}
File diff suppressed because it is too large Load Diff
@@ -1,12 +1,12 @@
.Pet-Hippo-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-26.png');
background-position: -82px 0px;
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Pet-Hippo-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-26.png');
background-position: -82px -1100px;
background-position: -82px 0px;
width: 81px;
height: 99px;
}
@@ -996,7 +996,7 @@
}
.Pet-Parrot-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-26.png');
background-position: 0px 0px;
background-position: -82px -1100px;
width: 81px;
height: 99px;
}
@@ -1,12 +1,12 @@
.Pet-Spider-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px 0px;
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Pet-Squirrel-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -984px 0px;
background-position: -82px 0px;
width: 81px;
height: 99px;
}
@@ -648,7 +648,7 @@
}
.Pet-Velociraptor-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px 0px;
background-position: -984px 0px;
width: 81px;
height: 99px;
}
@@ -1062,13 +1062,13 @@
}
.Pet_HatchingPotion_Amber {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -1053px -1100px;
background-position: -984px -1100px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Aquatic {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -1200px;
background-position: -1053px -1100px;
width: 68px;
height: 68px;
}
@@ -1182,7 +1182,7 @@
}
.Pet_HatchingPotion_IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -984px -1100px;
background-position: 0px -1200px;
width: 68px;
height: 68px;
}
@@ -12,25 +12,25 @@
}
.hair_bangs_3_peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
background-position: -91px 0px;
background-position: 0px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
background-position: -116px -15px;
background-position: -25px -15px;
width: 60px;
height: 60px;
}
.hair_bangs_3_pgreen {
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
background-position: -728px -1092px;
background-position: -91px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_pgreen {
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
background-position: -753px -1107px;
background-position: -116px -15px;
width: 60px;
height: 60px;
}
@@ -1512,13 +1512,13 @@
}
.hair_base_11_ppurple2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
background-position: 0px 0px;
background-position: -728px -1092px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_11_ppurple2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-3.png');
background-position: -25px -15px;
background-position: -753px -1107px;
width: 60px;
height: 60px;
}
@@ -1,24 +1,24 @@
.hair_base_15_white {
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
background-position: -91px 0px;
background-position: 0px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_15_white {
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
background-position: -116px -0px;
background-position: -25px -0px;
width: 60px;
height: 60px;
}
.hair_base_15_winternight {
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
background-position: -728px -1092px;
background-position: -91px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_15_winternight {
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
background-position: -753px -1092px;
background-position: -116px -0px;
width: 60px;
height: 60px;
}
@@ -2448,13 +2448,13 @@
}
.hair_base_2_blue {
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
background-position: 0px 0px;
background-position: -728px -1092px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_2_blue {
background-image: url('~@/assets/images/sprites/spritesmith-main-4.png');
background-position: -25px -15px;
background-position: -753px -1107px;
width: 60px;
height: 60px;
}
@@ -12,25 +12,25 @@
}
.hair_base_5_holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
background-position: -91px 0px;
background-position: 0px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_5_holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
background-position: -116px -15px;
background-position: -25px -15px;
width: 60px;
height: 60px;
}
.hair_base_5_hollygreen {
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
background-position: -728px -1092px;
background-position: -91px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_5_hollygreen {
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
background-position: -753px -1107px;
background-position: -116px -15px;
width: 60px;
height: 60px;
}
@@ -1980,13 +1980,13 @@
}
.hair_base_9_porange {
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
background-position: 0px 0px;
background-position: -728px -1092px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_9_porange {
background-image: url('~@/assets/images/sprites/spritesmith-main-5.png');
background-position: -25px -15px;
background-position: -753px -1107px;
width: 60px;
height: 60px;
}
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.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 469 KiB

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 KiB

After

Width:  |  Height:  |  Size: 643 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 424 KiB

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 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: 138 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 142 KiB

+2 -2
View File
@@ -53,8 +53,8 @@
.close-icon {
position: absolute;
top: 24px;
right: 24px;
top: 1rem;
right: 1rem;
cursor: pointer;
& svg path {
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="170px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 170 170" version="1.1" height="170px">
<path d="m150.37 130.25c-2.45 5.66-5.35 10.87-8.71 15.66-4.58 6.53-8.33 11.05-11.22 13.56-4.48 4.12-9.28 6.23-14.42 6.35-3.69 0-8.14-1.05-13.32-3.18-5.197-2.12-9.973-3.17-14.34-3.17-4.58 0-9.492 1.05-14.746 3.17-5.262 2.13-9.501 3.24-12.742 3.35-4.929 0.21-9.842-1.96-14.746-6.52-3.13-2.73-7.045-7.41-11.735-14.04-5.032-7.08-9.169-15.29-12.41-24.65-3.471-10.11-5.211-19.9-5.211-29.378 0-10.857 2.346-20.221 7.045-28.068 3.693-6.303 8.606-11.275 14.755-14.925s12.793-5.51 19.948-5.629c3.915 0 9.049 1.211 15.429 3.591 6.362 2.388 10.447 3.599 12.238 3.599 1.339 0 5.877-1.416 13.57-4.239 7.275-2.618 13.415-3.702 18.445-3.275 13.63 1.1 23.87 6.473 30.68 16.153-12.19 7.386-18.22 17.731-18.1 31.002 0.11 10.337 3.86 18.939 11.23 25.769 3.34 3.17 7.07 5.62 11.22 7.36-0.9 2.61-1.85 5.11-2.86 7.51zm-31.26-123.01c0 8.1021-2.96 15.667-8.86 22.669-7.12 8.324-15.732 13.134-25.071 12.375-0.119-0.972-0.188-1.995-0.188-3.07 0-7.778 3.386-16.102 9.399-22.908 3.002-3.446 6.82-6.3113 11.45-8.597 4.62-2.2516 8.99-3.4968 13.1-3.71 0.12 1.0831 0.17 2.1663 0.17 3.2409z" fill="#FFF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1000"
viewBox="0 0 1000 1187.198"
version="1.1"
height="1187.198"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="Apple_1998.svg">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="705"
id="namedview6"
showgrid="false"
inkscape:zoom="0.1767767"
inkscape:cx="-1066.5045"
inkscape:cy="964.94669"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<path
d="m 979.04184,925.18785 c -17.95397,41.47737 -39.20563,79.65705 -63.82824,114.75895 -33.56298,47.8528 -61.04356,80.9761 -82.22194,99.3698 -32.83013,30.192 -68.00529,45.6544 -105.67203,46.5338 -27.04089,0 -59.6512,-7.6946 -97.61105,-23.3035 -38.08442,-15.5358 -73.08371,-23.2303 -105.08578,-23.2303 -33.56296,0 -69.55888,7.6945 -108.06101,23.2303 -38.5608,15.6089 -69.62484,23.7432 -93.37541,24.5493 -36.12049,1.5389 -72.1237,-14.3632 -108.06101,-47.7796 -22.93711,-20.0059 -51.62684,-54.3017 -85.99592,-102.8874 C 92.254176,984.54592 61.937588,924.38175 38.187028,855.7902 12.750995,781.70252 0,709.95986 0,640.50361 0,560.94181 17.191859,492.32094 51.626869,434.81688 78.689754,388.62753 114.69299,352.19192 159.75381,325.44413 c 45.06086,-26.74775 93.74914,-40.37812 146.18212,-41.25019 28.68971,0 66.3125,8.8744 113.06613,26.31542 46.62174,17.49964 76.55727,26.37404 89.68198,26.37404 9.8124,0 43.06758,-10.37669 99.4431,-31.06405 53.31237,-19.18512 98.30724,-27.12887 135.16787,-23.99975 99.8828,8.06098 174.92313,47.43518 224.82789,118.37174 -89.33023,54.12578 -133.51903,129.93556 -132.63966,227.18753 0.8061,75.75115 28.28668,138.78795 82.2952,188.8393 24.47603,23.23022 51.81008,41.18421 82.22186,53.93522 -6.59525,19.12648 -13.557,37.44688 -20.95846,55.03446 z M 749.96366,23.751237 c 0,59.37343 -21.69138,114.810233 -64.92748,166.121963 -52.17652,60.99961 -115.28658,96.24803 -183.72426,90.68597 -0.87204,-7.12298 -1.37769,-14.61967 -1.37769,-22.49743 0,-56.99843 24.81315,-117.99801 68.87738,-167.873453 21.99909,-25.25281 49.978,-46.25018 83.90738,-63.00018 C 686.57507,10.688027 718.59913,1.5631274 748.71783,5.2734376e-4 749.59727,7.9378274 749.96366,15.875627 749.96366,23.750467 Z"
id="path4"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -7,20 +7,31 @@
>
<div class="content text-center">
<span
v-once
class="close-icon svg-icon inline icon-10"
@click="close()"
v-html="icons.close"
></span>
<h2>{{ $t('congratulations') }}</h2>
<h2 v-once>
{{ $t('onboardingComplete') }}
</h2>
<img
class="onboarding-complete-banner d-block"
src="~@/assets/images/onboarding-complete-banner@2x.png"
>
<p
v-once
class="onboarding-complete-text"
v-html="$t('onboardingCompleteDesc')"
></p>
<p
v-once
class="onboarding-complete-text-small"
>
{{ $t('onboardingCompleteDescSmall') }}
</p>
<button
v-once
class="btn btn-primary"
@click="closeWithAction()"
>
@@ -37,7 +48,7 @@
}
.modal-body {
padding-top: 1em;
padding-top: 1rem;
padding-bottom: 0;
}
@@ -58,7 +69,7 @@ h2 {
.content {
padding: 0 8px;
margin-top: 18px;
margin-top: 1rem;
}
.onboarding-complete-banner {
@@ -68,13 +79,21 @@ h2 {
}
.onboarding-complete-text {
margin-bottom: 24px;
margin-bottom: 1rem;
}
.onboarding-complete-text ::v-deep .gold-amount {
color: $yellow-5;
}
.onboarding-complete-text-small {
margin-bottom: 1.5rem;
color: $gray-100;
font-style: normal;
font-size: 12px;
line-height: 1.33;
}
button {
margin-bottom: 24px;
}
+3 -1
View File
@@ -49,11 +49,13 @@
target="_blank"
>{{ $t('oldNews') }}</a>
</li>
<!-- Commenting out merch page see https://github.com/HabitRPG/habitica/issues/12039
<li>
<router-link to="/static/merch">
{{ $t('merch') }}
</router-link>
</li>
-->
<li>
<router-link to="/static/press-kit">
{{ $t('presskit') }}
@@ -214,7 +216,7 @@
</div>
<div class="row">
<div class="col-12 col-md-5">
© 2019 Habitica. All rights reserved.
© 2020 Habitica. All rights reserved.
<div
v-if="!IS_PRODUCTION && isUserLoaded"
class="debug float-left"
+50 -22
View File
@@ -1,7 +1,7 @@
<template>
<div class="form">
<div class="form-group row text-center">
<div class="col-12 col-md-6">
<div class="col-12">
<div
class="btn btn-secondary social-button"
@click="socialAuth('facebook')"
@@ -15,7 +15,9 @@
: $t('loginWithSocial', {social: 'Facebook'}) }}</span>
</div>
</div>
<div class="col-12 col-md-6">
</div>
<div class="form-group row text-center">
<div class="col-12">
<div
class="btn btn-secondary social-button"
@click="socialAuth('google')"
@@ -30,6 +32,22 @@
</div>
</div>
</div>
<div class="form-group row text-center">
<div class="col-12">
<div
class="btn btn-secondary social-button"
@click="socialAuth('apple')"
>
<div
class="svg-icon social-icon apple-icon"
v-html="icons.appleIcon"
></div>
<span>{{ registering
? $t('signUpWithSocial', {social: 'Apple'})
: $t('loginWithSocial', {social: 'Apple'}) }}</span>
</div>
</div>
</div>
<div
v-if="registering"
class="form-group"
@@ -199,7 +217,11 @@
height: 18px;
display: inline-block;
vertical-align: top;
margin-top: .2em;
margin-top: .1em;
}
.apple-icon {
margin-top: -1px;
}
small.form-text {
@@ -219,10 +241,11 @@
import hello from 'hellojs';
import debounce from 'lodash/debounce';
import isEmail from 'validator/lib/isEmail';
import { setUpAxios } from '@/libs/auth';
import { setUpAxios, buildAppleAuthUrl } from '@/libs/auth';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import facebookSquareIcon from '@/assets/svg/facebook-square.svg';
import googleIcon from '@/assets/svg/google.svg';
import appleIcon from '@/assets/svg/apple_black.svg';
export default {
name: 'AuthForm',
@@ -239,6 +262,7 @@ export default {
data.icons = Object.freeze({
facebookIcon: facebookSquareIcon,
googleIcon,
appleIcon,
});
return data;
@@ -307,27 +331,31 @@ export default {
}, 500),
// @TODO: Abstract hello in to action or lib
async socialAuth (network) {
try {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
if (network === 'apple') {
window.location.href = buildAppleAuthUrl();
} else {
try {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
try {
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
try {
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
auth,
});
await this.$store.dispatch('auth:socialAuth', {
auth,
});
await this.finishAuth();
} catch (err) {
console.error(err); // eslint-disable-line no-console
// logout the user
await hello(network).logout();
this.socialAuth(network); // login again
await this.finishAuth();
} catch (err) {
console.error(err); // eslint-disable-line no-console
// logout the user
await hello(network).logout();
this.socialAuth(network); // login again
}
}
},
async register () {
@@ -36,7 +36,7 @@
</div>
</div>
<div class="form-group row text-center">
<div class="col-12 col-md-6">
<div class="col-12 col-md-12">
<div
class="btn btn-secondary social-button"
@click="socialAuth('facebook')"
@@ -54,7 +54,9 @@
</div>
</div>
</div>
<div class="col-12 col-md-6">
</div>
<div class="form-group row text-center">
<div class="col-12 col-md-12">
<div
class="btn btn-secondary social-button"
@click="socialAuth('google')"
@@ -73,6 +75,29 @@
</div>
</div>
</div>
<div class="form-group row text-center">
<div class="col-12 col-md-12">
<div
class="btn btn-secondary social-button"
@click="socialAuth('apple')"
>
<div
class="svg-icon social-icon"
v-html="icons.appleIcon"
></div>
<div
class="text"
>
{{ registering
? $t('signUpWithSocial', {social: 'Apple'})
: $t('loginWithSocial', {social: 'Apple'}) }}
</div>
</div>
</div>
</div>
<div class="strike">
<span>{{ $t('or') }}</span>
</div>
<div
v-if="registering"
class="form-group"
@@ -496,12 +521,13 @@
}
.social-icon {
margin-left: 1em;
margin-right: 1em;
width: 18px;
height: 18px;
display: inline-block;
vertical-align: top;
margin-top: .2em;
margin-top: .1em;
}
}
@@ -581,6 +607,42 @@
.exclamation {
width: 2px;
}
.strike {
display: block;
text-align: center;
overflow: hidden;
white-space: nowrap;
margin-top: 1.5em;
margin-bottom: 1.5em;
}
.strike > span {
position: relative;
display: inline-block;
line-height: 1.14;
color: #fff;
}
.strike > span:before,
.strike > span:after {
content: "";
position: absolute;
top: 50%;
width: 9999px;
height: 1px;
background: #fff;
}
.strike > span:before {
right: 100%;
margin-right: 15px;
}
.strike > span:after {
left: 100%;
margin-left: 15px;
}
</style>
<script>
@@ -589,6 +651,7 @@ import hello from 'hellojs';
import moment from 'moment';
import debounce from 'lodash/debounce';
import isEmail from 'validator/lib/isEmail';
import { buildAppleAuthUrl } from '../../libs/auth';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import exclamation from '@/assets/svg/exclamation.svg';
@@ -596,6 +659,7 @@ import gryphon from '@/assets/svg/gryphon.svg';
import habiticaIcon from '@/assets/svg/habitica-logo.svg';
import facebookSquareIcon from '@/assets/svg/facebook-square.svg';
import googleIcon from '@/assets/svg/google.svg';
import appleIcon from '@/assets/svg/apple_black.svg';
export default {
data () {
@@ -618,6 +682,7 @@ export default {
habiticaIcon,
facebookIcon: facebookSquareIcon,
googleIcon,
appleIcon,
});
return data;
@@ -799,35 +864,39 @@ export default {
},
// @TODO: Abstract hello in to action or lib
async socialAuth (network) {
try {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
// explicitly pass the redirect url or it might redirect to /home
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
auth,
});
let redirectTo;
if (this.$route.query.redirectTo) {
redirectTo = this.$route.query.redirectTo;
if (network === 'apple') {
window.location.href = buildAppleAuthUrl();
} else {
redirectTo = '/';
}
try {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
// @TODO do not reload entire page
// problem is that app.vue created hook should be called again
// after user is logged in / just signed up
// ALSO it's the only way to make sure language data
// is reloaded and correct for the logged in user
window.location.href = redirectTo;
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
// explicitly pass the redirect url or it might redirect to /home
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
auth,
});
let redirectTo;
if (this.$route.query.redirectTo) {
redirectTo = this.$route.query.redirectTo;
} else {
redirectTo = '/';
}
// @TODO do not reload entire page
// problem is that app.vue created hook should be called again
// after user is logged in / just signed up
// ALSO it's the only way to make sure language data
// is reloaded and correct for the logged in user
window.location.href = redirectTo;
}
},
handleSubmit () {
if (this.registering) {
@@ -18,7 +18,7 @@
</div>
<div class="form-group">
<label>
<strong v-once>{{ $t('privacySettings') }} *</strong>
<strong v-once>{{ $t('privacySettings') }}</strong>
</label>
<br>
<div class="custom-control custom-checkbox">
@@ -115,7 +115,8 @@ label.custom-control-label(v-once) {{ $t('allowGuildInvitationsFromNonMembers')
</div>
<div class="form-group">
<label>
<strong v-once>{{ $t('groupDescription') }} *</strong>
<strong v-if="isParty">{{ $t('groupDescription') }}</strong>
<strong v-else>{{ $t('groupDescription') }} *</strong>
</label>
<a
v-markdown="$t('markdownFormattingHelp')"
@@ -254,7 +255,7 @@ label.custom-control-label(v-once) {{ $t('allowGuildInvitationsFromNonMembers')
<button
v-if="workingGroup.id"
class="btn btn-primary btn-md"
:disabled="!workingGroup.name || !workingGroup.description"
:disabled="!workingGroup.name || (!isParty && !workingGroup.description)"
>
{{ isParty ? $t('updateParty') : $t('updateGuild') }}
</button>
@@ -540,7 +541,7 @@ export default {
if (!this.workingGroup.name) errors.push(this.$t('nameRequired'));
if (!this.workingGroup.summary) errors.push(this.$t('summaryRequired'));
if (this.workingGroup.summary.length > MAX_SUMMARY_SIZE_FOR_GUILDS) errors.push(this.$t('summaryTooLong'));
if (!this.workingGroup.description) errors.push(this.$t('descriptionRequired'));
if (!this.isParty && !this.workingGroup.description) errors.push(this.$t('descriptionRequired'));
if (!this.isParty && (!this.workingGroup.categories || this.workingGroup.categories.length === 0)) errors.push(this.$t('categoiresRequired'));
if (errors.length > 0) {

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