Compare commits

..

91 Commits

Author SHA1 Message Date
Sabe Jones 5cdcbc5310 4.140.14 2020-05-04 14:51:14 -05:00
Sabe Jones 84a52002c8 chore(sprites): compile 2020-05-04 14:50:44 -05:00
Sabe Jones 671c90a593 chore(news): Bailey 2020-05-04 14:50:36 -05:00
Sabe Jones 5d202c7617 fix(script): run main and large only once each 2020-04-30 13:35:42 -05:00
Sabe Jones 5ee33f219a 4.140.13 2020-04-30 13:13:30 -05:00
Sabe Jones 4e93874483 chore(news): Last Chance Bailey 2020-04-30 13:13:18 -05:00
Sabe Jones 8bf44ce47a Merge branch 'develop' into release 2020-04-30 12:40:02 -05:00
Sabe Jones 458bde1d13 Squashed commit of the following:
commit 35fae86bf8498a21419a32f7cdfca7f521b85494
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Apr 30 11:36:24 2020 -0500

    fix(items): bouncy numbers

commit 3d32d8962060fc2561687bca5a4037c47e12ca04
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Apr 30 09:36:52 2020 -0500

    fix(badges): standardize box-shadow

commit 5f89f1a8db00ab7d1ea29b99c90c47c358ee9268
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Wed Apr 29 15:51:56 2020 -0500

    fix(badges): standardize hover, box-shadow; fix equipment pills

commit 4eda06072a82f7a41de2fde6c9e1023e0e519b3c
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Tue Apr 28 13:24:04 2020 -0500

    fix(badges): pill vs round

commit 7181af5cb8d552e82eb4f12bf98a31723669f16b
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Mon Apr 27 15:54:30 2020 -0500

    fix(items): SVG nonsense

commit 95cfe28db0ec0a452ae6437b3a89c07b055a4092
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Fri Apr 24 12:35:00 2020 -0500

    fix(items): don't apply "empty" to equipment

commit 5932b9e9fafc2afa914a36a91fcf4d03132f18a4
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Fri Apr 24 11:50:46 2020 -0500

    refactor(pins): move pin badge to component and implement across site

commit 0533f6f79a8c51b506c2c1870bad529fccff9ae7
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Fri Apr 24 11:50:23 2020 -0500

    fix(mounts): misaligned tigers

commit a74e64afa3e0ff7a032da3406f7787b4782cc7bf
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Fri Apr 24 06:17:53 2020 -0500

    fix(svg): remove mask attributes

commit ae0f874fb6b708b4420d8b3ac18aa3b92dc2554c
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Apr 23 18:11:13 2020 -0500

    refactor(icons): standard freeze structure

commit 03c836313f91f761a1ae46d89b39625bd562d239
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Apr 23 16:31:33 2020 -0500

    WIP(styles): pin badge story

commit 661cf2a885a77fbc9edd8e84802354c282e86476
Merge: 34ec0b6c6a c4343379a1
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Apr 23 14:48:22 2020 -0500

    Merge branch 'develop' into sabrecat/quests-touchup

commit 34ec0b6c6ae3991665699aafc80d49d550a1661b
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Mon Apr 20 16:12:11 2020 -0500

    fix(items): style bodges

commit 3bbe1e98e14e94d4e3de8bdcc192478fe5d7cd0d
Merge: 095674ac0f 13123c0bae
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Mon Apr 20 15:51:31 2020 -0500

    Merge branch 'develop' into sabrecat/quests-touchup

commit 095674ac0fd462a8558d9de5469b7216be579411
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Tue Apr 7 12:27:03 2020 -0500

    fix(markets): styling

commit 8ffb8080a7b07ab0e5e19215bc8a3ce0b77cd54e
Merge: 5d4b20cd4f 9ac7840940
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Tue Apr 7 09:49:16 2020 -0500

    Merge branch 'develop' into sabrecat/quests-touchup

commit 5d4b20cd4f58c514ff788d5f64eb6398792c9583
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Mar 26 15:01:05 2020 -0500

    WIP(shops): item updates start
2020-04-30 12:38:59 -05:00
Matteo Pagliazzi 3101abbb08 remove profiling code 2020-04-30 14:05:46 +02:00
Matteo Pagliazzi 537313a21e 4.140.12 2020-04-29 12:44:56 +02:00
Matteo Pagliazzi 453383af9f feat(debug): improve stack traces 2020-04-29 12:44:50 +02:00
Matteo Pagliazzi a19db5798d 4.140.11 2020-04-29 12:32:04 +02:00
Matteo Pagliazzi ea1569e23e feat(server); allow debugging 2020-04-29 12:30:48 +02:00
Sabe Jones 58aa1ac2f3 chore(sprites): compile 2020-04-28 14:26:56 -05:00
Sabe Jones a979fc3843 feat(content): mystery items 2020-05 2020-04-28 14:26:47 -05:00
Matteo Pagliazzi 9f91775e78 fix(unit tests): re add code removed by mistake in stringUtils tests 2020-04-28 17:00:57 +02:00
Matteo Pagliazzi 61ca931e66 fix(string utils): do not escape possible regular expressions 2020-04-28 16:47:52 +02:00
Matteo Pagliazzi 2888f843e3 fix(push notifications): remove tokens after a MismatchSenderId error 2020-04-28 16:16:10 +02:00
Matteo Pagliazzi b947c714f0 fix(regexp): escape inputs 2020-04-28 16:00:17 +02:00
Matteo Pagliazzi 783b8995b8 Merge pull request #12115 from cvuorinen/12114-group-send-invites-button
Fix group Send Invites button
2020-04-28 15:44:37 +02:00
Carl Vuorinen 8db2fb8015 Nicer input event handler 2020-04-28 16:07:59 +03:00
Carl Vuorinen 1bcf2dfe80 Use native filter & forEach functions instead of lodash 2020-04-28 15:59:31 +03:00
Matteo Pagliazzi 805641b6cf Merge pull request #12145 from sandip2224/patch-2
Update LICENSE
2020-04-28 13:35:08 +02:00
Matteo Pagliazzi 5b0584fc5e Merge pull request #12125 from cvuorinen/11181-fix-tasks-draggable-on-mobile
Fix tasks draggable on mobile
2020-04-28 13:02:49 +02:00
Sandipan 99429d9d48 Update LICENSE
Fixed grammatical error
2020-04-28 09:17:46 +05:30
Bart Enkelaar ec5de91123 Issue 12138 - Fix chat support for regex chars in code blocks 2020-04-27 20:24:59 +02:00
Matteo Pagliazzi 6ffc28f04e Merge pull request #12140 from benkelaar/regex-escape
Issue 12138 - Fix chat support for regex chars in code blocks
2020-04-27 20:24:27 +02:00
negue b1a348aee3 fix reload conversations on header-refresh 2020-04-27 17:18:39 +02:00
Bart Enkelaar 66ed0a350b Issue 12138 - Fix chat support for regex chars in code blocks 2020-04-27 13:56:27 +02:00
Matteo Pagliazzi 6b2e9f16e2 build(deps): bump habitica-markdown in /website/client (#12130)
Bumps [habitica-markdown](https://github.com/HabitRPG/habitica-markdown) from 1.3.2 to 1.4.0.
- [Release notes](https://github.com/HabitRPG/habitica-markdown/releases)
- [Commits](https://github.com/HabitRPG/habitica-markdown/compare/v1.3.2...v1.4.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-27 11:25:02 +02:00
dependabot-preview[bot] 7f6a2a0700 build(deps): bump habitica-markdown from 1.3.2 to 1.4.0 (#12131)
Bumps [habitica-markdown](https://github.com/HabitRPG/habitica-markdown) from 1.3.2 to 1.4.0.
- [Release notes](https://github.com/HabitRPG/habitica-markdown/releases)
- [Commits](https://github.com/HabitRPG/habitica-markdown/compare/v1.3.2...v1.4.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-27 11:24:54 +02:00
dependabot-preview[bot] 05008b20d3 build(deps): bump mongoose from 5.9.9 to 5.9.10 (#12137)
Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.9.9 to 5.9.10.
- [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.9...5.9.10)

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-27 11:24:46 +02:00
dependabot-preview[bot] 6cae168adb build(deps): bump bootstrap-vue from 2.11.0 to 2.12.0 in /website/client (#12128)
Bumps [bootstrap-vue](https://github.com/bootstrap-vue/bootstrap-vue) from 2.11.0 to 2.12.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.11.0...v2.12.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-27 11:23:00 +02:00
dependabot-preview[bot] 72a9506b9f build(deps): bump sass from 1.26.3 to 1.26.5 in /website/client (#12129)
Bumps [sass](https://github.com/sass/dart-sass) from 1.26.3 to 1.26.5.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.26.3...1.26.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-27 11:22:47 +02:00
dependabot-preview[bot] af96cd0488 build(deps): bump webpack from 4.42.1 to 4.43.0 in /website/client (#12132)
Bumps [webpack](https://github.com/webpack/webpack) from 4.42.1 to 4.43.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.42.1...v4.43.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-27 11:22:12 +02:00
dependabot-preview[bot] 60204bef06 build(deps): bump csv-stringify from 5.3.6 to 5.4.3 (#12135)
Bumps [csv-stringify](https://github.com/adaltas/node-csv-stringify) from 5.3.6 to 5.4.3.
- [Release notes](https://github.com/adaltas/node-csv-stringify/releases)
- [Changelog](https://github.com/adaltas/node-csv-stringify/blob/master/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv-stringify/compare/v5.3.6...v5.4.3)

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-27 11:21:58 +02:00
dependabot-preview[bot] 4c21d9e560 build(deps): bump habitica-markdown in /website/client
Bumps [habitica-markdown](https://github.com/HabitRPG/habitica-markdown) from 1.3.2 to 1.4.0.
- [Release notes](https://github.com/HabitRPG/habitica-markdown/releases)
- [Commits](https://github.com/HabitRPG/habitica-markdown/compare/v1.3.2...v1.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-27 05:37:14 +00:00
Carl Vuorinen fa38b22003 Add 100ms delay to draggable on touch devices
Makes tapping the +/- and checkbox possible and also fixes scrolling on mobile.
2020-04-26 18:03:23 +03:00
Matteo Pagliazzi be86812900 4.140.10 2020-04-24 21:00:08 +02:00
Matteo Pagliazzi d03e5e93b0 Merge branch 'release' into develop 2020-04-24 19:02:55 +02:00
Matteo Pagliazzi c879560445 add ability to log amplitude events (#12120) 2020-04-24 19:02:27 +02:00
Bart Enkelaar dc9800d88a Don't bill (subtract gems) multiple times for multiple unlock item set calls (#12116)
* Issue 11050 - Small tuneups to unlock.js

- Use includes i.o. indexOf
- Extract small function for object setting duplication
- Use every instead of custom counter

* Issue 11050 - Properly store purchased items when purchasing them

* Issue 11050 - Couple more tuneups in unlock.js and implemented partial failure scenario

* Issue 11050 - Fix last lint issue

* Issue 11050 - Check path for gear i.o. failing to write it to purchased

* Issue 11050 - Guarantee variation coverage in tests

* Issue 11050 - Use startsWith instead of includes for background check

* Issue 11050 - Don't unlock lost items
2020-04-24 16:16:34 +02:00
Matteo Pagliazzi 39fcb3e876 Merge branch 'release' into develop 2020-04-24 12:06:31 +02:00
Matteo Pagliazzi 188023b197 fix #12118: pass mandatory second parameter to markdown-it parse method 2020-04-24 12:06:05 +02:00
Matteo Pagliazzi e47b0982c8 fix(i18n): remove loadingscreentips.json from non english folders 2020-04-23 23:25:25 +02:00
Melior 92f217775b Merge branch 'origin/develop' into Weblate. 2020-04-23 21:02:15 +02:00
Melior daf2c354d6 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (298 of 298 strings)

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

Translated using Weblate (Dutch)

Currently translated at 89.9% (1881 of 2091 strings)

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

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 (Japanese)

Currently translated at 95.1% (236 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% (694 of 694 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (694 of 694 strings)

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

Translated using Weblate (Japanese)

Currently translated at 92.7% (230 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% (694 of 694 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (8 of 8 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (172 of 172 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (492 of 492 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (2091 of 2091 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (298 of 298 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/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/

Translated using Weblate (Japanese)

Currently translated at 100.0% (143 of 143 strings)

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

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 (Japanese)

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/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 (German)

Currently translated at 100.0% (2091 of 2091 strings)

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

Translated using Weblate (Dutch)

Currently translated at 96.3% (669 of 694 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (694 of 694 strings)

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

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 (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 (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 (English (Pirate))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/en@pirate/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (358 of 358 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/en@pirate/

Translated using Weblate (English (Pirate))

Currently translated at 86.2% (69 of 80 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/en@pirate/

Translated using Weblate (Dutch)

Currently translated at 96.2% (668 of 694 strings)

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

Translated using Weblate (Dutch)

Currently translated at 100.0% (80 of 80 strings)

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

Translated using Weblate (Japanese)

Currently translated at 90.7% (127 of 140 strings)

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

Translated using Weblate (Swedish)

Currently translated at 93.0% (133 of 143 strings)

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

Translated using Weblate (Swedish)

Currently translated at 75.0% (60 of 80 strings)

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

Translated using Weblate (Russian)

Currently translated at 88.7% (71 of 80 strings)

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

Translated using Weblate (Dutch)

Currently translated at 98.7% (79 of 80 strings)

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

Translated using Weblate (Japanese)

Currently translated at 100.0% (172 of 172 strings)

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

Translated using Weblate (Russian)

Currently translated at 97.2% (175 of 180 strings)

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

Translated using Weblate (Russian)

Currently translated at 99.7% (357 of 358 strings)

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

Translated using Weblate (Russian)

Currently translated at 88.7% (71 of 80 strings)

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

Translated using Weblate (German)

Currently translated at 100.0% (80 of 80 strings)

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

Translated using Weblate (Dutch)

Currently translated at 96.2% (77 of 80 strings)

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

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (80 of 80 strings)

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

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (80 of 80 strings)

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

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (80 of 80 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/en_GB/
2020-04-23 21:02:04 +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
Carl Vuorinen 2ba6e972c3 Clear invite errors once user starts typing
Since the error condition is not valid anymore and needs to be chacked again when they stop typing.
2020-04-22 08:55:26 +03:00
Carl Vuorinen 6bacb89271 Better handling of group Send Invites button
Run validation check from @input event rather than @change so that it is executed after user stops typing instead of on blur.
Fix cannotSubmit (bound to button :disabled) so that it correctly checks that at least one invite is filled and all filled invites are valid.
2020-04-22 08:53:55 +03: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 193e7062c3 Merge branch 'release' into develop 2020-04-17 15:00:58 +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
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
316 changed files with 11597 additions and 14142 deletions
+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
+1 -1
View File
@@ -1,6 +1,6 @@
* Code is GPL v3 licensed:
This Source Code is subject to the terms of the GNU General Public License, v. 3.0.
If a copy of the GPL was not distributed with this file, You can obtain one at http://www.gnu.org/licenses/gpl-3.0.txt
If a copy of the GPL was not distributed with this file, you can obtain one at http://www.gnu.org/licenses/gpl-3.0.txt
* Assets and content designed for Mozilla BrowserQuest are licensed under CC-BY-SA 3.0:
http://creativecommons.org/licenses/by-sa/3.0/
+2 -1
View File
@@ -79,5 +79,6 @@
"APPLE_TEAM_ID": "",
"APPLE_AUTH_CLIENT_ID": "",
"APPLE_AUTH_KEY_ID": "",
"BLOCKED_IPS": ""
"BLOCKED_IPS": "",
"LOG_AMPLITUDE_EVENTS": "false"
}
+1 -1
View File
@@ -161,4 +161,4 @@ gulp.task('sprites:checkCompiledDimensions', gulp.series('sprites:main', 'sprite
done();
}));
gulp.task('sprites:compile', gulp.series('sprites:clean', 'sprites:main', 'sprites:largeSprites', 'sprites:checkCompiledDimensions', done => done()));
gulp.task('sprites:compile', gulp.series('sprites:clean', 'sprites:checkCompiledDimensions', done => done()));
+79 -180
View File
@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.140.5",
"version": "4.140.14",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -1574,9 +1574,9 @@
"integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
},
"@types/express": {
"version": "4.17.4",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.4.tgz",
"integrity": "sha512-DO1L53rGqIDUEvOjJKmbMEQ5Z+BM2cIEPy/eV3En+s166Gz+FeuzRerxcab757u/U4v4XF4RYrZPmqKa+aY/2w==",
"version": "4.17.6",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz",
"integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==",
"requires": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "*",
@@ -1594,9 +1594,9 @@
}
},
"@types/express-serve-static-core": {
"version": "4.17.3",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.3.tgz",
"integrity": "sha512-sHEsvEzjqN+zLbqP+8OXTipc10yH1QLR+hnr5uw29gi9AhCAAAdri8ClNV7iMdrJrIzXIQtlkPvq8tJGhj3QJQ==",
"version": "4.17.5",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz",
"integrity": "sha512-578YH5Lt88AKoADy0b2jQGwJtrBxezXtVe/MBqWXKZpqx91SnC0pVkVCcxcytz3lWW+cHBYDi3Ysh0WXc+rAYw==",
"requires": {
"@types/node": "*",
"@types/range-parser": "*"
@@ -3218,9 +3218,9 @@
}
},
"bson": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz",
"integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg=="
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q=="
},
"buffer-alloc": {
"version": "1.2.0",
@@ -4139,9 +4139,9 @@
}
},
"csv-stringify": {
"version": "5.3.6",
"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.3.6.tgz",
"integrity": "sha512-kPcRbMvo5NLLD71TAqW5K+g9kbM2HpIZJLAzm73Du8U+5TXmDp9YtXKCBLyxEh0q3Jbg8QhNFBz3b5VJzjZ/jw=="
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.4.3.tgz",
"integrity": "sha512-WJLgRJQcVjPK45jXS1xfnkwVbw9bOjg2F2BQRa9OkG7Di2W/geclPZNlcQTwxbzn1nEDI2ane2AubTdTd6gCvw=="
},
"currently-unhandled": {
"version": "0.4.1",
@@ -7359,14 +7359,33 @@
}
},
"habitica-markdown": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.3.2.tgz",
"integrity": "sha512-IyiS583DfqE+KvW4NQAB4K2HjJZ1oF50L0EDz7KaixyK7C41s47wsbN81QtNMB8LnRqbMHFDesD2xEzdicjFXw==",
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.4.0.tgz",
"integrity": "sha512-hklG3eBILNbx/VxGeRxuk+/RiWWllcd5QLNv7Kvm2wGBRTeK9c3my2eusGuHXkwStEFGxjJD5e0iMO47cGPxYw==",
"requires": {
"habitica-markdown-emoji": "1.2.4",
"markdown-it": "8.4.2",
"markdown-it-link-attributes": "1.0.0",
"markdown-it": "10.0.0",
"markdown-it-link-attributes": "3.0.0",
"markdown-it-linkify-images": "^1.1.1"
},
"dependencies": {
"entities": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
"integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw=="
},
"markdown-it": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
"integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==",
"requires": {
"argparse": "^1.0.7",
"entities": "~2.0.0",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
}
}
}
},
"habitica-markdown-emoji": {
@@ -8813,122 +8832,17 @@
}
},
"jwks-rsa": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.7.0.tgz",
"integrity": "sha512-tq7DVJt9J6wTvl9+AQfwZIiPSuY2Vf0F+MovfRTFuBqLB1xgDVhegD33ChEAQ6yBv9zFvUIyj4aiwrSA5VehUw==",
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.8.0.tgz",
"integrity": "sha512-+HYROHD5fsYQCNrJ37RSr2NjbN2/V9YT+yVF3oJxLmPIZWrmp1SOl1hMw2RcuNh+LGA2bGZIhRKGiMjhQa/b7Q==",
"requires": {
"@types/express-jwt": "0.0.42",
"axios": "^0.19.2",
"debug": "^4.1.0",
"jsonwebtoken": "^8.5.1",
"limiter": "^1.1.4",
"lru-memoizer": "^2.0.1",
"ms": "^2.1.2",
"request": "^2.88.0"
},
"dependencies": {
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"har-validator": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
"requires": {
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
}
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "^5.0.1"
}
}
"ms": "^2.1.2"
}
},
"jws": {
@@ -9350,9 +9264,9 @@
"integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw="
},
"markdown-it-link-attributes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-1.0.0.tgz",
"integrity": "sha1-jaHKFynw+hbGVhWwsQdbecg3Gi4="
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-3.0.0.tgz",
"integrity": "sha512-B34ySxVeo6MuEGSPCWyIYryuXINOvngNZL87Mp7YYfKIf6DcD837+lXA8mo6EBbauKsnGz22ZH0zsbOiQRWTNg=="
},
"markdown-it-linkify-images": {
"version": "1.1.1",
@@ -9757,33 +9671,16 @@
}
},
"mongodb": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.1.tgz",
"integrity": "sha512-juqt5/Z42J4DcE7tG7UdVaTKmUC6zinF4yioPfpeOSNBieWSK6qCY+0tfGQcHLKrauWPDdMZVROHJOa8q2pWsA==",
"dev": true,
"version": "3.5.6",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.6.tgz",
"integrity": "sha512-sh3q3GLDLT4QmoDLamxtAECwC3RGjq+oNuK1ENV8+tnipIavss6sMYt77hpygqlMOCt0Sla5cl7H4SKCVBCGEg==",
"requires": {
"bson": "^1.1.1",
"bl": "^2.2.0",
"bson": "^1.1.4",
"denque": "^1.4.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2",
"saslprep": "^1.0.0"
}
},
"mongoose": {
"version": "5.9.7",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.7.tgz",
"integrity": "sha512-WJOBh9WMvivqBK8my9HFtSzSySKdUxJPNGAwswEakAasWUcPXJl3yHMtZ4ngGnKbwTT9KnAr75xamlt/PouR9w==",
"requires": {
"bson": "~1.1.1",
"kareem": "2.3.1",
"mongodb": "3.5.5",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.6.0",
"mquery": "3.2.2",
"ms": "2.1.2",
"regexp-clone": "1.0.0",
"safe-buffer": "5.1.2",
"sift": "7.0.1",
"sliced": "1.0.1"
},
"dependencies": {
"bl": {
@@ -9795,30 +9692,40 @@
"safe-buffer": "^5.1.1"
}
},
"mongodb": {
"version": "3.5.5",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.5.tgz",
"integrity": "sha512-GCjDxR3UOltDq00Zcpzql6dQo1sVry60OXJY3TDmFc2SWFY6c8Gn1Ardidc5jDirvJrx2GC3knGOImKphbSL3A==",
"requires": {
"bl": "^2.2.0",
"bson": "^1.1.1",
"denque": "^1.4.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2",
"saslprep": "^1.0.0"
}
"bson": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q=="
}
}
},
"mongoose": {
"version": "5.9.10",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.10.tgz",
"integrity": "sha512-w1HNukfJzzDLfcI1f79h2Wj4ogVbf+X8hRkyFgqlcjK7OnDlAgahjDMIsT+mCS9jKojrMhjSsZIs9FiRPkLqMg==",
"requires": {
"bson": "^1.1.4",
"kareem": "2.3.1",
"mongodb": "3.5.6",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.7.0",
"mquery": "3.2.2",
"ms": "2.1.2",
"regexp-clone": "1.0.0",
"safe-buffer": "5.1.2",
"sift": "7.0.1",
"sliced": "1.0.1"
}
},
"mongoose-legacy-pluralize": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
"integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
},
"monk": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/monk/-/monk-7.1.2.tgz",
"integrity": "sha512-wyO1wW2lVlVChJXtNIyJ/ZSlBg/wQ/XTsWzfhuV19pl47/44nxR1KhXKxTnSB1hx08xuTMF3QodvaFBuRWPUjQ==",
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/monk/-/monk-7.2.0.tgz",
"integrity": "sha512-PdCTlPhmUH5ULg80CS0Dgn9LQ7omldNQg+kVn7wtQF1cA/me/Kd5YmiRDxUeTUukpNFkrM3qEYP5oC5AqVjSgw==",
"dev": true,
"requires": {
"debug": "*",
@@ -9901,9 +9808,9 @@
}
},
"mpath": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
"integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz",
"integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg=="
},
"mquery": {
"version": "3.2.2",
@@ -11014,14 +10921,6 @@
"passport-oauth2": "1.x.x"
}
},
"passport-google-oauth2": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/passport-google-oauth2/-/passport-google-oauth2-0.2.0.tgz",
"integrity": "sha512-62EdPtbfVdc55nIXi0p1WOa/fFMM8v/M8uQGnbcXA4OexZWCnfsEi3wo2buag+Is5oqpuHzOtI64JpHk0Xi5RQ==",
"requires": {
"passport-oauth2": "^1.1.2"
}
},
"passport-google-oauth20": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-1.0.0.tgz",
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.140.5",
"version": "4.140.14",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.9.0",
@@ -20,7 +20,7 @@
"compression": "^1.7.4",
"cookie-session": "^1.4.0",
"coupon-code": "^0.4.5",
"csv-stringify": "^5.3.6",
"csv-stringify": "^5.4.3",
"cwait": "^1.1.1",
"domain-middleware": "~0.1.0",
"eslint": "^6.8.0",
@@ -36,26 +36,25 @@
"gulp-imagemin": "^6.2.0",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.9.0",
"habitica-markdown": "^1.3.2",
"habitica-markdown": "^1.4.0",
"helmet": "^3.22.0",
"image-size": "^0.8.3",
"in-app-purchase": "^1.11.3",
"js2xmlparser": "^4.0.1",
"jsonwebtoken": "^8.5.1",
"jwks-rsa": "^1.7.0",
"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.7",
"mongoose": "^5.9.10",
"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",
@@ -101,6 +100,7 @@
"client:build": "cd website/client && npm run build",
"client:unit": "cd website/client && npm run test:unit",
"start": "gulp nodemon",
"debug": "gulp nodemon --inspect",
"postinstall": "gulp build && cd website/client && npm install",
"apidoc": "gulp apidoc"
},
@@ -112,7 +112,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",
-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,136 @@
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;
});
it('github issue 12138, method crashes when regex chars are used in code block', async () => {
const text = '`[test]`';
let err;
try {
await highlightMentions(text);
} catch (e) {
err = e;
}
expect(err).to.be.undefined;
});
});
@@ -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);
});
});
+12
View File
@@ -0,0 +1,12 @@
import { getMatchesByWordArray } from '../../../../website/server/libs/stringUtils';
import bannedWords from '../../../../website/server/libs/bannedWords';
describe('stringUtils', () => {
describe('getMatchesByWordArray', () => {
it('check all banned words are matched', async () => {
const message = bannedWords.join(',').replace(/\\/g, '');
const matches = getMatchesByWordArray(message, bannedWords);
expect(matches.length).to.equal(bannedWords.length);
});
});
});
@@ -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;
});
});
@@ -14,8 +14,6 @@ import {
TAVERN_ID,
} from '../../../../../website/server/models/group';
import { CHAT_FLAG_FROM_SHADOW_MUTE, MAX_MESSAGE_LENGTH } from '../../../../../website/common/script/constants';
import { getMatchesByWordArray } from '../../../../../website/server/libs/stringUtils';
import bannedWords from '../../../../../website/server/libs/bannedWords';
import guildsAllowingBannedWords from '../../../../../website/server/libs/guildsAllowingBannedWords';
import * as email from '../../../../../website/server/libs/email';
@@ -292,12 +290,6 @@ describe('POST /chat', () => {
.that.includes(testBannedWords.join(', '));
});
it('check all banned words are matched', async () => {
const message = bannedWords.join(',').replace(/\\/g, '');
const matches = getMatchesByWordArray(message, bannedWords);
expect(matches.length).to.equal(bannedWords.length);
});
it('does not error when bad word is suffix of a word', async () => {
const wordAsSuffix = `prefix${testBannedWordMessage}`;
const message = await user.post('/groups/habitrpg/chat', { message: wordAsSuffix });
@@ -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 () => {
@@ -6,6 +6,7 @@ import {
describe('POST /user/unlock', () => {
let user;
const unlockPath = 'shirt.convict,shirt.cross,shirt.fire,shirt.horizon,shirt.ocean,shirt.purple,shirt.rainbow,shirt.redblue,shirt.thunder,shirt.tropical,shirt.zombie';
const unlockGearSetPath = 'items.gear.owned.headAccessory_special_bearEars,items.gear.owned.headAccessory_special_cactusEars,items.gear.owned.headAccessory_special_foxEars,items.gear.owned.headAccessory_special_lionEars,items.gear.owned.headAccessory_special_pandaEars,items.gear.owned.headAccessory_special_pigEars,items.gear.owned.headAccessory_special_tigerEars,items.gear.owned.headAccessory_special_wolfEars';
const unlockCost = 1.25;
const usersStartingGems = 5;
@@ -34,4 +35,25 @@ describe('POST /user/unlock', () => {
expect(response.message).to.equal(t('unlocked'));
expect(user.balance).to.equal(usersStartingGems - unlockCost);
});
it('does not reduce a user\'s balance twice', async () => {
await user.update({
balance: usersStartingGems,
});
const response = await user.post(`/user/unlock?path=${unlockGearSetPath}`);
await user.sync();
expect(response.message).to.equal(t('unlocked'));
expect(user.balance).to.equal(usersStartingGems - unlockCost);
expect(user.post(`/user/unlock?path=${unlockGearSetPath}`))
.to.eventually.be.rejected.and.to.eql({
code: 401,
error: 'NotAuthorized',
message: t('alreadyUnlocked'),
});
await user.sync();
expect(user.balance).to.equal(usersStartingGems - unlockCost);
});
});
+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;
+29 -13
View File
@@ -1,12 +1,7 @@
import unlock from '../../../website/common/script/ops/unlock';
import i18n from '../../../website/common/script/i18n';
import {
generateUser,
} from '../../helpers/common.helper';
import {
NotAuthorized,
BadRequest,
} from '../../../website/common/script/libs/errors';
import { generateUser } from '../../helpers/common.helper';
import { NotAuthorized, BadRequest } from '../../../website/common/script/libs/errors';
describe('shared.ops.unlock', () => {
let user;
@@ -31,6 +26,15 @@ describe('shared.ops.unlock', () => {
}
});
it('does not unlock lost gear', done => {
user.items.gear.owned.headAccessory_special_bearEars = false;
unlock(user, { query: { path: 'items.gear.owned.headAccessory_special_bearEars' } });
expect(user.balance).to.equal(usersStartingGems);
done();
});
it('returns an error when user balance is too low', done => {
user.balance = 0;
@@ -50,18 +54,30 @@ describe('shared.ops.unlock', () => {
} catch (err) {
expect(err).to.be.an.instanceof(NotAuthorized);
expect(err.message).to.equal(i18n.t('alreadyUnlocked'));
expect(user.balance).to.equal(3.75);
done();
}
});
// disabled until fully implemente
xit('returns an error when user already owns items in a full set', done => {
it('returns an error when user already owns a full set of gear', done => {
try {
unlock(user, { query: { path: unlockPath } });
unlock(user, { query: { path: unlockPath } });
unlock(user, { query: { path: unlockGearSetPath } });
unlock(user, { query: { path: unlockGearSetPath } });
} catch (err) {
expect(err).to.be.an.instanceof(NotAuthorized);
expect(err.message).to.equal(i18n.t('alreadyUnlocked'));
expect(user.balance).to.equal(3.75);
done();
}
});
xit('returns an error when user already owns items in a full set', done => {
try {
unlock(user, { query: { path: unlockPath.split(',').splice(2).join(',') } });
unlock(user, { query: { path: unlockPath } });
} catch (err) {
expect(err).to.be.an.instanceof(NotAuthorized);
expect(err.message).to.equal(i18n.t('alreadyUnlockedPart'));
done();
}
});
@@ -78,7 +94,7 @@ describe('shared.ops.unlock', () => {
expect(user.preferences.background).to.equal('giant_florals');
});
it('un-equips an item already equipped', () => {
it('un-equips a background already equipped', () => {
expect(user.purchased.background.giant_florals).to.not.exist;
unlock(user, { query: { path: backgroundUnlockPath } }); // unlock
@@ -105,7 +121,7 @@ describe('shared.ops.unlock', () => {
expect(user.items.gear.owned.headAccessory_special_wolfEars).to.be.true;
});
it('unlocks a an item', () => {
it('unlocks an item', () => {
const [, message] = unlock(user, { query: { path: backgroundUnlockPath } });
expect(message).to.equal(i18n.t('unlocked'));
@@ -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,
+45 -74
View File
@@ -7265,9 +7265,9 @@
"integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
},
"bootstrap-vue": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.11.0.tgz",
"integrity": "sha512-T23+aVVSDifX1SsI5y69bYZzbm8iQHlmgiBUw9XxY1KTw/fb4xvUq4+Y01Tsaul04+zmrUah/5zvUGKLwTcH7A==",
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.12.0.tgz",
"integrity": "sha512-cnW89Ig0OBbKTA6Hv8daijSWziNSDErAme9jTOmjBDtzqYAd9D4NCp0wDjfNRaZBojTRx/UR1SCatxP3bE+SMw==",
"requires": {
"@nuxt/opencollective": "^0.3.0",
"bootstrap": ">=4.4.1 <5.0.0",
@@ -11676,13 +11676,13 @@
}
},
"habitica-markdown": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.3.2.tgz",
"integrity": "sha512-IyiS583DfqE+KvW4NQAB4K2HjJZ1oF50L0EDz7KaixyK7C41s47wsbN81QtNMB8LnRqbMHFDesD2xEzdicjFXw==",
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.4.0.tgz",
"integrity": "sha512-hklG3eBILNbx/VxGeRxuk+/RiWWllcd5QLNv7Kvm2wGBRTeK9c3my2eusGuHXkwStEFGxjJD5e0iMO47cGPxYw==",
"requires": {
"habitica-markdown-emoji": "1.2.4",
"markdown-it": "8.4.2",
"markdown-it-link-attributes": "1.0.0",
"markdown-it": "10.0.0",
"markdown-it-link-attributes": "3.0.0",
"markdown-it-linkify-images": "^1.1.1"
}
},
@@ -13560,22 +13560,15 @@
}
},
"markdown-it": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
"integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==",
"requires": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
"entities": "~2.0.0",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
"dependencies": {
"entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
}
}
},
"markdown-it-emoji": {
@@ -13584,9 +13577,9 @@
"integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw="
},
"markdown-it-link-attributes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-1.0.0.tgz",
"integrity": "sha1-jaHKFynw+hbGVhWwsQdbecg3Gi4="
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-3.0.0.tgz",
"integrity": "sha512-B34ySxVeo6MuEGSPCWyIYryuXINOvngNZL87Mp7YYfKIf6DcD837+lXA8mo6EBbauKsnGz22ZH0zsbOiQRWTNg=="
},
"markdown-it-linkify-images": {
"version": "1.1.1",
@@ -13594,6 +13587,25 @@
"integrity": "sha512-1IEmAaAjIgAwY+tZI0sxDXdy9QKHutj5cN0lH2JBiSZt+2NYKrWRJj0cloQW3OFIfP2MLFA1E+6OLJhXPiLgNw==",
"requires": {
"markdown-it": "^8.4.2"
},
"dependencies": {
"entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
},
"markdown-it": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
"requires": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
}
}
}
},
"markdown-to-jsx": {
@@ -15158,11 +15170,6 @@
"sha.js": "^2.4.8"
}
},
"perfect-scrollbar": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz",
"integrity": "sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -15433,17 +15440,6 @@
}
}
},
"postcss-import": {
"version": "12.0.1",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz",
"integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==",
"requires": {
"postcss": "^7.0.1",
"postcss-value-parser": "^3.2.3",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
}
},
"postcss-load-config": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
@@ -16633,21 +16629,6 @@
"lodash": "^4.0.1"
}
},
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
"requires": {
"pify": "^2.3.0"
},
"dependencies": {
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
}
}
},
"read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -17177,9 +17158,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sass": {
"version": "1.26.3",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.26.3.tgz",
"integrity": "sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==",
"version": "1.26.5",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz",
"integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==",
"requires": {
"chokidar": ">=2.0.0 <4.0.0"
}
@@ -19722,16 +19703,6 @@
"resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw=="
},
"vue2-perfect-scrollbar": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/vue2-perfect-scrollbar/-/vue2-perfect-scrollbar-1.4.0.tgz",
"integrity": "sha512-kluthjiZOOhAZ/18RTZJr2Y9lpjgkuOuxkH8MMMq1dYrSUdvlEv8V1UPtW7UDVcTAUo048AUE/W4hSPTfluejw==",
"requires": {
"cssnano": "^4.1.3",
"perfect-scrollbar": "^1.4.0",
"postcss-import": "^12.0.0"
}
},
"vuedraggable": {
"version": "2.23.2",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.23.2.tgz",
@@ -19802,15 +19773,15 @@
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
},
"webpack": {
"version": "4.42.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz",
"integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==",
"version": "4.43.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz",
"integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==",
"requires": {
"@webassemblyjs/ast": "1.9.0",
"@webassemblyjs/helper-module-context": "1.9.0",
"@webassemblyjs/wasm-edit": "1.9.0",
"@webassemblyjs/wasm-parser": "1.9.0",
"acorn": "^6.2.1",
"acorn": "^6.4.1",
"ajv": "^6.10.2",
"ajv-keywords": "^3.4.1",
"chrome-trace-event": "^1.0.2",
@@ -19827,7 +19798,7 @@
"schema-utils": "^1.0.0",
"tapable": "^1.1.3",
"terser-webpack-plugin": "^1.4.3",
"watchpack": "^1.6.0",
"watchpack": "^1.6.1",
"webpack-sources": "^1.4.1"
},
"dependencies": {
@@ -19837,9 +19808,9 @@
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"mkdirp": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
"integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": {
"minimist": "^1.2.5"
}
+4 -5
View File
@@ -29,14 +29,14 @@
"axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.4.1",
"bootstrap-vue": "^2.11.0",
"bootstrap-vue": "^2.12.0",
"chai": "^4.1.2",
"core-js": "^3.6.5",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
"eslint-plugin-mocha": "^5.3.0",
"eslint-plugin-vue": "^6.2.2",
"habitica-markdown": "^1.3.2",
"habitica-markdown": "^1.4.0",
"hellojs": "^1.18.4",
"inspectpack": "^4.4.0",
"intro.js": "^2.9.3",
@@ -44,7 +44,7 @@
"lodash": "^4.17.15",
"moment": "^2.24.0",
"nconf": "^0.10.0",
"sass": "^1.26.3",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.15.0",
"svg-inline-loader": "^0.8.2",
@@ -58,9 +58,8 @@
"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"
"webpack": "^4.43.0"
}
}
@@ -1,84 +1,24 @@
.promo_april_fools_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
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: -313px 0px;
width: 423px;
height: 147px;
}
.promo_egg_quest {
.promo_mystery_202005 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -355px -648px;
width: 354px;
height: 147px;
}
.promo_mystery_202004 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px 0px;
background-position: 0px -223px;
width: 282px;
height: 147px;
}
.promo_pastel_skin_hair {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -648px;
width: 354px;
height: 147px;
}
.customize-option.promo_pastel_skin_hair {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -25px -663px;
width: 60px;
height: 60px;
}
.promo_seasonal_shop_spring {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -299px;
width: 162px;
height: 138px;
}
.promo_shiny_seeds {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -424px -500px;
width: 360px;
height: 147px;
}
.promo_spring_2019 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -337px;
width: 432px;
height: 162px;
}
.promo_spring_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -445px 0px;
width: 429px;
height: 183px;
}
.promo_spring_potions_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -433px -337px;
width: 423px;
height: 147px;
}
.promo_take_this {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -1026px -148px;
background-position: -313px -148px;
width: 96px;
height: 69px;
}
.scene_hat_guild {
.scene_casting_spells {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px 0px;
width: 444px;
height: 336px;
}
.scene_meditation {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -148px;
width: 150px;
height: 150px;
width: 312px;
height: 222px;
}
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: 96 KiB

After

Width:  |  Height:  |  Size: 26 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: 117 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: 136 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: 143 KiB

+25 -1
View File
@@ -4,23 +4,47 @@
line-height: 1.33;
color: $gray-200;
padding: 4px 8px;
box-shadow: 0 1px 1px 0 rgba($black, 0.12);
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
}
.badge-pill {
border-radius: 100px;
}
.badge-round {
height: 1.5rem;
width: 1.5rem;
border-radius: 100%;
}
.badge-default {
background: $gray-500;
box-shadow: none;
}
.badge-dialog {
position: absolute;
left: -16px;
top: -16px;
.badge-pin {
width: 36px;
height: 36px;
padding: 0.5rem;
}
}
.badge-item {
position: absolute;
top: -9px;
}
.badge-top {
position: absolute;
left: calc((100% - 24px) / 2);
top: -12px;
}
.badge-purple {
position: absolute;
color: $white;
@@ -68,8 +68,6 @@ $purple-600: #D5C8FF;
$header-color: #D5C8FF;
$header-dark-background: #271B3D;
$suggested-item-color: #D5C8FF;
$healer-color: #FFA624;
$rogue-color: #4F2A93;
$warrior-color: #C92B2B;
+1 -2
View File
@@ -32,9 +32,8 @@
@import './dragdrop';
@import './banner';
@import './progress-bar';
@import './pin';
@import './animals';
@import './iconalert';
@import './tiers';
@import './payments';
@import './datepicker.scss';
@import './datepicker.scss';
+5 -13
View File
@@ -24,7 +24,7 @@
@media only screen and (min-width: 1440px){
margin-right: 1.71em;
}
// Desktop L (1280)
@media only screen and (min-width: 1280px) and (max-width: 1439px) {
margin-right: 0.43em;
@@ -47,8 +47,9 @@
height: 92px;
border-radius: 2px;
background: $white;
box-shadow: 0 2px 2px 0 rgba($black, 0.15), 0 1px 4px 0 rgba($black, 0.1);
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
border: 1px solid transparent;
cursor: pointer;
&-empty {
background: $gray-10;
@@ -61,8 +62,8 @@
}
&:hover {
box-shadow: 0 4px 4px 0 rgba($black, 0.16), 0 1px 8px 0 rgba($black, 0.12);
border-color: $purple-500;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
border-color: $purple-400;
}
&.highlight {
@@ -72,15 +73,6 @@
&.highlight-border {
border-color: $purple-500;
}
&.suggested {
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
border: solid 1px $suggested-item-color;
}
&.suggested:hover {
border: solid 1px $purple-500;
}
}
.flat .item {
-26
View File
@@ -1,26 +0,0 @@
.badge-svg {
left: calc((100% - 18px) / 2);
cursor: pointer;
color: $gray-400;
background: $white;
padding: 4.5px 6px;
&.item-selected-badge {
background: $purple-300;
color: $white;
}
}
span.badge.badge-pill.badge-item.badge-svg:not(.item-selected-badge) {
color: #a5a1ac;
}
span.badge.badge-pill.badge-item.badge-svg.hide {
display: none;
}
.item:hover {
span.badge.badge-pill.badge-item.badge-svg.hide {
display: block;
}
}
@@ -1,12 +1,12 @@
// this variables are used to determine which shop npc/backgrounds should be loaded
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring, summer
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, normal, summer
// more to be added on future seasons
$npc_market_flavor: 'spring';
$npc_quests_flavor: 'spring';
$npc_seasonal_flavor: 'spring';
$npc_timetravelers_flavor: 'spring';
$npc_tavern_flavor: 'spring';
$npc_market_flavor: 'normal';
$npc_quests_flavor: 'normal';
$npc_seasonal_flavor: 'normal';
$npc_timetravelers_flavor: 'normal';
$npc_tavern_flavor: 'normal';
$restingToolbarHeight: 40px;
$menuToolbarHeight: 56px;
+2 -2
View File
@@ -1,3 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
<path fill="#FFF" fill-rule="evenodd" d="M6.252 8.46l-2.71-2.712 4.602-3.58 1.688 1.689-3.58 4.602zm5.554-4.497l-.626-.627-.001-.001L8.666.822 8.037.194a.66.66 0 1 0-.934.934l.1.1L2.6 4.806l-.216-.216a.66.66 0 1 0-.934.934l.627.627v.001l1.418 1.418-3.301 3.302a.66.66 0 1 0 .934.934L4.43 8.505l1.417 1.417.001.002.628.627a.658.658 0 0 0 .934 0 .66.66 0 0 0 0-.934L7.194 9.4l3.58-4.602.098.099a.659.659 0 0 0 .934 0 .66.66 0 0 0 0-.934z"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="-2 -1.5 16 16">
<path id="prefix__a" d="M9.748 4.127l-3.27 4.205-2.31-2.31 4.205-3.27 1.375 1.375zm2.484-.091l-.554-.554V3.43l-.102-.051L8.463.267C8.293.095 8.063 0 7.82 0c-.244 0-.472.095-.644.267-.173.172-.267.401-.267.644 0 .195.061.382.174.536L2.87 4.724l-.06-.06c-.355-.354-.932-.354-1.288 0-.355.356-.355.933 0 1.288l1.87 1.869-3.126 3.125c-.355.355-.355.933 0 1.286.17.173.4.268.643.268.244 0 .474-.095.645-.267L4.68 9.108l1.87 1.87c.342.343.94.344 1.287 0 .355-.356.355-.933 0-1.289l-.06-.06 3.277-4.212c.345.252.87.215 1.18-.093.354-.356.354-.933 0-1.288z"/>
</svg>

Before

Width:  |  Height:  |  Size: 534 B

After

Width:  |  Height:  |  Size: 691 B

@@ -225,30 +225,30 @@ export default {
classGear (heroClass) {
if (heroClass === 'rogue') {
return {
armor: 'armor_special_spring2020Rogue',
head: 'head_special_spring2020Rogue',
shield: 'shield_special_spring2020Rogue',
weapon: 'weapon_special_spring2020Rogue',
armor: 'armor_rogue_5',
head: 'head_rogue_5',
shield: 'shield_rogue_6',
weapon: 'weapon_rogue_6',
};
} if (heroClass === 'wizard') {
return {
armor: 'armor_special_spring2020Mage',
head: 'head_special_spring2020Mage',
weapon: 'weapon_special_spring2020Mage',
armor: 'armor_wizard_5',
head: 'head_wizard_5',
weapon: 'weapon_wizard_6',
};
} if (heroClass === 'healer') {
return {
armor: 'armor_special_spring2020Healer',
head: 'head_special_spring2020Healer',
shield: 'shield_special_spring2020Healer',
weapon: 'weapon_special_spring2020Healer',
armor: 'armor_healer_5',
head: 'head_healer_5',
shield: 'shield_healer_5',
weapon: 'weapon_healer_6',
};
}
return {
armor: 'armor_special_spring2020Warrior',
head: 'head_special_spring2020Warrior',
shield: 'shield_special_spring2020Warrior',
weapon: 'weapon_special_spring2020Warrior',
armor: 'armor_warrior_5',
head: 'head_warrior_5',
shield: 'shield_warrior_5',
weapon: 'weapon_warrior_6',
};
},
selectionBox (selectedClass, heroClass) {
+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"
+24 -57
View File
@@ -227,7 +227,7 @@
></i>
<div
v-if="!user.purchased.background[bg.key]"
class="purchase-background single"
class="purchase-background single d-flex align-items-center justify-content-center"
>
<div
class="svg-icon hourglass"
@@ -237,16 +237,12 @@
</div>
<span
v-if="!user.purchased.background[bg.key]"
class="badge badge-pill badge-item badge-svg"
:class="{
'item-selected-badge': isBackgroundPinned(bg),
'hide': !isBackgroundPinned(bg)}"
@click.prevent.stop="togglePinned(bg)"
class="badge-top"
@click.stop.prevent="togglePinned(bg)"
>
<span
class="svg-icon inline icon-12 color"
v-html="icons.pin"
></span>
<pin-badge
:pinned="isBackgroundPinned(bg)"
/>
</span>
</div>
</div>
@@ -295,7 +291,7 @@
></i>
<div
v-if="!user.purchased.background[bg.key]"
class="purchase-background single"
class="purchase-background single d-flex align-items-center justify-content-center"
>
<div
class="svg-icon gem"
@@ -305,16 +301,12 @@
</div>
<span
v-if="!user.purchased.background[bg.key]"
class="badge badge-pill badge-item badge-svg"
:class="{
'item-selected-badge': isBackgroundPinned(bg),
'hide': !isBackgroundPinned(bg)}"
@click.prevent.stop="togglePinned(bg)"
class="badge-top"
@click.stop.prevent="togglePinned(bg)"
>
<span
class="svg-icon inline icon-12 color"
v-html="icons.pin"
></span>
<pin-badge
:pinned="isBackgroundPinned(bg)"
/>
</span>
</div>
<div
@@ -1095,38 +1087,14 @@
}
}
.badge-svg {
left: calc((100% - 18px) / 2);
cursor: pointer;
color: $gray-400;
background: $white;
padding: 4.5px 6px;
&.item-selected-badge {
background: $purple-300;
color: $white;
}
}
.icon-12 {
width: 12px;
height: 12px;
}
span.badge.badge-pill.badge-item.badge-svg:not(.item-selected-badge) {
color: #a5a1ac;
}
span.badge.badge-pill.badge-item.badge-svg.hide {
display: none;
}
.background-button {
margin-bottom: 15px;
}
.background-button:hover {
span.badge.badge-pill.badge-item.badge-svg.hide {
.badge-pin:not(.pinned) {
display: none;
}
&:hover .badge-pin {
display: block;
}
}
@@ -1142,6 +1110,7 @@ import usernameForm from './settings/usernameForm';
import shops from '@/../../common/script/libs/shops';
import guide from '@/mixins/guide';
import notifications from '@/mixins/notifications';
import PinBadge from '@/components/ui/pinBadge';
import toggleSwitch from '@/components/ui/toggleSwitch';
import bodySettings from './avatarModal/body-settings';
import skinSettings from './avatarModal/skin-settings';
@@ -1158,7 +1127,6 @@ import backgroundsIcon from '@/assets/svg/backgrounds.svg';
import gem from '@/assets/svg/gem.svg';
import hourglass from '@/assets/svg/hourglass.svg';
import gold from '@/assets/svg/gold.svg';
import pin from '@/assets/svg/pin.svg';
import arrowRight from '@/assets/svg/arrow_right.svg';
import arrowLeft from '@/assets/svg/arrow_left.svg';
import svgClose from '@/assets/svg/close.svg';
@@ -1170,14 +1138,14 @@ import content from '@/../../common/script/content/index';
export default {
components: {
avatar,
bodySettings,
extraSettings,
hairSettings,
PinBadge,
skinSettings,
subMenu,
toggleSwitch,
usernameForm,
bodySettings,
skinSettings,
hairSettings,
extraSettings,
subMenu,
},
mixins: [guide, notifications, avatarEditorUtilies],
data () {
@@ -1198,7 +1166,6 @@ export default {
backgroundsIcon,
gem,
hourglass,
pin,
gold,
arrowRight,
arrowLeft,
@@ -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) {
@@ -29,7 +29,7 @@
:class="{
'input-valid': invite.valid, 'is-invalid input-invalid': invite.valid === false}"
@keyup="expandInviteList"
@change="checkInviteList"
@input="inviteUpdated(invite)"
>
</div>
<div
@@ -128,8 +128,6 @@
<script>
import clone from 'lodash/clone';
import debounce from 'lodash/debounce';
import filter from 'lodash/filter';
import forEach from 'lodash/forEach';
import isEmail from 'validator/lib/isEmail';
import isUUID from 'validator/lib/isUUID';
import { mapState } from '@/libs/store';
@@ -152,25 +150,24 @@ export default {
computed: {
...mapState({ user: 'user.data' }),
cannotSubmit () {
const filteredInvites = filter(
this.invites,
invite => invite.text.length > 0 && !invite.valid,
);
if (filteredInvites.length > 0) return true;
return false;
const filledInvites = this.invites.filter(invite => invite.text.length);
return !filledInvites.length || filledInvites.some(invite => !invite.valid);
},
inviter () {
return this.user.profile.name;
},
},
methods: {
inviteUpdated (invite) {
this.clearErrors(invite);
this.checkInviteList();
},
checkInviteList: debounce(function checkList () {
this.invites = filter(
this.invites,
this.invites = this.invites.filter(
(invite, index) => invite.text.length > 0 || index === this.invites.length - 1,
);
while (this.invites.length < 2) this.invites.push(clone(INVITE_DEFAULTS));
forEach(this.invites, (value, index) => {
this.invites.forEach((value, index) => {
if (value.text.length < 1 || isEmail(value.text)) {
return this.fillErrors(index);
}
@@ -185,12 +182,16 @@ export default {
return this.$store.dispatch('user:userLookup', { username: searchUsername })
.then(res => this.fillErrors(index, res));
});
}, 250),
}, 500),
expandInviteList () {
if (this.invites[this.invites.length - 1].text.length > 0) {
this.invites.push(clone(INVITE_DEFAULTS));
}
},
clearErrors (invite) {
invite.valid = null;
invite.error = null;
},
fillErrors (index, res) {
if (!res || res.status === 200) {
this.invites[index].error = null;
@@ -216,7 +217,7 @@ export default {
uuids: [],
usernames: [],
};
forEach(this.invites, invite => {
this.invites.forEach(invite => {
if (invite.text.length < 1) return;
if (isEmail(invite.text)) {
invitationDetails.emails.push({ email: invite.text });
@@ -5,7 +5,7 @@
{{ `${$t('lockedItem')}` }}
</h4>
<div
v-if="item.specialClass"
v-if="isWrongClass"
class="popover-content-text"
>
{{ `${$t('classLockedItem')}` }}
@@ -71,6 +71,11 @@ export default {
}
return this.item.notes;
},
isWrongClass () {
const wrongKlass = this.item.klass && !['special', 'armoire', this.user.stats.class].includes(this.item.klass);
const wrongSpecialClass = this.item.klass === 'special' && this.item.specialClass && this.item.specialClass !== this.user.stats.class;
return wrongKlass || wrongSpecialClass;
},
},
};
</script>
@@ -159,10 +159,10 @@
:class="group.key"
>
<!-- eslint-enable vue/no-use-v-if-with-v-for -->
<h2 class="mb-3">
<h2 class="d-flex align-items-center mb-3">
{{ group.label }}
<span
class="badge badge-pill badge-default"
class="badge badge-pill badge-default ml-2"
>{{ items[group.key].length }}</span>
</h2>
<itemRows
@@ -80,11 +80,11 @@
:key="group.key"
>
<!-- eslint-enable vue/no-use-v-if-with-v-for -->
<h2 class="mb-3">
<h2 class="d-flex align-items-center mb-3">
{{ $t(group.key) }}
<span
v-if="group.key != 'special'"
class="badge badge-pill badge-default"
class="badge badge-pill badge-default ml-2"
>{{ group.quantity }}</span>
</h2>
<itemRows
@@ -1,20 +1,22 @@
<template>
<perfect-scrollbar
<div
ref="container"
class="container-fluid"
:class="{'disable-perfect-scroll': disablePerfectScroll}"
:options="psOptions"
>
<div class="row loadmore">
<div v-if="canLoadMore && !isLoading">
<div class="loadmore-divider"></div>
<div class="loadmore-divider-holder">
<div class="loadmore-divider"></div>
</div>
<button
class="btn btn-secondary"
@click="triggerLoad()"
>
{{ $t('loadEarlierMessages') }}
</button>
<div class="loadmore-divider"></div>
<div class="loadmore-divider-holder">
<div class="loadmore-divider"></div>
</div>
</div>
<h2
v-show="isLoading"
@@ -30,11 +32,10 @@
:class="{ 'margin-right': user._id !== msg.uuid}"
>
<div
v-if="user._id !== msg.uuid"
class="d-flex flex-grow-1"
>
<avatar
v-if="conversationOpponentUser"
v-if="user._id !== msg.uuid && conversationOpponentUser"
class="avatar-left"
:member="conversationOpponentUser"
:avatar-only="true"
@@ -42,20 +43,10 @@
:hide-class-badge="true"
@click.native="showMemberModal(msg.uuid)"
/>
<div class="card card-right">
<message-card
:msg="msg"
@message-removed="messageRemoved"
@show-member-modal="showMemberModal"
@message-card-mounted="itemWasMounted"
/>
</div>
</div>
<div
v-if="user._id === msg.uuid"
class="d-flex flex-grow-1"
>
<div class="card card-left">
<div
class="card"
:class="{'card-right': user._id !== msg.uuid, 'card-left': user._id === msg.uuid}"
>
<message-card
:msg="msg"
@message-removed="messageRemoved"
@@ -64,7 +55,7 @@
/>
</div>
<avatar
v-if="user"
v-if="user && user._id === msg.uuid"
class="avatar-right"
:member="user"
:avatar-only="true"
@@ -74,16 +65,11 @@
/>
</div>
</div>
</perfect-scrollbar>
</div>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '~vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css';
.disable-perfect-scroll {
overflow-y: inherit !important;
}
.avatar {
width: 170px;
@@ -162,6 +148,8 @@
.loadmore {
justify-content: center;
margin-right: 12px;
margin-top: 12px;
margin-bottom: 24px;
> div {
display: flex;
@@ -171,15 +159,11 @@
button {
text-align: center;
color: $gray-50;
margin-top: 12px;
margin-bottom: 24px;
}
}
}
.loadmore-divider {
height: 1px;
background-color: $gray-500;
.loadmore-divider-holder {
flex: 1;
margin-left: 24px;
margin-right: 24px;
@@ -189,6 +173,13 @@
}
}
.loadmore-divider {
height: 1px;
border-top: 1px $gray-500 solid;
width: 100%;
}
.loading {
padding-left: 1.5rem;
margin-bottom: 1rem;
@@ -200,7 +191,6 @@
<script>
import moment from 'moment';
import debounce from 'lodash/debounce';
import { PerfectScrollbar } from 'vue2-perfect-scrollbar';
import { mapState } from '@/libs/store';
import Avatar from '../avatar';
@@ -210,7 +200,6 @@ export default {
components: {
Avatar,
messageCard,
PerfectScrollbar,
},
props: {
chat: {},
@@ -248,15 +237,10 @@ export default {
messages () {
return this.chat;
},
psOptions () {
return {
suppressScrollX: true,
};
},
},
methods: {
async triggerLoad () {
const container = this.$refs.container.$el;
const { container } = this.$refs;
// get current offset
this.lastOffset = container.scrollTop - (container.scrollHeight - container.clientHeight);
@@ -274,8 +258,9 @@ export default {
}
},
displayDivider (message) {
if (this.currentDayDividerDisplay !== moment(message.timestamp).day()) {
this.currentDayDividerDisplay = moment(message.timestamp).day();
const day = moment(message.timestamp).day();
if (this.currentDayDividerDisplay !== day) {
this.currentDayDividerDisplay = day;
return true;
}
@@ -288,7 +273,7 @@ export default {
if (this.handleScrollBack) {
this.handleScrollBack = false;
const container = this.$refs.container.$el;
const { container } = this.$refs;
const offset = container.scrollHeight - container.clientHeight;
const newOffset = offset + this.lastOffset;
@@ -6,14 +6,12 @@
>
<span
v-if="withPin"
class="badge badge-pill badge-dialog"
:class="{'item-selected-badge': isPinned}"
class="badge-dialog"
@click.prevent.stop="togglePinned()"
>
<span
class="svg-icon inline color icon-16"
v-html="icons.pin"
></span>
<pin-badge
:pinned="isPinned"
/>
</span>
<div>
<span
@@ -147,7 +145,7 @@
v-else
class="btn btn-primary"
:disabled="item.key === 'gem' && gemsLeft === 0 ||
attemptingToPurchaseMoreGemsThanAreLeft || numberInvalid"
attemptingToPurchaseMoreGemsThanAreLeft || numberInvalid || item.locked"
:class="{'notEnough': !preventHealthPotion ||
!enoughCurrency(getPriceClass(), item.value * selectedAmountToBuy)}"
@click="buyItem()"
@@ -310,21 +308,6 @@
display: block;
}
.badge-dialog {
color: $gray-300;
position: absolute;
left: -14px;
padding: 8px 10px;
top: -12px;
background: white;
cursor: pointer;
&.item-selected-badge {
background: $purple-300;
color: $white;
}
}
.notEnough {
pointer-events: none;
opacity: 0.55;
@@ -405,11 +388,11 @@ import svgClose from '@/assets/svg/close.svg';
import svgGold from '@/assets/svg/gold.svg';
import svgGem from '@/assets/svg/gem.svg';
import svgHourglasses from '@/assets/svg/hourglass.svg';
import svgPin from '@/assets/svg/pin.svg';
import svgClock from '@/assets/svg/clock.svg';
import svgWhiteClock from '@/assets/svg/clock-white.svg';
import BalanceInfo from './balanceInfo.vue';
import PinBadge from '@/components/ui/pinBadge';
import currencyMixin from './_currencyMixin';
import notifications from '@/mixins/notifications';
import buyMixin from '@/mixins/buy';
@@ -439,6 +422,7 @@ export default {
EquipmentAttributesGrid,
Item,
Avatar,
PinBadge,
},
mixins: [buyMixin, currencyMixin, notifications, numberInvalid, spellsMixin],
props: {
@@ -463,7 +447,6 @@ export default {
gold: svgGold,
gems: svgGem,
hourglasses: svgHourglasses,
pin: svgPin,
clock: svgClock,
whiteClock: svgWhiteClock,
}),
@@ -37,14 +37,12 @@
slot-scope="ctx"
>
<span
class="badge badge-pill badge-item badge-svg"
:class="{'item-selected-badge': ctx.item.pinned, 'hide': !ctx.item.pinned}"
class="badge-top"
@click.prevent.stop="togglePinned(ctx.item)"
>
<span
class="svg-icon inline icon-12 color"
v-html="icons.pin"
></span>
<pin-badge
:pinned="ctx.item.pinned"
/>
</span>
</template>
</shopItem>
@@ -55,14 +53,14 @@
</template>
<script>
import PinBadge from '@/components/ui/pinBadge';
import ShopItem from './shopItem';
import pinUtils from '@/mixins/pinUtils';
import svgPin from '@/assets/svg/pin.svg';
export default {
components: {
PinBadge,
ShopItem,
},
mixins: [pinUtils],
@@ -72,13 +70,6 @@ export default {
featuredText: String,
featuredItems: Array,
},
data () {
return {
icons: Object.freeze({
pin: svgPin,
}),
};
},
methods: {
featuredItemSelected (item) {
this.$emit('featuredItemSelected', item);
@@ -105,6 +96,14 @@ export default {
align-items: center;
}
.badge-pin:not(.pinned) {
display: none;
}
.item:hover .badge-pin {
display: block;
}
.content {
display: flex;
flex-direction: column;
@@ -12,39 +12,41 @@
{{ gemsLeft }}
</div>
<span
class="badge badge-pill badge-item badge-svg"
:class="{'item-selected-badge': item.pinned, 'hide': !item.pinned}"
class="badge-top"
@click.prevent.stop="togglePinned(item)"
>
<span
class="svg-icon inline icon-12 color"
v-html="icons.pin"
></span>
<pin-badge
:pinned="item.pinned"
/>
</span>
</div>
</template>
<style lang="scss" scoped>
.badge-pin:not(.pinned) {
display: none;
}
.item:hover .badge-pin {
display: block;
}
</style>
<script>
import { mapState } from '@/libs/store';
import CountBadge from '@/components/ui/countBadge';
import svgPin from '@/assets/svg/pin.svg';
import PinBadge from '@/components/ui/pinBadge';
import planGemLimits from '@/../../common/script/libs/planGemLimits';
import pinUtils from '../../../mixins/pinUtils';
export default {
components: {
CountBadge,
PinBadge,
},
mixins: [pinUtils],
props: ['item'],
data () {
return {
icons: Object.freeze({
pin: svgPin,
}),
};
},
computed: {
...mapState({
user: 'user.data',
@@ -49,7 +49,6 @@
<shopItem
:key="ctx.item.key"
:item="ctx.item"
:empty-item="userItems.gear[ctx.item.key] === undefined"
:popover-position="'top'"
@click="gearSelected(ctx.item)"
>
@@ -58,14 +57,12 @@
slot-scope="ctx"
>
<span
class="badge badge-pill badge-item badge-svg"
:class="{'item-selected-badge': ctx.item.pinned, 'hide': !ctx.item.pinned}"
class="badge-top"
@click.prevent.stop="togglePinned(ctx.item)"
>
<span
class="svg-icon inline icon-12 color"
v-html="icons.pin"
></span>
<pin-badge
:pinned="ctx.item.pinned"
/>
</span>
</template>
</shopItem>
@@ -81,11 +78,11 @@ import { mapState } from '@/libs/store';
import LayoutSection from '@/components/ui/layoutSection';
import FilterDropdown from '@/components/ui/filterDropdown';
import ItemRows from '@/components/ui/itemRows';
import PinBadge from '@/components/ui/pinBadge';
import ShopItem from '../shopItem';
import shops from '@/../../common/script/libs/shops';
import svgPin from '@/assets/svg/pin.svg';
import svgWarrior from '@/assets/svg/warrior.svg';
import svgWizard from '@/assets/svg/wizard.svg';
import svgRogue from '@/assets/svg/rogue.svg';
@@ -112,6 +109,7 @@ export default {
LayoutSection,
FilterDropdown,
ItemRows,
PinBadge,
ShopItem,
},
mixins: [pinUtils],
@@ -122,7 +120,6 @@ export default {
selectedSortGearBy: sortGearTypes[0],
selectedGroupGearByClass: '',
icons: Object.freeze({
pin: svgPin,
warrior: svgWarrior,
wizard: svgWizard,
rogue: svgRogue,
@@ -168,9 +165,7 @@ export default {
return this.$t(classType);
},
gearSelected (item) {
if (!item.locked) {
this.$root.$emit('buyModal::showItem', item);
}
this.$root.$emit('buyModal::showItem', item);
},
filterGearItems () {
const category = _filter(this.marketGearCategories, ['identifier', this.selectedGroupGearByClass]);
@@ -200,9 +195,11 @@ export default {
</script>
<style lang="scss" scoped>
.equipment-rows {
::v-deep .item.item-empty {
background: white;
.badge-pin:not(.pinned) {
display: none;
}
.item:hover .badge-pin {
display: block;
}
</style>
@@ -176,15 +176,9 @@ import FilterDropdown from '@/components/ui/filterDropdown';
import MarketFilter from './filter';
import SellModal from './sellModal.vue';
import svgPin from '@/assets/svg/pin.svg';
import svgGem from '@/assets/svg/gem.svg';
import svgInformation from '@/assets/svg/information.svg';
import getItemInfo from '@/../../common/script/libs/getItemInfo';
import shops from '@/../../common/script/libs/shops';
import notifications from '@/mixins/notifications';
import buyMixin from '@/mixins/buy';
import currencyMixin from '../_currencyMixin';
@@ -222,13 +216,6 @@ export default {
searchText: null,
searchTextThrottled: null,
icons: Object.freeze({
pin: svgPin,
gem: svgGem,
information: svgInformation,
}),
sortItemsBy: sortItems,
selectedSortItemsBy: sortItems[0],

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