Compare commits

...

37 Commits

Author SHA1 Message Date
CuriousMagpie b8a2f0b8ee update privacy policy 2024-11-26 13:21:31 -06:00
Phillip Thelen 75c9731ca4 filter stripe webhooks for correct server (#15320)
Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2024-11-26 12:24:23 -06:00
Kalista Payne 31afc45744 5.31.1 2024-11-22 09:20:27 -06:00
Kalista Payne f6466b161b Squashed commit of the following:
commit ea8512bc2eeda30c4d983fb43bfcb33ea39093e9
Merge: 2bb7683cfd a36114e904
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Nov 21 12:47:11 2024 -0600

    Merge branch 'develop' into ui-drawer-fix

commit 2bb7683cfd
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Tue Nov 12 15:46:55 2024 -0500

    fix food centering and error centering at very small widths

commit fcabf03978
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Fri Nov 1 14:44:16 2024 -0400

    grid size update

commit 47a531c1aa
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Oct 31 16:17:22 2024 -0400

    centered error messages on pet drawer

commit 14d2872392
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Oct 24 15:47:46 2024 -0400

    center no food/no saddle messages in drawer

commit 49d1d10a4f
Merge: 6a805bdc45 f1993db0fa
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Oct 24 14:04:16 2024 -0400

    Merge branch 'develop' into ui-drawer-fix

commit 6a805bdc45
Author: Alex <alex.kliger@gmail.com>
Date:   Sat Nov 19 09:41:21 2022 -0500

    fix(ui): correct crowding in title of drawer component that causes drawer toggle icon to become obstructed
2024-11-21 12:55:00 -06:00
Kalista Payne a36114e904 Squashed commit of the following:
commit 4d88df1c381c4136cfe4780b6b5464d9c984bb31
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Wed Oct 30 14:24:53 2024 -0400

    fixing active/focus states

commit 630f74db6365625af210de81d577d43945f62df4
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Wed Oct 23 13:25:14 2024 -0400

    sign-up/login/debug menu updates

commit f85ef1c58e367219923c46aeebe77d1aa846b6f3
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Tue Oct 15 13:56:36 2024 -0400

    more color standardization

commit cd2ee3350fc51016cc75fb799debeefa0b1d9b64
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Tue Oct 15 13:39:02 2024 -0400

    updates per comments

commit e91371522bb9a6dae5c6d02eb6f16f0b632f7a24
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Fri Oct 4 14:25:45 2024 -0400

    class selection active state

commit 4fcdca1eb07eb67aacd84feb1c9357d52fd6f23f
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Oct 3 14:31:00 2024 -0400

    fixing a few more buttons

commit 475e21aae7733cfa072f828c559cc0930f0ad878
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Wed Oct 2 15:57:25 2024 -0400

    line-heights converted to unitless multipliers

commit c5dca257274a60b02e1f12e3c6daf103cec53096
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Fri Sep 27 13:48:20 2024 -0400

    second pass

commit 685f4d4d64b8b234afbb702d1b8a52d4670d3825
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Sep 26 16:58:59 2024 -0400

    first pass
2024-11-21 12:40:05 -06:00
dependabot[bot] 529f856ab9 Bump cross-spawn from 7.0.3 to 7.0.5 (#15365)
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.5.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.5)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-21 13:31:49 -05:00
Kalista Payne 9077e66973 fix(notifications): adjust z-index by @CuriousMagpie 2024-11-21 12:22:45 -06:00
Kalista Payne a47a96b70d Squashed commit of the following:
commit 44583e224c771bab4b75758372e8b051a5346f72
Merge: 1436d8d5ef d6c47e7e81
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Tue Nov 19 12:33:34 2024 -0600

    Merge branch 'develop' into sabrecat/hourglass-afterward

commit 1436d8d5ef5b672425513e9c5886ca533594134f
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Tue Nov 19 10:44:53 2024 -0600

    fix(faq): update Hourglass explainer
2024-11-21 12:17:58 -06:00
Kalista Payne 8a94e88786 fix(migrations): correct linting errors 2024-11-21 12:07:51 -06:00
Kalista Payne b3aa236d3d 5.31.0 2024-11-21 11:52:48 -06:00
Kalista Payne 4dd58ad89e fix(event): turkey migration update 2024-11-21 11:52:11 -06:00
Weblate 317f7ab598 Translated using Weblate (French)
Currently translated at 100.0% (890 of 890 strings)

Translated using Weblate (German)

Currently translated at 92.5% (2971 of 3211 strings)

Translated using Weblate (German)

Currently translated at 97.1% (789 of 812 strings)

Translated using Weblate (German)

Currently translated at 100.0% (887 of 887 strings)

Co-authored-by: Marie Blosse--Gilbin <mbgil@hotmail.fr>
Co-authored-by: Sand <weblate@sandhydraulik.de>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translation: Habitica/Backgrounds
Translation: Habitica/Gear
Translation: Habitica/Questscontent
2024-11-21 15:59:10 +01:00
Kalista Payne d6c47e7e81 Squashed commit of the following:
commit 7de39d868b547848f8e2990a65ddca90b48f6823
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Mon Oct 14 13:05:03 2024 -0400

    gem text clickable
2024-11-19 12:09:39 -06:00
Kalista Payne 1ed61a3d3d December 2024 and Winter Wonderland 2025 build (#15358)
* feat(content): Winter 2025 build by @CuriousMagpie

* fix(content): add more WW

* fix(content): add more WW

* chore(subproj): update habitica-images

* fix(gala): December 2024 is Winter 2025

* fix(content): lint, background typo, 0 index month

* fix(content): add missing mystery set name

* fix(content): roll back erroneous month indexing

* fix(tests): no 13th month, consider releases in schedule test

* update gear strings

* fix(seasonal): show quest modal

* fix(seasonal): use category-item component

* chore(subproj): update habitica-images

---------

Co-authored-by: CuriousMagpie <eilatan@gmail.com>
2024-11-19 11:44:22 -06:00
Kalista Payne 5c734cfa00 chore(subproj): update images 2024-11-19 09:42:23 -06:00
Kalista Payne 07f485a654 chore(migrations): add subs migration 2024-11-19 09:38:05 -06:00
Kalista Payne ae76271469 5.30.0 2024-11-19 09:11:17 -06:00
Weblate c8a8ecbe1f Translated using Weblate (German)
Currently translated at 91.4% (2938 of 3211 strings)

Translated using Weblate (German)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (German)

Currently translated at 100.0% (887 of 887 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (French)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (Turkish)

Currently translated at 28.8% (70 of 243 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (393 of 393 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Turkish)

Currently translated at 57.6% (511 of 887 strings)

Translated using Weblate (Indonesian)

Currently translated at 94.1% (835 of 887 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (French)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (French)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3211 of 3211 strings)

Translated using Weblate (French)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (French)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (French)

Currently translated at 100.0% (393 of 393 strings)

Translated using Weblate (French)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (French)

Currently translated at 98.7% (240 of 243 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (French)

Currently translated at 97.1% (236 of 243 strings)

Translated using Weblate (French)

Currently translated at 97.1% (236 of 243 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (French)

Currently translated at 100.0% (887 of 887 strings)

Translated using Weblate (Slovak)

Currently translated at 51.0% (122 of 239 strings)

Translated using Weblate (Slovak)

Currently translated at 55.2% (143 of 259 strings)

Translated using Weblate (Korean)

Currently translated at 70.9% (629 of 887 strings)

Translated using Weblate (Korean)

Currently translated at 89.8% (150 of 167 strings)

Translated using Weblate (Korean)

Currently translated at 89.8% (150 of 167 strings)

Translated using Weblate (Polish)

Currently translated at 77.1% (199 of 258 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 86.9% (771 of 887 strings)

Translated using Weblate (Ukrainian)

Currently translated at 60.4% (1940 of 3211 strings)

Co-authored-by: Binny <45uipcik@duck.com>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jimly Asshiddiqy <j_mly@ymail.com>
Co-authored-by: Lapin <sirocuro01@gmail.com>
Co-authored-by: Marie Blosse--Gilbin <mbgil@hotmail.fr>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Sand <weblate@sandhydraulik.de>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Yaşar Efe Çelik <yasar.123.sevda@gmail.com>
Co-authored-by: ZELIAL <nalfetic@gmail.com>
Co-authored-by: ana <coposmit@gmail.com>
Co-authored-by: 장은서 <eunseo5207@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/id/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/es/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/es/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/sk/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Subscriber
2024-11-19 06:46:04 +01:00
Kalista Payne fbf69a4a34 Squashed commit of the following:
commit dd0a410fa6c3741dc0d6793283cf4df3c37790a5
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Nov 4 14:24:30 2024 -0600

    fix(subs): center next hourglass message

commit 72d92ffd76bb43fee8ba2bbabd211e595afbd664
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Fri Nov 1 14:17:59 2024 -0500

    fix(subs): don't hide HG preview entirely

commit ea0ecb0c3d519ed3d5c42266367eaaa7283ac5de
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Fri Nov 1 13:01:06 2024 -0500

    fix(subs): Google wording and HG escape

commit 2bd2c69e18e37c8c8c7106c62f186c372d25c5d2
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Fri Nov 1 09:25:30 2024 -0500

    fix(layout): tighten cancellation note

commit eb2fc40d24
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 24 15:41:43 2024 -0500

    fix(g1g1): don't try to find Gems promo during bogo

commit d3eea86bd7
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 24 15:00:09 2024 -0500

    fix(subs): fix typeError

commit e3ae9a2d67
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 24 13:57:27 2024 -0500

    fix(subs): also redirect to subs after gift sub

commit 690163a0de
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Oct 23 16:42:38 2024 +0200

    fix test

commit 2ad7541fc0
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Oct 23 16:34:52 2024 +0200

    fix test

commit 7e337a9e59
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Oct 23 11:54:15 2024 +0200

    remove only

commit 7462b8a57f
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Oct 23 11:51:25 2024 +0200

    fix bug with incorrectly giving HG bonus

commit acd6183e95
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Oct 21 17:22:26 2024 -0500

    fix(subs): unhovery and un-12-monthy

commit 935e9fd6ec
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Fri Oct 18 14:50:17 2024 -0500

    fix(subs): try again on gifts

commit 6e1fb7df38
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 17 18:19:20 2024 -0500

    fix(lint): do negate object ig

commit 71d434b94e
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 17 18:15:11 2024 -0500

    fix(lint): unnecessary ternary

commit b90b0bb9c3
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 17 17:34:24 2024 -0500

    fix(subs): gifts DON't renew

commit 19469304c5
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 17 17:13:29 2024 -0500

    fix(subs): pass autoRenews through Stripe

commit 6819e7b7e5
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 17 16:03:25 2024 -0500

    fix(subscriptions): minor visual updates

commit 74633b5e5e
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Oct 16 17:27:09 2024 -0500

    fix(subscriptions): more gift layout revisions

commit a90ccb89de
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Oct 16 15:37:50 2024 -0500

    fix(subscription): update layout when gifting

commit c24b2db8dc
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Oct 14 16:11:46 2024 +0200

    fix issue with promo hourglasses

commit 7a61c72b47
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Oct 14 15:59:40 2024 +0200

    don’t give additional HG for new sub if they already got one this month

commit f14cb09026
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Oct 14 10:38:01 2024 +0200

    Admin panel display fixes

commit f4cff698cf
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 3 17:58:59 2024 -0500

    fix(stripe): correct redirect after success

commit c468b58f3f
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Oct 3 17:35:37 2024 -0500

    fix(subs): correct border-radius and redirect

commit 78fb9e31d6
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Oct 2 17:41:49 2024 -0500

    fix(css): correct and refactor heights and selection states

commit e2babe8053
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Sep 30 16:45:29 2024 -0500

    feat(subscription): max Gems progress readout

commit 61af8302a3
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Sep 27 15:11:22 2024 +0200

    fix test

commit ef8ff0ea9e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Sep 27 14:14:44 2024 +0200

    show date for hourglass bonus if it was received

commit 4bafafdc8d
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Sep 27 14:12:52 2024 +0200

    add new field for cumulative subscription count

commit 30096247b7
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Sep 27 13:39:49 2024 +0200

    fix missing transaction type

commit 70872651b0
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Sep 27 13:31:40 2024 +0200

    fix admin panel strings

commit f3398db65f
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Thu Sep 26 23:11:16 2024 -0500

    WIP(subs): extant Stripe state

commit c6b2020109
Author: Phillip Thelen <phillip@habitica.com>
Date:   Thu Sep 26 11:41:55 2024 +0200

    fix admin panel display

commit d9afc96d2d
Author: Phillip Thelen <phillip@habitica.com>
Date:   Thu Sep 26 11:40:16 2024 +0200

    Fix hourglass logic for upgrades

commit 6e2c8eeb64
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Sep 25 17:48:54 2024 +0200

    fix hourglass count

commit cd752fbdce
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Fri Sep 20 12:24:21 2024 -0500

    WIP(frontend): draft of main subs page view

commit 0102b29d59
Author: Kalista Payne <sabe@habitica.com>
Date:   Wed Sep 18 15:29:08 2024 -0500

    fix(admin): correct logic and style for shrimple subs

commit 5469a5c5c3
Author: Kalista Payne <sabe@habitica.com>
Date:   Wed Sep 18 15:07:36 2024 -0500

    fix(test): short circuit this.

commit 526193ee6c
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Sep 18 14:42:06 2024 +0200

    fix gem limit

commit 19cf1636aa
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Aug 13 17:00:40 2024 +0200

    return nextHourglassDate again

commit eea36e3ed5
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Aug 13 13:11:22 2024 +0200

    subscription test improvements

commit ca78e74330
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 12 15:46:15 2024 +0200

    add more subscription tests

commit f4c4f93a08
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 9 13:35:22 2024 +0200

    finish basic implementation of new logic

commit e036742048
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 9 11:37:44 2024 +0200

    cleanup

commit 6431865688
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Aug 7 05:41:18 2024 -0400

    update cron tests

commit 930d875ae9
Author: Phillip Thelen <phillip@habitica.com>
Date:   Thu Aug 8 10:36:50 2024 +0200

    begin refactoring

commit 96623608d0
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Aug 6 16:28:16 2024 +0200

    begin removing obsolete tests
2024-11-14 12:31:57 -06:00
Kalista Payne 7f38ffe676 5.29.3 2024-11-12 11:52:41 -06:00
Kalista Payne a0e0c392e9 chore(subproj): update habitica-images 2024-11-12 11:52:37 -06:00
Kalista Payne 573e472077 fix(faq): minor line edits 2024-11-07 14:42:05 -06:00
Kalista Payne 955d22278d Sabrecat/hourglass preview (#15355)
* feat(subscriptions): pre rollout announcement

* fix(faq): more h4 and p, less ul li

* fix(faq): a little less purple

* fix(subs): update change preview date
2024-11-07 12:14:29 -06:00
Kalista Payne 171ee93108 chore(subproj): update images 2024-11-07 11:36:57 -06:00
Kalista Payne 5fb0560f0b fix(migration): updateOne 2024-10-30 11:13:23 -05:00
Kalista Payne 88b616e206 5.29.2 2024-10-30 08:48:01 -05:00
Kalista Payne 08829425cb feat(event): notifications for Habitoween 2024 2024-10-30 08:47:57 -05:00
Kalista Payne 1dbd2bf0dc 5.29.1 2024-10-29 12:27:02 -05:00
Weblate 157f98b331 Translated using Weblate (Bulgarian)
Currently translated at 53.7% (1725 of 3211 strings)

Translated using Weblate (Bulgarian)

Currently translated at 12.2% (23 of 188 strings)

Translated using Weblate (German)

Currently translated at 94.0% (764 of 812 strings)

Translated using Weblate (French)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3211 of 3211 strings)

Translated using Weblate (French)

Currently translated at 99.7% (3203 of 3211 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Polish)

Currently translated at 98.8% (165 of 167 strings)

Translated using Weblate (Russian)

Currently translated at 34.0% (64 of 188 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (238 of 238 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3211 of 3211 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (393 of 393 strings)

Translated using Weblate (French)

Currently translated at 99.7% (885 of 887 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (887 of 887 strings)

Translated using Weblate (Polish)

Currently translated at 98.2% (164 of 167 strings)

Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Paulina Pogorzelska <trebusze@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Yanis Rafi <yanis.rafi89@gmail.com>
Co-authored-by: immam <immament@gmail.com>
Co-authored-by: razil <boss.razmarin@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/character/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Questscontent
Translation: Habitica/Subscriber
2024-10-29 14:27:17 +01:00
Natalie 3d689837d6 Fix: Select class modal now shows base items (#15335)
* select class modal now shows base items, some spacing fixes

* update margin unit

* another smol fix

* two smol CSS updates

* em to rem

* margin update
2024-10-28 14:08:31 -05:00
Phillip Thelen 2b76bbe0db don’t filter mystery sets from mobile content (#15348) 2024-10-28 14:07:31 -05:00
Kalista Payne e75db79b50 5.29.0 2024-10-24 15:56:42 -05:00
Kalista Payne 60919671ea chore(git): update subproject 2024-10-24 15:56:36 -05:00
Weblate bca21c1cf0 Merge branch 'origin/develop' into Weblate. 2024-10-24 22:51:43 +02:00
Natalie f1993db0fa November Content Update (#15342)
* add sprites

* November 2024 Content Release

* update November content

* chore(git): reset spritesheet

* updated spritesheet

* fix(backgrounds): typo

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2024-10-23 09:49:35 -05:00
Natalie 7351c16578 Update Puppy adjective (#15344)
* update armorArmoireBasketballUniformNotes to correct stat display

* correct typo in Puppy pet adjective

---------

Co-authored-by: Sabe Jones <sabe@habitica.com>
2024-10-23 09:46:56 -05:00
Weblate 5bc8f5dd64 Translated using Weblate (Korean)
Currently translated at 93.8% (107 of 114 strings)

Translated using Weblate (Korean)

Currently translated at 76.3% (620 of 812 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 12.2% (23 of 188 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (393 of 393 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (884 of 884 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Italian)

Currently translated at 90.6% (2902 of 3201 strings)

Translated using Weblate (Italian)

Currently translated at 99.7% (882 of 884 strings)

Co-authored-by: Changwook Kang <rkdrns417@naver.com>
Co-authored-by: Emily Brown <mockingjay.ballad@gmail.com>
Co-authored-by: Omar Bertolla <scaram@icloud.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/character/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/content/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/death/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ko/
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Pets
Translation: Habitica/Questscontent
2024-10-22 11:32:23 +02:00
166 changed files with 4101 additions and 2535 deletions
@@ -0,0 +1,115 @@
/* eslint-disable no-console */
const MIGRATION_NAME = '20241119_gem_caps_hourglasses';
import { model as User } from '../../../website/server/models/user';
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count += 1;
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
const { consecutive, customerId, dateTerminated, planId } = user.purchased.plan;
const isRecurring = customerId !== 'Gift' && !dateTerminated;
const updateOp = {
$set: {
migration: MIGRATION_NAME,
'purchased.plan.consecutive.gemCapExtra': Math.max(2 * Math.ceil((consecutive.gemCapExtra + 1) / 2, 26)),
},
$inc: {},
};
let hourglassBonus = 0;
if (isRecurring) {
await user.updateBalance(
5,
'admin_update_balance',
'',
'Subscription Reward Migration',
);
updateOp.$inc.balance = 5;
switch (planId) {
case 'basic':
case 'basic_earned':
case 'group_plan_auto':
hourglassBonus = 2;
break;
case 'basic_3mo':
case 'basic_6mo':
case 'google_6mo':
hourglassBonus = 4;
break;
case 'basic_12mo':
hourglassBonus = 12;
updateOp.$set['purchased.plan.hourglassPromoReceived'] = new Date();
break;
default:
hourglassBonus = 0;
}
if (hourglassBonus) {
updateOp.$inc['purchased.plan.consecutive.trinkets'] = hourglassBonus;
await user.updateHourglasses(
hourglassBonus,
'admin_update_balance',
'',
'Subscription Reward Migration',
);
}
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_subscriber_reward',
title: 'Thanks for being a subscriber!',
text: 'Enjoy these extra Mystic Hourglasses and Gems to celebrate our new benefits.',
},
seen: false,
},
};
}
return await User.updateOne(
{ _id: user._id },
updateOp,
).exec();
}
export default async function processUsers () {
let query = {
migration: { $ne: MIGRATION_NAME },
'purchased.plan.customerId': { $exists: true },
$or: [
{ 'purchased.plan.dateTerminated': { $exists: false } },
{ 'purchased.plan.dateTerminated': null },
{ 'purchased.plan.dateTerminated': { $gt: new Date() } },
],
};
const fields = {
_id: 1,
purchased: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({_id: 1})
.select(fields)
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1],
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
};
+175
View File
@@ -0,0 +1,175 @@
/*
* Award Habitoween ladder items to participants in this month's Habitoween festivities
*/
/* eslint-disable no-console */
import { model as User } from '../../website/server/models/user';
const MIGRATION_NAME = '20241030_habitoween_ladder'; // Update when running in future years
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count += 1;
const set = { migration: MIGRATION_NAME };
const inc = {
'items.food.Candy_Skeleton': 1,
'items.food.Candy_Base': 1,
'items.food.Candy_CottonCandyBlue': 1,
'items.food.Candy_CottonCandyPink': 1,
'items.food.Candy_Shade': 1,
'items.food.Candy_White': 1,
'items.food.Candy_Golden': 1,
'items.food.Candy_Zombie': 1,
'items.food.Candy_Desert': 1,
'items.food.Candy_Red': 1,
};
const push = { notifications: { $each: [] } };
if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-RoyalPurple']) {
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_candy',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-RoyalPurple']) {
set['items.mounts.JackOLantern-RoyalPurple'] = true;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_purple_mount',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Royal Purple Jack-O-Lantern Mount and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Glow']) {
set['items.pets.JackOLantern-RoyalPurple'] = 5;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_purple_pet',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Royal Purple Jack-O-Lantern Pet and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Glow']) {
set['items.mounts.JackOLantern-Glow'] = true;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_glow_mount',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Glow-in-the-Dark Jack-O-Lantern Mount and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Ghost']) {
set['items.pets.JackOLantern-Glow'] = 5;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_glow_pet',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Glow-in-the-Dark Jack-O-Lantern Pet and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Ghost']) {
set['items.mounts.JackOLantern-Ghost'] = true;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_ghost_mount',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Ghost Jack-O-Lantern Mount and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Base']) {
set['items.pets.JackOLantern-Ghost'] = 5;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_ghost_pet',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Ghost Jack-O-Lantern Pet and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Base']) {
set['items.mounts.JackOLantern-Base'] = true;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_base_mount',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Jack-O-Lantern Mount and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
} else {
set['items.pets.JackOLantern-Base'] = 5;
push.notifications.$each.push({
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_habitoween_base_pet',
title: 'Happy Habitoween!',
text: 'For this spooky celebration, you\'ve received a Jack-O-Lantern Pet and an assortment of candy for your Pets!',
destination: '/inventory/stable',
},
seen: false,
});
}
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
return User.updateOne({ _id: user._id }, { $inc: inc, $push: push, $set: set }).exec();
}
export default async function processUsers () {
const query = {
migration: { $ne: MIGRATION_NAME },
'auth.timestamps.loggedin': { $gt: new Date('2024-10-01') },
};
const fields = {
_id: 1,
items: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({ _id: 1 })
.select(fields)
.lean()
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1],
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
}
+167
View File
@@ -0,0 +1,167 @@
/* eslint-disable no-console */
import { model as User } from '../../website/server/models/user';
const MIGRATION_NAME = '20241120_harvest_feast';
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count += 1;
const updateOp = {
$set: { migration: MIGRATION_NAME },
};
if (typeof user.items.gear.owned.head_special_turkeyHelmGilded !== 'undefined') {
updateOp.$inc = {
'items.food.Pie_Base': 1,
'items.food.Pie_CottonCandyBlue': 1,
'items.food.Pie_CottonCandyPink': 1,
'items.food.Pie_Desert': 1,
'items.food.Pie_Golden': 1,
'items.food.Pie_Red': 1,
'items.food.Pie_Shade': 1,
'items.food.Pie_Skeleton': 1,
'items.food.Pie_Zombie': 1,
'items.food.Pie_White': 1,
};
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_harvestfeast_pie',
title: 'Happy Harvest Feast!',
text: 'Gobble gobble, you\'ve received an assortment of pie for your Pets!',
destination: '/inventory/stable',
},
seen: false,
},
};
} else if (typeof user.items.gear.owned.armor_special_turkeyArmorBase !== 'undefined') {
updateOp.$set['items.gear.owned.head_special_turkeyHelmGilded'] = true;
updateOp.$set['items.gear.owned.armor_special_turkeyArmorGilded'] = true;
updateOp.$set['items.gear.owned.back_special_turkeyTailGilded'] = true;
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_harvestfeast_gilded_set',
title: 'Happy Harvest Feast!',
text: 'Gobble gobble, you\'ve received the Gilded Turkey Armor, Helm, and Tail!',
destination: '/inventory/equipment',
},
seen: false,
},
};
} else if (user.items && user.items.mounts && user.items.mounts['Turkey-Gilded']) {
updateOp.$set['items.gear.owned.head_special_turkeyHelmBase'] = true;
updateOp.$set['items.gear.owned.armor_special_turkeyArmorBase'] = true;
updateOp.$set['items.gear.owned.back_special_turkeyTailBase'] = true;
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_harvestfeast_base_set',
title: 'Happy Harvest Feast!',
text: 'Gobble gobble, you\'ve received the Turkey Armor, Helm, and Tail!',
destination: '/inventory/equipment',
},
seen: false,
},
};
} else if (user.items && user.items.pets && user.items.pets['Turkey-Gilded']) {
updateOp.$set['items.mounts.Turkey-Gilded'] = true;
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_harvestfeast_gilded_mount',
title: 'Happy Harvest Feast!',
text: 'Gobble gobble, you\'ve received the Gilded Turkey Mount!',
destination: '/inventory/stable',
},
seen: false,
},
};
} else if (user.items && user.items.mounts && user.items.mounts['Turkey-Base']) {
updateOp.$set['items.pets.Turkey-Gilded'] = 5;
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_harvestfeast_gilded_pet',
title: 'Happy Harvest Feast!',
text: 'Gobble gobble, you\'ve received the Gilded Turkey Pet!',
destination: '/inventory/stable',
},
seen: false,
},
};
} else if (user.items && user.items.pets && user.items.pets['Turkey-Base']) {
updateOp.$set['items.mounts.Turkey-Base'] = true;
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_harvestfeast_base_mount',
title: 'Happy Harvest Feast!',
text: 'Gobble gobble, you\'ve received the Turkey Mount!',
destination: '/inventory/stable',
},
seen: false,
},
};
} else {
updateOp.$set['items.pets.Turkey-Base'] = 5;
updateOp.$push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_harvestfeast_base_pet',
title: 'Happy Harvest Feast!',
text: 'Gobble gobble, you\'ve received the Turkey Pet!',
destination: '/inventory/stable',
},
seen: false,
},
};
}
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
return User.updateOne({ _id: user._id }, updateOp).exec();
}
export default async function processUsers () {
const query = {
migration: { $ne: MIGRATION_NAME },
'auth.timestamps.loggedin': { $gt: new Date('2024-10-20') },
};
const fields = {
_id: 1,
items: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({ _id: 1 })
.select(fields)
.lean()
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1],
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
}
+6 -6
View File
@@ -1,12 +1,12 @@
{
"name": "habitica",
"version": "5.28.9",
"version": "5.31.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "habitica",
"version": "5.28.9",
"version": "5.31.1",
"hasInstallScript": true,
"dependencies": {
"@babel/core": "^7.22.10",
@@ -92,7 +92,7 @@
"chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0",
"chalk": "^5.3.0",
"cross-spawn": "^7.0.3",
"cross-spawn": "^7.0.5",
"mocha": "^5.1.1",
"monk": "^7.3.4",
"nyc": "^15.1.0",
@@ -7500,9 +7500,9 @@
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
"integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.28.9",
"version": "5.31.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.22.10",
@@ -120,7 +120,7 @@
"chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0",
"chalk": "^5.3.0",
"cross-spawn": "^7.0.3",
"cross-spawn": "^7.0.5",
"mocha": "^5.1.1",
"monk": "^7.3.4",
"nyc": "^15.1.0",
-1
View File
@@ -44,7 +44,6 @@ describe('bug-report', () => {
USER_HOURGLASSES: 0,
USER_ID: userId,
USER_LEVEL: 1,
USER_OFFSET_MONTHS: 0,
USER_PAYMENT_PLATFORM: undefined,
USER_SUBSCRIPTION: undefined,
USER_TIMEZONE_OFFSET: 0,
+52 -463
View File
@@ -154,6 +154,14 @@ describe('cron', async () => {
expect(user.purchased.plan.consecutive.count).to.equal(1);
});
it('increments plan.cumulativeCount', async () => {
user.purchased.plan.cumulativeCount = 0;
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.cumulativeCount).to.equal(1);
});
it('increments plan.consecutive.count by more than 1 if user skipped months between logins', async () => {
user.purchased.plan.dateUpdated = moment().subtract(2, 'months').toDate();
user.purchased.plan.consecutive.count = 0;
@@ -163,12 +171,13 @@ describe('cron', async () => {
expect(user.purchased.plan.consecutive.count).to.equal(2);
});
it('decrements plan.consecutive.offset when offset is greater than 0', async () => {
user.purchased.plan.consecutive.offset = 2;
it('increments plan.cumulativeCount by more than 1 if user skipped months between logins', async () => {
user.purchased.plan.dateUpdated = moment().subtract(3, 'months').toDate();
user.purchased.plan.cumulativeCount = 0;
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.consecutive.offset).to.equal(1);
expect(user.purchased.plan.cumulativeCount).to.equal(3);
});
it('does not award unearned plan.consecutive.trinkets if subscription ended during an absence', async () => {
@@ -185,12 +194,12 @@ describe('cron', async () => {
});
it('does not increment plan.consecutive.gemCapExtra when user has reached the gemCap limit', async () => {
user.purchased.plan.consecutive.gemCapExtra = 25;
user.purchased.plan.consecutive.gemCapExtra = 26;
user.purchased.plan.consecutive.count = 5;
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(25);
expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(26);
});
it('does not reset plan stats if we are before the last day of the cancelled month', async () => {
@@ -205,16 +214,14 @@ describe('cron', async () => {
user.purchased.plan.dateTerminated = moment(new Date()).subtract({ days: 1 });
user.purchased.plan.consecutive.gemCapExtra = 20;
user.purchased.plan.consecutive.count = 5;
user.purchased.plan.consecutive.offset = 1;
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.customerId).to.not.exist;
expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(0);
expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(20);
expect(user.purchased.plan.consecutive.count).to.equal(0);
expect(user.purchased.plan.consecutive.offset).to.equal(0);
});
describe('for a 1-month recurring subscription', async () => {
@@ -236,13 +243,11 @@ describe('cron', async () => {
user1.purchased.plan.dateUpdated = moment().toDate();
user1.purchased.plan.planId = 'basic';
user1.purchased.plan.consecutive.count = 0;
user1.purchased.plan.perkMonthCount = 0;
user1.purchased.plan.consecutive.offset = 0;
user1.purchased.plan.consecutive.trinkets = 0;
user1.purchased.plan.consecutive.trinkets = 1;
user1.purchased.plan.consecutive.gemCapExtra = 0;
});
it('does not increment consecutive benefits after the first month', async () => {
it('increments consecutive benefits', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(1, 'months')
.add(2, 'days')
.toDate());
@@ -253,75 +258,8 @@ describe('cron', async () => {
user: user1, tasksByType, daysMissed, analytics,
});
expect(user1.purchased.plan.consecutive.count).to.equal(1);
expect(user1.purchased.plan.consecutive.offset).to.equal(0);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(0);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(0);
});
it('does not increment consecutive benefits after the second month', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(2, 'months')
.add(2, 'days')
.toDate());
// Add 1 month to simulate what happens a month after the subscription was created.
// Add 2 days so that we're sure we're not affected by any start-of-month effects
// e.g., from time zone oddness.
await cron({
user: user1, tasksByType, daysMissed, analytics,
});
expect(user1.purchased.plan.consecutive.count).to.equal(2);
expect(user1.purchased.plan.consecutive.offset).to.equal(0);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(0);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(0);
});
it('increments consecutive benefits after the second month if they also received a 1 month gift subscription', async () => {
user1.purchased.plan.perkMonthCount = 1;
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(2, 'months')
.add(2, 'days')
.toDate());
// Add 1 month to simulate what happens a month after the subscription was created.
// Add 2 days so that we're sure we're not affected by any start-of-month effects
// e.g., from time zone oddness.
await cron({
user: user1, tasksByType, daysMissed, analytics,
});
expect(user1.purchased.plan.perkMonthCount).to.equal(0);
expect(user1.purchased.plan.consecutive.count).to.equal(2);
expect(user1.purchased.plan.consecutive.offset).to.equal(0);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(5);
});
it('increments consecutive benefits after the third month', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(3, 'months')
.add(2, 'days')
.toDate());
// Add 1 month to simulate what happens a month after the subscription was created.
// Add 2 days so that we're sure we're not affected by any start-of-month effects
// e.g., from time zone oddness.
await cron({
user: user1, tasksByType, daysMissed, analytics,
});
expect(user1.purchased.plan.consecutive.count).to.equal(3);
expect(user1.purchased.plan.consecutive.offset).to.equal(0);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(5);
});
it('does not increment consecutive benefits after the fourth month', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(4, 'months')
.add(2, 'days')
.toDate());
// Add 1 month to simulate what happens a month after the subscription was created.
// Add 2 days so that we're sure we're not affected by any start-of-month effects
// e.g., from time zone oddness.
await cron({
user: user1, tasksByType, daysMissed, analytics,
});
expect(user1.purchased.plan.consecutive.count).to.equal(4);
expect(user1.purchased.plan.consecutive.offset).to.equal(0);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(5);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(2);
});
it('increments consecutive benefits correctly if user has been absent with continuous subscription', async () => {
@@ -332,33 +270,8 @@ describe('cron', async () => {
user: user1, tasksByType, daysMissed, analytics,
});
expect(user1.purchased.plan.consecutive.count).to.equal(10);
expect(user1.purchased.plan.consecutive.offset).to.equal(0);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(3);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(15);
});
it('initializes plan.perkMonthCount if necessary', async () => {
user.purchased.plan.perkMonthCount = undefined;
clock = sinon.useFakeTimers(moment(user.purchased.plan.dateUpdated)
.utcOffset(0)
.startOf('month')
.add(1, 'months')
.add(2, 'days')
.toDate());
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.perkMonthCount).to.equal(1);
user.purchased.plan.perkMonthCount = undefined;
user.purchased.plan.consecutive.count = 8;
clock.restore();
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(2, 'months')
.add(2, 'days')
.toDate());
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.perkMonthCount).to.equal(2);
expect(user1.purchased.plan.consecutive.trinkets).to.equal(11);
expect(user1.purchased.plan.consecutive.gemCapExtra).to.equal(20);
});
});
@@ -379,14 +292,12 @@ describe('cron', async () => {
user3.purchased.plan.customerId = 'subscribedId';
user3.purchased.plan.dateUpdated = moment().toDate();
user3.purchased.plan.planId = 'basic_3mo';
user3.purchased.plan.perkMonthCount = 0;
user3.purchased.plan.consecutive.count = 0;
user3.purchased.plan.consecutive.offset = 3;
user3.purchased.plan.consecutive.trinkets = 1;
user3.purchased.plan.consecutive.gemCapExtra = 5;
user3.purchased.plan.consecutive.gemCapExtra = 0;
});
it('does not increment consecutive benefits in the first month of the first paid period that they already have benefits for', async () => {
it('increments consecutive benefits', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(1, 'months')
.add(2, 'days')
.toDate());
@@ -394,102 +305,8 @@ describe('cron', async () => {
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(1);
expect(user3.purchased.plan.consecutive.offset).to.equal(2);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(5);
});
it('does not increment consecutive benefits in the middle of the period that they already have benefits for', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(2, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(2);
expect(user3.purchased.plan.consecutive.offset).to.equal(1);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(5);
});
it('does not increment consecutive benefits in the final month of the period that they already have benefits for', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(3, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(3);
expect(user3.purchased.plan.consecutive.offset).to.equal(0);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(5);
});
it('increments consecutive benefits the month after the second paid period has started', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(4, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(4);
expect(user3.purchased.plan.consecutive.offset).to.equal(2);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(10);
});
it('keeps existing plan.perkMonthCount intact when incrementing consecutive benefits', async () => {
user3.purchased.plan.perkMonthCount = 2;
user3.purchased.plan.consecutive.trinkets = 1;
user3.purchased.plan.consecutive.gemCapExtra = 5;
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(4, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.perkMonthCount).to.equal(2);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(10);
});
it('does not increment consecutive benefits in the second month of the second period that they already have benefits for', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(5, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(5);
expect(user3.purchased.plan.consecutive.offset).to.equal(1);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(10);
});
it('does not increment consecutive benefits in the final month of the second period that they already have benefits for', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(6, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(6);
expect(user3.purchased.plan.consecutive.offset).to.equal(0);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(10);
});
it('increments consecutive benefits the month after the third paid period has started', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(7, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(7);
expect(user3.purchased.plan.consecutive.offset).to.equal(2);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(3);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(15);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(2);
});
it('increments consecutive benefits correctly if user has been absent with continuous subscription', async () => {
@@ -500,8 +317,7 @@ describe('cron', async () => {
user: user3, tasksByType, daysMissed, analytics,
});
expect(user3.purchased.plan.consecutive.count).to.equal(10);
expect(user3.purchased.plan.consecutive.offset).to.equal(2);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(4);
expect(user3.purchased.plan.consecutive.trinkets).to.equal(11);
expect(user3.purchased.plan.consecutive.gemCapExtra).to.equal(20);
});
});
@@ -523,14 +339,12 @@ describe('cron', async () => {
user6.purchased.plan.customerId = 'subscribedId';
user6.purchased.plan.dateUpdated = moment().toDate();
user6.purchased.plan.planId = 'google_6mo';
user6.purchased.plan.perkMonthCount = 0;
user6.purchased.plan.consecutive.count = 0;
user6.purchased.plan.consecutive.offset = 6;
user6.purchased.plan.consecutive.trinkets = 2;
user6.purchased.plan.consecutive.gemCapExtra = 10;
user6.purchased.plan.consecutive.trinkets = 1;
user6.purchased.plan.consecutive.gemCapExtra = 0;
});
it('does not increment consecutive benefits in the first month of the first paid period that they already have benefits for', async () => {
it('increments benefits', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(1, 'months')
.add(2, 'days')
.toDate());
@@ -538,74 +352,8 @@ describe('cron', async () => {
user: user6, tasksByType, daysMissed, analytics,
});
expect(user6.purchased.plan.consecutive.count).to.equal(1);
expect(user6.purchased.plan.consecutive.offset).to.equal(5);
expect(user6.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(10);
});
it('does not increment consecutive benefits in the final month of the period that they already have benefits for', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(6, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6, tasksByType, daysMissed, analytics,
});
expect(user6.purchased.plan.consecutive.count).to.equal(6);
expect(user6.purchased.plan.consecutive.offset).to.equal(0);
expect(user6.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(10);
});
it('increments consecutive benefits the month after the second paid period has started', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(7, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6, tasksByType, daysMissed, analytics,
});
expect(user6.purchased.plan.consecutive.count).to.equal(7);
expect(user6.purchased.plan.consecutive.offset).to.equal(5);
expect(user6.purchased.plan.consecutive.trinkets).to.equal(4);
expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(20);
});
it('keeps existing plan.perkMonthCount intact when incrementing consecutive benefits', async () => {
user6.purchased.plan.perkMonthCount = 2;
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(7, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6, tasksByType, daysMissed, analytics,
});
expect(user6.purchased.plan.perkMonthCount).to.equal(2);
expect(user6.purchased.plan.consecutive.trinkets).to.equal(4);
expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(20);
});
it('increments consecutive benefits the month after the third paid period has started', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(13, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6, tasksByType, daysMissed, analytics,
});
expect(user6.purchased.plan.consecutive.count).to.equal(13);
expect(user6.purchased.plan.consecutive.offset).to.equal(5);
expect(user6.purchased.plan.consecutive.trinkets).to.equal(6);
expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(25);
});
it('increments consecutive benefits correctly if user has been absent with continuous subscription', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(19, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6, tasksByType, daysMissed, analytics,
});
expect(user6.purchased.plan.consecutive.count).to.equal(19);
expect(user6.purchased.plan.consecutive.offset).to.equal(5);
expect(user6.purchased.plan.consecutive.trinkets).to.equal(8);
expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(25);
expect(user6.purchased.plan.consecutive.gemCapExtra).to.equal(2);
});
});
@@ -626,11 +374,10 @@ describe('cron', async () => {
user12.purchased.plan.dateUpdated = moment().toDate();
user12.purchased.plan.planId = 'basic_12mo';
user12.purchased.plan.consecutive.count = 0;
user12.purchased.plan.consecutive.offset = 12;
user12.purchased.plan.consecutive.trinkets = 4;
user12.purchased.plan.consecutive.gemCapExtra = 20;
user12.purchased.plan.consecutive.trinkets = 1;
user12.purchased.plan.consecutive.gemCapExtra = 26;
it('does not increment consecutive benefits in the first month of the first paid period that they already have benefits for', async () => {
it('increments consecutive benefits the month after the second paid period has started', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(1, 'months')
.add(2, 'days')
.toDate());
@@ -638,61 +385,20 @@ describe('cron', async () => {
user: user12, tasksByType, daysMissed, analytics,
});
expect(user12.purchased.plan.consecutive.count).to.equal(1);
expect(user12.purchased.plan.consecutive.offset).to.equal(11);
expect(user12.purchased.plan.consecutive.trinkets).to.equal(4);
expect(user12.purchased.plan.consecutive.gemCapExtra).to.equal(20);
});
it('does not increment consecutive benefits in the final month of the period that they already have benefits for', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(12, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user12, tasksByType, daysMissed, analytics,
});
expect(user12.purchased.plan.consecutive.count).to.equal(12);
expect(user12.purchased.plan.consecutive.offset).to.equal(0);
expect(user12.purchased.plan.consecutive.trinkets).to.equal(4);
expect(user12.purchased.plan.consecutive.gemCapExtra).to.equal(20);
});
it('increments consecutive benefits the month after the second paid period has started', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(13, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user12, tasksByType, daysMissed, analytics,
});
expect(user12.purchased.plan.consecutive.count).to.equal(13);
expect(user12.purchased.plan.consecutive.offset).to.equal(11);
expect(user12.purchased.plan.consecutive.trinkets).to.equal(8);
expect(user12.purchased.plan.consecutive.gemCapExtra).to.equal(25);
});
it('increments consecutive benefits the month after the third paid period has started', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(25, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user12, tasksByType, daysMissed, analytics,
});
expect(user12.purchased.plan.consecutive.count).to.equal(25);
expect(user12.purchased.plan.consecutive.offset).to.equal(11);
expect(user12.purchased.plan.consecutive.trinkets).to.equal(12);
expect(user12.purchased.plan.consecutive.gemCapExtra).to.equal(25);
expect(user12.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user12.purchased.plan.consecutive.gemCapExtra).to.equal(26);
});
it('increments consecutive benefits correctly if user has been absent with continuous subscription', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(37, 'months')
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(10, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user12, tasksByType, daysMissed, analytics,
});
expect(user12.purchased.plan.consecutive.count).to.equal(37);
expect(user12.purchased.plan.consecutive.offset).to.equal(11);
expect(user12.purchased.plan.consecutive.trinkets).to.equal(16);
expect(user12.purchased.plan.consecutive.gemCapExtra).to.equal(25);
expect(user12.purchased.plan.consecutive.count).to.equal(10);
expect(user12.purchased.plan.consecutive.trinkets).to.equal(11);
expect(user12.purchased.plan.consecutive.gemCapExtra).to.equal(26);
});
});
@@ -715,11 +421,11 @@ describe('cron', async () => {
.toDate();
user3g.purchased.plan.planId = null;
user3g.purchased.plan.consecutive.count = 0;
user3g.purchased.plan.consecutive.offset = 3;
user3g.purchased.plan.cumulativeCount = 0;
user3g.purchased.plan.consecutive.trinkets = 1;
user3g.purchased.plan.consecutive.gemCapExtra = 5;
user3g.purchased.plan.consecutive.gemCapExtra = 0;
it('does not increment consecutive benefits in the first month of the gift subscription', async () => {
it('increments benefits', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(1, 'months')
.add(2, 'days')
.toDate());
@@ -727,35 +433,9 @@ describe('cron', async () => {
user: user3g, tasksByType, daysMissed, analytics,
});
expect(user3g.purchased.plan.consecutive.count).to.equal(1);
expect(user3g.purchased.plan.consecutive.offset).to.equal(2);
expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user3g.purchased.plan.consecutive.gemCapExtra).to.equal(5);
});
it('does not increment consecutive benefits in the second month of the gift subscription', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(2, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3g, tasksByType, daysMissed, analytics,
});
expect(user3g.purchased.plan.consecutive.count).to.equal(2);
expect(user3g.purchased.plan.consecutive.offset).to.equal(1);
expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user3g.purchased.plan.consecutive.gemCapExtra).to.equal(5);
});
it('does not increment consecutive benefits in the third month of the gift subscription', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(3, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user3g, tasksByType, daysMissed, analytics,
});
expect(user3g.purchased.plan.consecutive.count).to.equal(3);
expect(user3g.purchased.plan.consecutive.offset).to.equal(0);
expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user3g.purchased.plan.consecutive.gemCapExtra).to.equal(5);
expect(user3g.purchased.plan.cumulativeCount).to.equal(1);
expect(user3g.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user3g.purchased.plan.consecutive.gemCapExtra).to.equal(2);
});
it('does not increment consecutive benefits in the month after the gift subscription has ended', async () => {
@@ -767,84 +447,9 @@ describe('cron', async () => {
});
// subscription has been erased by now
expect(user3g.purchased.plan.consecutive.count).to.equal(0);
expect(user3g.purchased.plan.consecutive.offset).to.equal(0);
expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1);
expect(user3g.purchased.plan.consecutive.gemCapExtra).to.equal(0); // erased
});
});
describe('for a 6-month recurring subscription where the user has incorrect consecutive month data from prior bugs', async () => {
const user6x = new User({
auth: {
local: {
username: 'username6x',
lowerCaseUsername: 'username6x',
email: 'email6x@example.com',
salt: 'salt',
hashed_password: 'hashed_password', // eslint-disable-line camelcase
},
},
});
// user6x has a 6-month recurring subscription starting 8 months in the past
// before issue #4819 was fixed
user6x.purchased.plan.customerId = 'subscribedId';
user6x.purchased.plan.dateUpdated = moment().toDate();
user6x.purchased.plan.planId = 'basic_6mo';
user6x.purchased.plan.consecutive.count = 8;
user6x.purchased.plan.consecutive.offset = 0;
user6x.purchased.plan.consecutive.trinkets = 3;
user6x.purchased.plan.consecutive.gemCapExtra = 15;
it('increments consecutive benefits in the first month since the fix for #4819 goes live', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(1, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6x, tasksByType, daysMissed, analytics,
});
expect(user6x.purchased.plan.consecutive.count).to.equal(9);
expect(user6x.purchased.plan.consecutive.offset).to.equal(5);
expect(user6x.purchased.plan.consecutive.trinkets).to.equal(5);
expect(user6x.purchased.plan.consecutive.gemCapExtra).to.equal(25);
});
it('does not increment consecutive benefits in the second month after the fix goes live', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(2, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6x, tasksByType, daysMissed, analytics,
});
expect(user6x.purchased.plan.consecutive.count).to.equal(10);
expect(user6x.purchased.plan.consecutive.offset).to.equal(4);
expect(user6x.purchased.plan.consecutive.trinkets).to.equal(5);
expect(user6x.purchased.plan.consecutive.gemCapExtra).to.equal(25);
});
it('does not increment consecutive benefits in the third month after the fix goes live', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(3, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6x, tasksByType, daysMissed, analytics,
});
expect(user6x.purchased.plan.consecutive.count).to.equal(11);
expect(user6x.purchased.plan.consecutive.offset).to.equal(3);
expect(user6x.purchased.plan.consecutive.trinkets).to.equal(5);
expect(user6x.purchased.plan.consecutive.gemCapExtra).to.equal(25);
});
it('increments consecutive benefits in the seventh month after the fix goes live', async () => {
clock = sinon.useFakeTimers(moment().utcOffset(0).startOf('month').add(7, 'months')
.add(2, 'days')
.toDate());
await cron({
user: user6x, tasksByType, daysMissed, analytics,
});
expect(user6x.purchased.plan.consecutive.count).to.equal(15);
expect(user6x.purchased.plan.consecutive.offset).to.equal(5);
expect(user6x.purchased.plan.consecutive.trinkets).to.equal(7);
expect(user6x.purchased.plan.consecutive.gemCapExtra).to.equal(25);
expect(user3g.purchased.plan.consecutive.trinkets).to.equal(2);
expect(user3g.purchased.plan.consecutive.gemCapExtra).to.equal(2);
expect(user3g.purchased.plan.cumulativeCount).to.equal(1);
});
});
});
@@ -888,12 +493,12 @@ describe('cron', async () => {
expect(user.purchased.plan.consecutive.count).to.equal(0);
});
it('does not decrement plan.consecutive.offset when offset is greater than 0', async () => {
user.purchased.plan.consecutive.offset = 1;
it('does not increment plan.cumulativeCount', async () => {
user.purchased.plan.cumulativeCount = 0;
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.consecutive.offset).to.equal(1);
expect(user.purchased.plan.cumulativeCount).to.equal(0);
});
it('does not increment plan.consecutive.trinkets when user has reached a month that is a multiple of 3', async () => {
@@ -913,12 +518,12 @@ describe('cron', async () => {
});
it('does not increment plan.consecutive.gemCapExtra when user has reached the gemCap limit', async () => {
user.purchased.plan.consecutive.gemCapExtra = 25;
user.purchased.plan.consecutive.gemCapExtra = 26;
user.purchased.plan.consecutive.count = 5;
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(25);
expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(26);
});
it('does nothing to plan stats if we are before the last day of the cancelled month', async () => {
@@ -928,22 +533,6 @@ describe('cron', async () => {
});
expect(user.purchased.plan.customerId).to.not.exist;
});
xit('does nothing to plan stats when we are after the last day of the cancelled month', async () => {
user.purchased.plan.dateTerminated = moment(new Date()).subtract({ days: 1 });
user.purchased.plan.consecutive.gemCapExtra = 20;
user.purchased.plan.consecutive.count = 5;
user.purchased.plan.consecutive.offset = 1;
await cron({
user, tasksByType, daysMissed, analytics,
});
expect(user.purchased.plan.customerId).to.exist;
expect(user.purchased.plan.consecutive.gemCapExtra).to.exist;
expect(user.purchased.plan.consecutive.count).to.exist;
expect(user.purchased.plan.consecutive.offset).to.exist;
});
});
describe('todos', async () => {
@@ -715,7 +715,7 @@ describe('Purchasing a group plan for group', () => {
const mysteryItem = { title: 'item' };
const mysteryItems = [mysteryItem];
const consecutive = {
trinkets: 3,
trinkets: 4,
gemCapExtra: 20,
offset: 1,
count: 13,
+154 -392
View File
@@ -12,6 +12,7 @@ import {
} from '../../../../helpers/api-unit.helper';
import * as worldState from '../../../../../website/server/libs/worldState';
import { TransactionModel } from '../../../../../website/server/models/transaction';
import { REPEATING_EVENTS } from '../../../../../website/common/script/content/constants/events';
describe('payments/index', () => {
let user;
@@ -65,7 +66,6 @@ describe('payments/index', () => {
mysteryItems: [],
consecutive: {
trinkets: 0,
offset: 0,
gemCapExtra: 0,
},
};
@@ -108,14 +108,8 @@ describe('payments/index', () => {
});
it('add a transaction entry to the recipient', async () => {
recipient.purchased.plan = plan;
expect(recipient.purchased.plan.extraMonths).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.extraMonths).to.eql(3);
const transactions = await TransactionModel
.find({ userId: recipient._id })
.sort({ createdAt: -1 })
@@ -177,6 +171,45 @@ describe('payments/index', () => {
expect(recipient.purchased.plan.dateUpdated).to.exist;
});
it('does not reset gemCapExtra if they already had one', async () => {
recipient.purchased.plan.consecutive.gemCapExtra = 10;
await api.createSubscription(data);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(10);
});
it('sets gemCapExtra to 0 if they receive a 3 month sub', async () => {
data.gift.subscription.key = 'basic_3mo';
data.gift.subscription.months = 3;
await api.createSubscription(data);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(0);
});
it('sets gemCapExtra to max if they receive a 12 month sub', async () => {
recipient.purchased.plan.consecutive.gemCapExtra = 10;
data.gift.subscription.key = 'basic_12mo';
data.gift.subscription.months = 12;
await api.createSubscription(data);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('gives user 1 hourglass if they have no active subscription', async () => {
await api.createSubscription(data);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(1);
});
it('does not give any hourglasses if they have an active subscription', async () => {
recipient.purchased.plan = plan;
await api.createSubscription(data);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(plan.consecutive.trinkets);
});
it('sets plan.dateUpdated if it did exist but the user has cancelled', async () => {
recipient.purchased.plan.dateUpdated = moment().subtract(1, 'days').toDate();
recipient.purchased.plan.dateTerminated = moment().subtract(1, 'days').toDate();
@@ -235,116 +268,6 @@ describe('payments/index', () => {
expect(recipient.purchased.plan.customerId).to.eql('customer-id');
});
it('sets plan.perkMonthCount to 1 if user is not subscribed', async () => {
recipient.purchased.plan = plan;
recipient.purchased.plan.perkMonthCount = 1;
recipient.purchased.plan.customerId = undefined;
data.sub.key = 'basic_earned';
data.gift.subscription.key = 'basic_earned';
data.gift.subscription.months = 1;
expect(recipient.purchased.plan.perkMonthCount).to.eql(1);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(1);
});
it('sets plan.perkMonthCount to 1 if field is not initialized', async () => {
recipient.purchased.plan = plan;
recipient.purchased.plan.perkMonthCount = -1;
recipient.purchased.plan.customerId = undefined;
data.sub.key = 'basic_earned';
data.gift.subscription.key = 'basic_earned';
data.gift.subscription.months = 1;
expect(recipient.purchased.plan.perkMonthCount).to.eql(-1);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(1);
});
it('sets plan.perkMonthCount to 1 if user had previous count but lapsed subscription', async () => {
recipient.purchased.plan = plan;
recipient.purchased.plan.perkMonthCount = 2;
recipient.purchased.plan.customerId = undefined;
data.sub.key = 'basic_earned';
data.gift.subscription.key = 'basic_earned';
data.gift.subscription.months = 1;
expect(recipient.purchased.plan.perkMonthCount).to.eql(2);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(1);
});
it('adds to plan.perkMonthCount if user is already subscribed', async () => {
recipient.purchased.plan = plan;
recipient.purchased.plan.perkMonthCount = 1;
data.sub.key = 'basic_earned';
data.gift.subscription.key = 'basic_earned';
data.gift.subscription.months = 1;
expect(recipient.purchased.plan.perkMonthCount).to.eql(1);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(2);
});
it('awards perks if plan.perkMonthCount reaches 3 with existing subscription', async () => {
recipient.purchased.plan = plan;
recipient.purchased.plan.perkMonthCount = 2;
data.sub.key = 'basic_earned';
data.gift.subscription.key = 'basic_earned';
data.gift.subscription.months = 1;
expect(recipient.purchased.plan.perkMonthCount).to.eql(2);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(0);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(1);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(5);
});
it('awards perks if plan.perkMonthCount reaches 3 without existing subscription', async () => {
recipient.purchased.plan.perkMonthCount = 0;
expect(recipient.purchased.plan.perkMonthCount).to.eql(0);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(0);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(1);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(5);
});
it('awards perks if plan.perkMonthCount reaches 3 without initialized field', async () => {
expect(recipient.purchased.plan.perkMonthCount).to.eql(-1);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(0);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(1);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(5);
});
it('awards perks if plan.perkMonthCount goes over 3', async () => {
recipient.purchased.plan = plan;
recipient.purchased.plan.perkMonthCount = 2;
data.sub.key = 'basic_earned';
expect(recipient.purchased.plan.perkMonthCount).to.eql(2);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.perkMonthCount).to.eql(2);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(1);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(5);
});
it('sets plan.customerId to "Gift" if it does not already exist', async () => {
expect(recipient.purchased.plan.customerId).to.not.exist;
@@ -421,8 +344,8 @@ describe('payments/index', () => {
context('Active Promotion', () => {
beforeEach(() => {
sinon.stub(worldState, 'getCurrentEventList').returns([{
...common.content.events.winter2021Promo,
event: 'winter2021',
...REPEATING_EVENTS.giftOneGetOne,
event: 'g1g1',
}]);
});
@@ -438,22 +361,30 @@ describe('payments/index', () => {
expect(user.purchased.plan.dateTerminated).to.exist;
expect(user.purchased.plan.dateUpdated).to.exist;
expect(user.purchased.plan.dateCreated).to.exist;
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
expect(recipient.items.pets['Jackalope-RoyalPurple']).to.eql(5);
expect(recipient.purchased.plan.customerId).to.eql('Gift');
expect(recipient.purchased.plan.dateTerminated).to.exist;
expect(recipient.purchased.plan.dateUpdated).to.exist;
expect(recipient.purchased.plan.dateCreated).to.exist;
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(1);
expect(recipient.purchased.plan.consecutive.gemCapExtra).to.eql(0);
});
it('adds extraMonths to existing subscription for purchaser and creates a gift subscription for recipient without sub', async () => {
user.purchased.plan = plan;
expect(user.purchased.plan.extraMonths).to.eql(0);
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
await api.createSubscription(data);
expect(user.purchased.plan.extraMonths).to.eql(3);
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
expect(recipient.items.pets['Jackalope-RoyalPurple']).to.eql(5);
expect(recipient.purchased.plan.customerId).to.eql('Gift');
@@ -466,10 +397,12 @@ describe('payments/index', () => {
recipient.purchased.plan = plan;
expect(recipient.purchased.plan.extraMonths).to.eql(0);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.extraMonths).to.eql(3);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
expect(user.items.pets['Jackalope-RoyalPurple']).to.eql(5);
expect(user.purchased.plan.customerId).to.eql('Gift');
@@ -484,11 +417,15 @@ describe('payments/index', () => {
expect(user.purchased.plan.extraMonths).to.eql(0);
expect(recipient.purchased.plan.extraMonths).to.eql(0);
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
await api.createSubscription(data);
expect(user.purchased.plan.extraMonths).to.eql(3);
expect(recipient.purchased.plan.extraMonths).to.eql(3);
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
expect(recipient.purchased.plan.consecutive.trinkets).to.eql(0);
});
it('sends a private message about the promotion', async () => {
@@ -511,7 +448,6 @@ describe('payments/index', () => {
expect(user.purchased.plan.customerId).to.eql('customer-id');
expect(user.purchased.plan.dateUpdated).to.exist;
expect(user.purchased.plan.gemsBought).to.eql(0);
expect(user.purchased.plan.perkMonthCount).to.eql(0);
expect(user.purchased.plan.paymentMethod).to.eql('Payment Method');
expect(user.purchased.plan.extraMonths).to.eql(0);
expect(user.purchased.plan.dateTerminated).to.eql(null);
@@ -549,33 +485,6 @@ describe('payments/index', () => {
expect(user.purchased.plan.dateCurrentTypeCreated).to.not.eql(initialDate);
});
it('keeps plan.perkMonthCount when changing subscription type', async () => {
await api.createSubscription(data);
user.purchased.plan.perkMonthCount = 2;
await api.createSubscription(data);
expect(user.purchased.plan.perkMonthCount).to.eql(2);
});
it('sets plan.perkMonthCount to zero when creating new monthly subscription', async () => {
user.purchased.plan.perkMonthCount = 2;
await api.createSubscription(data);
expect(user.purchased.plan.perkMonthCount).to.eql(0);
});
it('sets plan.perkMonthCount to zero when creating new 3 month subscription', async () => {
user.purchased.plan.perkMonthCount = 2;
await api.createSubscription(data);
expect(user.purchased.plan.perkMonthCount).to.eql(0);
});
it('updates plan.consecutive.offset when changing subscription type', async () => {
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.offset).to.eql(3);
data.sub.key = 'basic_6mo';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.offset).to.eql(6);
});
it('awards the Royal Purple Jackalope pet', async () => {
await api.createSubscription(data);
@@ -694,6 +603,7 @@ describe('payments/index', () => {
expect(user.purchased.plan.dateCreated).to.eql(created);
expect(user.purchased.plan.dateUpdated).to.not.eql(updated);
expect(user.purchased.plan.customerId).to.eql('customer-id');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
});
@@ -741,55 +651,20 @@ describe('payments/index', () => {
});
context('Block subscription perks', () => {
it('adds block months to plan.consecutive.offset', async () => {
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.offset).to.eql(3);
});
it('does not add to plans.consecutive.offset if 1 month subscription', async () => {
data.sub.key = 'basic_earned';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.offset).to.eql(0);
});
it('resets plans.consecutive.offset if 1 month subscription', async () => {
user.purchased.plan.consecutive.offset = 1;
await user.save();
data.sub.key = 'basic_earned';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.offset).to.eql(0);
});
it('adds 5 to plan.consecutive.gemCapExtra for 3 month block', async () => {
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(5);
});
it('adds 10 to plan.consecutive.gemCapExtra for 6 month block', async () => {
data.sub.key = 'basic_6mo';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(10);
});
it('adds 20 to plan.consecutive.gemCapExtra for 12 month block', async () => {
it('adds 26 to plan.consecutive.gemCapExtra for 12 month block', async () => {
data.sub.key = 'basic_12mo';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(20);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('does not raise plan.consecutive.gemCapExtra higher than 25', async () => {
it('does not raise plan.consecutive.gemCapExtra higher than 26', async () => {
data.sub.key = 'basic_12mo';
await api.createSubscription(data);
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(25);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('adds a plan.consecutive.trinkets for 3 month block', async () => {
@@ -798,20 +673,29 @@ describe('payments/index', () => {
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
});
it('adds 2 plan.consecutive.trinkets for 6 month block', async () => {
it('adds 1 plan.consecutive.trinkets for 6 month block', async () => {
data.sub.key = 'basic_6mo';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
});
it('adds 4 plan.consecutive.trinkets for 12 month block', async () => {
it('adds 1 plan.consecutive.trinkets for 12 month block if they had promo', async () => {
user.purchased.plan.hourglassPromoReceived = new Date();
data.sub.key = 'basic_12mo';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
});
it('adds 12 plan.consecutive.trinkets for 12 month block', async () => {
data.sub.key = 'basic_12mo';
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
context('Upgrades subscription', () => {
@@ -819,70 +703,38 @@ describe('payments/index', () => {
beforeEach(async () => {
data.updatedFrom = { logic: 'payDifference' };
});
it('Adds 10 to plan.consecutive.gemCapExtra from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(10);
});
it('Adds 15 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 26 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_3mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(5);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_3mo';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(20);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('Adds 2 to plan.consecutive.trinkets from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
});
it('Adds 2 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_6mo';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 3 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
@@ -894,7 +746,7 @@ describe('payments/index', () => {
data.updatedFrom.key = 'basic_3mo';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
});
@@ -902,70 +754,39 @@ describe('payments/index', () => {
beforeEach(async () => {
data.updatedFrom = { logic: 'payFull' };
});
it('Adds 10 to plan.consecutive.gemCapExtra from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(10);
});
it('Adds 20 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 26 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_3mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(5);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_3mo';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(25);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('Adds 2 to plan.consecutive.trinkets from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
});
it('Adds 4 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_6mo';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(6);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 4 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
@@ -977,7 +798,7 @@ describe('payments/index', () => {
data.updatedFrom.key = 'basic_3mo';
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(5);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
});
@@ -988,30 +809,13 @@ describe('payments/index', () => {
data.updatedFrom = { logic: 'refundAndRepay' };
});
context('Upgrades within first half of subscription', () => {
it('Adds 10 to plan.consecutive.gemCapExtra from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
clock.restore();
clock = sinon.useFakeTimers(new Date('2022-01-10'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(10);
});
it('Adds 15 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 26 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_3mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(5);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_3mo';
@@ -1019,28 +823,10 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-02-05'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(20);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('Adds 2 to plan.consecutive.trinkets from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
clock.restore();
clock = sinon.useFakeTimers(new Date('2022-01-08'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
});
it('Adds 3 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
@@ -1054,17 +840,17 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-01-31'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 2 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_6mo';
@@ -1072,35 +858,17 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-01-28'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 2 to plan.consecutive.trinkets from basic_earned to basic_6mo after initial cycle', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
clock.restore();
clock = sinon.useFakeTimers(new Date('2024-01-08'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
});
it('Adds 2 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo after initial cycle', async () => {
it('2 plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo after initial cycle', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_6mo';
@@ -1108,10 +876,10 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-08-28'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 3 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo after initial cycle', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo after initial cycle', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
@@ -1125,11 +893,11 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-07-31'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
});
context('Upgrades within second half of subscription', () => {
it('Adds 10 to plan.consecutive.gemCapExtra from basic_earned to basic_6mo', async () => {
it('Adds 0 to plan.consecutive.gemCapExtra from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
@@ -1144,16 +912,16 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-01-20'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(10);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
});
it('Adds 20 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 26 to plan.consecutive.gemCapExtra when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_3mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(5);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_3mo';
@@ -1161,17 +929,17 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-02-24'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(25);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('Adds 2 to plan.consecutive.trinkets from basic_earned to basic_6mo', async () => {
it('Adds 0 to plan.consecutive.trinkets from basic_earned to basic_6mo', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
@@ -1179,17 +947,17 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-01-28'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
});
it('Adds 4 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_6mo';
@@ -1197,10 +965,10 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-05-28'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(6);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 4 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
@@ -1214,17 +982,17 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-03-03'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(5);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 2 to plan.consecutive.trinkets from basic_earned to basic_6mo after initial cycle', async () => {
it('Adds 0 to plan.consecutive.trinkets from basic_earned to basic_6mo after initial cycle', async () => {
data.sub.key = 'basic_earned';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_6mo';
data.updatedFrom.key = 'basic_earned';
@@ -1232,17 +1000,17 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2022-05-28'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
});
it('Adds 4 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo after initial cycle', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_6mo to basic_12mo after initial cycle', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.trinkets).to.eql(1);
data.sub.key = 'basic_12mo';
data.updatedFrom.key = 'basic_6mo';
@@ -1250,10 +1018,10 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2023-05-28'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(6);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
it('Adds 4 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo after initial cycle', async () => {
it('Adds 12 to plan.consecutive.trinkets when upgrading from basic_3mo to basic_12mo after initial cycle', async () => {
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
@@ -1267,7 +1035,7 @@ describe('payments/index', () => {
clock = sinon.useFakeTimers(new Date('2023-09-03'));
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(5);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
});
afterEach(async () => {
@@ -1277,22 +1045,6 @@ describe('payments/index', () => {
});
context('Downgrades subscription', () => {
it('does not remove from plan.consecutive.gemCapExtra from basic_6mo to basic_earned', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(10);
data.sub.key = 'basic_earned';
data.updatedFrom = { key: 'basic_6mo' };
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(10);
});
it('does not remove from plan.consecutive.gemCapExtra from basic_12mo to basic_3mo', async () => {
expect(user.purchased.plan.planId).to.not.exist;
@@ -1300,28 +1052,12 @@ describe('payments/index', () => {
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(20);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
data.sub.key = 'basic_3mo';
data.updatedFrom = { key: 'basic_12mo' };
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(20);
});
it('does not remove from plan.consecutive.trinkets from basic_6mo to basic_earned', async () => {
data.sub.key = 'basic_6mo';
expect(user.purchased.plan.planId).to.not.exist;
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_6mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
data.sub.key = 'basic_earned';
data.updatedFrom = { key: 'basic_6mo' };
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_earned');
expect(user.purchased.plan.consecutive.trinkets).to.eql(2);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(26);
});
it('does not remove from plan.consecutive.trinkets from basic_12mo to basic_3mo', async () => {
@@ -1331,12 +1067,12 @@ describe('payments/index', () => {
await api.createSubscription(data);
expect(user.purchased.plan.planId).to.eql('basic_12mo');
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
data.sub.key = 'basic_3mo';
data.updatedFrom = { key: 'basic_12mo' };
await api.createSubscription(data);
expect(user.purchased.plan.consecutive.trinkets).to.eql(4);
expect(user.purchased.plan.consecutive.trinkets).to.eql(13);
});
});
});
@@ -1453,6 +1189,32 @@ describe('payments/index', () => {
expect(user.purchased.plan.extraMonths).to.eql(0);
});
it('does not reset gemCapExtra', async () => {
user.purchased.plan.consecutive.gemCapExtra = 12;
await api.cancelSubscription(data);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(12);
});
it('initializes gemCapExtra', async () => {
await api.cancelSubscription(data);
expect(user.purchased.plan.consecutive.gemCapExtra).to.eql(0);
});
it('initializes hourglasses', async () => {
await api.cancelSubscription(data);
expect(user.purchased.plan.consecutive.trinkets).to.eql(0);
});
it('does not reset owned hourglasses', async () => {
user.purchased.plan.consecutive.trinkets = 12;
await api.cancelSubscription(data);
expect(user.purchased.plan.consecutive.trinkets).to.eql(12);
});
it('sends an email', async () => {
await api.cancelSubscription(data);
@@ -51,6 +51,7 @@ describe('Stripe - Checkout', () => {
gift: undefined,
sub: undefined,
gemsBlock: gemsBlockKey,
server_url: BASE_URL,
};
expect(gems.validateGiftMessage).to.not.be.called;
@@ -101,6 +102,7 @@ describe('Stripe - Checkout', () => {
gift: JSON.stringify(gift),
sub: undefined,
gemsBlock: undefined,
server_url: BASE_URL,
};
expect(gems.validateGiftMessage).to.be.calledOnce;
@@ -155,6 +157,7 @@ describe('Stripe - Checkout', () => {
gift: JSON.stringify(gift),
sub: undefined,
gemsBlock: undefined,
server_url: BASE_URL,
};
expect(oneTimePayments.getOneTimePaymentInfo).to.be.calledOnce;
@@ -192,6 +195,7 @@ describe('Stripe - Checkout', () => {
userId: user._id,
gift: undefined,
sub: JSON.stringify(sub),
server_url: BASE_URL,
};
expect(subscriptions.checkSubData).to.be.calledOnce;
@@ -258,6 +262,7 @@ describe('Stripe - Checkout', () => {
userId: user._id,
gift: undefined,
sub: JSON.stringify(sub),
server_url: BASE_URL,
groupId,
};
@@ -328,8 +333,9 @@ describe('Stripe - Checkout', () => {
user.purchased.plan.customerId = customerId;
const metadata = {
userId: user._id,
type: 'edit-card-user',
userId: user._id,
server_url: BASE_URL,
};
const res = await createEditCardCheckoutSession({ user }, stripe);
@@ -418,6 +424,7 @@ describe('Stripe - Checkout', () => {
const metadata = {
userId: user._id,
type: 'edit-card-group',
server_url: BASE_URL,
groupId,
};
@@ -455,6 +462,7 @@ describe('Stripe - Checkout', () => {
userId: anotherUser._id,
type: 'edit-card-group',
groupId,
server_url: BASE_URL,
};
const res = await createEditCardCheckoutSession({ user: anotherUser, groupId }, stripe);
@@ -308,6 +308,7 @@ describe('Stripe - One Time Payments', () => {
customerId,
paymentMethod: 'Gift',
gift,
autoRenews: false,
gemsBlock: undefined,
});
});
@@ -173,6 +173,7 @@ describe('Stripe - Subscriptions', () => {
paymentMethod: 'Stripe',
sub: sinon.match({ ...sub }),
groupId: null,
autoRenews: true,
});
});
@@ -197,6 +198,7 @@ describe('Stripe - Subscriptions', () => {
paymentMethod: 'Stripe',
sub: sinon.match({ ...sub }),
groupId,
autoRenews: true,
});
});
@@ -231,6 +233,7 @@ describe('Stripe - Subscriptions', () => {
paymentMethod: 'Stripe',
sub: sinon.match({ ...sub }),
groupId,
autoRenews: true,
});
});
});
@@ -16,6 +16,7 @@ import * as subscriptions from '../../../../../../website/server/libs/payments/s
const { i18n } = common;
describe('Stripe - Webhooks', () => {
const BASE_URL = nconf.get('BASE_URL');
const stripe = stripeModule('test');
const endpointSecret = nconf.get('STRIPE_WEBHOOKS_ENDPOINT_SECRET');
const headers = {};
@@ -284,7 +285,9 @@ describe('Stripe - Webhooks', () => {
const session = {};
beforeEach(() => {
session.metadata = {};
session.metadata = {
server_url: BASE_URL,
};
event = { type: eventType, data: { object: session } };
constructEventStub = sandbox.stub(stripe.webhooks, 'constructEvent');
constructEventStub.returns(event);
@@ -31,7 +31,7 @@ describe('POST /user/buy-mystery-set/:key', () => {
expect(res.data).to.eql({
items: JSON.parse(JSON.stringify(user.items)), // otherwise dates can't be compared
purchasedPlanConsecutive: user.purchased.plan.consecutive,
purchasedPlanConsecutive: JSON.parse(JSON.stringify(user.purchased.plan.consecutive)),
});
expect(res.message).to.equal(t('hourglassPurchaseSet'));
});
+8 -43
View File
@@ -183,8 +183,6 @@ describe('cron utility functions', () => {
});
describe('getPlanContext', () => {
const now = new Date(2022, 5, 1);
function baseUserData (count, offset, planId) {
return {
purchased: {
@@ -192,7 +190,7 @@ describe('cron utility functions', () => {
consecutive: {
count,
offset,
gemCapExtra: 25,
gemCapExtra: 26,
trinkets: 19,
},
quantity: 1,
@@ -213,52 +211,19 @@ describe('cron utility functions', () => {
};
}
it('monthly plan, next date in 3 months', () => {
it('elapsedMonths is 0 if its the same month', () => {
const user = baseUserData(60, 0, 'group_plan_auto');
user.purchased.plan.perkMonthCount = 0;
const planContext = getPlanContext(user, now);
expect(planContext.nextHourglassDate)
.to.be.sameMoment('2022-08-10T02:00:00.144Z');
const planContext = getPlanContext(user, new Date(2022, 4, 20));
expect(planContext.elapsedMonths).to.equal(0);
});
it('monthly plan, next date in 1 month', () => {
const user = baseUserData(62, 0, 'group_plan_auto');
user.purchased.plan.perkMonthCount = 2;
it('elapsedMonths is 1 after one month', () => {
const user = baseUserData(60, 0, 'group_plan_auto');
const planContext = getPlanContext(user, now);
const planContext = getPlanContext(user, new Date(2022, 5, 11));
expect(planContext.nextHourglassDate)
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
});
it('multi-month plan, no offset', () => {
const user = baseUserData(60, 0, 'basic_3mo');
const planContext = getPlanContext(user, now);
expect(planContext.nextHourglassDate)
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
});
it('multi-month plan with offset', () => {
const user = baseUserData(60, 1, 'basic_3mo');
const planContext = getPlanContext(user, now);
expect(planContext.nextHourglassDate)
.to.be.sameMoment('2022-07-10T02:00:00.144Z');
});
it('multi-month plan with perk count', () => {
const user = baseUserData(60, 1, 'basic_3mo');
user.purchased.plan.perkMonthCount = 2;
const planContext = getPlanContext(user, now);
expect(planContext.nextHourglassDate)
.to.be.sameMoment('2022-07-10T02:00:00.144Z');
expect(planContext.elapsedMonths).to.equal(1);
});
});
});
+6 -6
View File
@@ -19,8 +19,8 @@ describe('releaseDates', () => {
});
describe('armoire', () => {
it('should only contain valid armoire names', () => {
const lastReleaseDate = maxBy(Object.values(ARMOIRE_RELEASE_DATES), value => new Date(`${value.year}-${value.month + 1}-20`));
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month + 1}-20`));
const lastReleaseDate = maxBy(Object.values(ARMOIRE_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-22`));
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-22`));
Object.keys(ARMOIRE_RELEASE_DATES).forEach(key => {
expect(find(armoire.all, { set: key }), `${key} is not a valid armoire set`).to.exist;
});
@@ -40,8 +40,8 @@ describe('releaseDates', () => {
describe('eggs', () => {
it('should only contain valid egg names', () => {
const lastReleaseDate = maxBy(Object.values(EGGS_RELEASE_DATES), value => new Date(`${value.year}-${value.month + 1}-${value.day}`));
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month + 1}-${lastReleaseDate.day}`));
const lastReleaseDate = maxBy(Object.values(EGGS_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-${value.day}`));
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-${lastReleaseDate.day + 1}`));
Object.keys(EGGS_RELEASE_DATES).forEach(key => {
expect(eggs.all[key], `${key} is not a valid egg name`).to.exist;
});
@@ -61,8 +61,8 @@ describe('releaseDates', () => {
describe('hatchingPotions', () => {
it('should only contain valid potion names', () => {
const lastReleaseDate = maxBy(Object.values(HATCHING_POTIONS_RELEASE_DATES), value => new Date(`${value.year}-${value.month + 1}-${value.day}`));
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month + 1}-${lastReleaseDate.day}`));
const lastReleaseDate = maxBy(Object.values(HATCHING_POTIONS_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-${value.day}`));
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-${lastReleaseDate.day + 1}`));
Object.keys(HATCHING_POTIONS_RELEASE_DATES).forEach(key => {
expect(hatchingPotions.all[key], `${key} is not a valid potion name`).to.exist;
});
+4
View File
@@ -1,4 +1,5 @@
// eslint-disable-next-line max-len
import maxBy from 'lodash/maxBy';
import moment from 'moment';
import nconf from 'nconf';
import {
@@ -10,6 +11,7 @@ import QUEST_BUNDLES from '../../website/common/script/content/bundles';
import potions from '../../website/common/script/content/hatching-potions';
import SPELLS from '../../website/common/script/content/spells';
import QUEST_SEASONAL from '../../website/common/script/content/quests/seasonal';
import { HATCHING_POTIONS_RELEASE_DATES } from '../../website/common/script/content/constants/releaseDates';
function validateMatcher (matcher, checkedDate) {
expect(matcher.end).to.be.a('date');
@@ -222,6 +224,8 @@ describe('Content Schedule', () => {
});
it('premium hatching potions', () => {
const lastReleaseDate = maxBy(Object.values(HATCHING_POTIONS_RELEASE_DATES), value => new Date(`${value.year}-${value.month}-${value.day}`));
clock = sinon.useFakeTimers(new Date(`${lastReleaseDate.year}-${lastReleaseDate.month}-${lastReleaseDate.day + 1}`));
const potionKeys = Object.keys(potions.premium);
Object.keys(MONTHLY_SCHEDULE).forEach(key => {
const monthlyPotions = MONTHLY_SCHEDULE[key][21].find(item => item.type === 'premiumHatchingPotions');
@@ -805,6 +805,11 @@
width: 141px;
height: 147px;
}
.background_castle_hall_with_hearth {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_castle_hall_with_hearth.png');
width: 141px;
height: 147px;
}
.background_cemetery_gate {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_cemetery_gate.png');
width: 141px;
@@ -1080,6 +1085,11 @@
width: 141px;
height: 147px;
}
.background_first_snow_forest {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_first_snow_forest.png');
width: 141px;
height: 147px;
}
.background_floating_islands {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_floating_islands.png');
width: 141px;
@@ -29619,6 +29629,11 @@
width: 90px;
height: 90px;
}
.broad_armor_armoire_festiveHelperOveralls {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_festiveHelperOveralls.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_fiddlersCoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_fiddlersCoat.png');
width: 114px;
@@ -29924,6 +29939,11 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_stormKnightArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_stormKnightArmor.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_strawRaincoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_strawRaincoat.png');
width: 114px;
@@ -30189,6 +30209,11 @@
width: 114px;
height: 90px;
}
.head_armoire_festiveHelperHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_festiveHelperHat.png');
width: 114px;
height: 90px;
}
.head_armoire_fiddlersCap {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_fiddlersCap.png');
width: 114px;
@@ -30444,6 +30469,11 @@
width: 117px;
height: 120px;
}
.head_armoire_stormKnightHelm {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_stormKnightHelm.png');
width: 114px;
height: 90px;
}
.head_armoire_strawRainHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_strawRainHat.png');
width: 114px;
@@ -31084,6 +31114,11 @@
width: 90px;
height: 90px;
}
.slim_armor_armoire_festiveHelperOveralls {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_festiveHelperOveralls.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_fiddlersCoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_fiddlersCoat.png');
width: 114px;
@@ -31389,6 +31424,11 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_stormKnightArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_stormKnightArmor.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_strawRaincoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_strawRaincoat.png');
width: 114px;
@@ -31949,6 +31989,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_stormKnightAxe {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_stormKnightAxe.png');
width: 114px;
height: 90px;
}
.weapon_armoire_vermilionArcherBow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_vermilionArcherBow.png');
width: 90px;
@@ -35304,6 +35349,31 @@
width: 114px;
height: 90px;
}
.body_mystery_202411 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/body_mystery_202411.png');
width: 114px;
height: 90px;
}
.head_mystery_202411 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202411.png');
width: 114px;
height: 90px;
}
.broad_armor_mystery_202412 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202412.png');
width: 114px;
height: 90px;
}
.head_mystery_202412 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202412.png');
width: 114px;
height: 90px;
}
.slim_armor_mystery_202412 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202412.png');
width: 114px;
height: 90px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;
@@ -37869,6 +37939,26 @@
width: 114px;
height: 90px;
}
.broad_armor_special_winter2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Healer.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Mage.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Rogue.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2025Warrior.png');
width: 114px;
height: 90px;
}
.broad_armor_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_yeti.png');
width: 90px;
@@ -38144,6 +38234,26 @@
width: 114px;
height: 90px;
}
.head_special_winter2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Healer.png');
width: 114px;
height: 90px;
}
.head_special_winter2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Mage.png');
width: 114px;
height: 90px;
}
.head_special_winter2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Rogue.png');
width: 114px;
height: 90px;
}
.head_special_winter2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2025Warrior.png');
width: 114px;
height: 90px;
}
.head_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_yeti.png');
width: 90px;
@@ -38309,6 +38419,21 @@
width: 114px;
height: 90px;
}
.shield_special_winter2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2025Healer.png');
width: 114px;
height: 90px;
}
.shield_special_winter2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2025Rogue.png');
width: 114px;
height: 90px;
}
.shield_special_winter2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2025Warrior.png');
width: 114px;
height: 90px;
}
.shield_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_yeti.png');
width: 90px;
@@ -38529,6 +38654,26 @@
width: 114px;
height: 90px;
}
.slim_armor_special_winter2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Healer.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Mage.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Rogue.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2025Warrior.png');
width: 114px;
height: 90px;
}
.slim_armor_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_yeti.png');
width: 90px;
@@ -38749,6 +38894,26 @@
width: 114px;
height: 90px;
}
.weapon_special_winter2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Healer.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Mage.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Rogue.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2025Warrior.png');
width: 114px;
height: 90px;
}
.weapon_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_yeti.png');
width: 90px;
@@ -39902,6 +40067,86 @@
width: 28px;
height: 28px;
}
.notif_habitoween_base_mount {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_base_mount.png');
width: 28px;
height: 28px;
}
.notif_habitoween_base_pet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_base_pet.png');
width: 28px;
height: 28px;
}
.notif_habitoween_candy {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_candy.png');
width: 28px;
height: 28px;
}
.notif_habitoween_ghost_mount {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_ghost_mount.png');
width: 28px;
height: 28px;
}
.notif_habitoween_ghost_pet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_ghost_pet.png');
width: 28px;
height: 28px;
}
.notif_habitoween_glow_mount {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_glow_mount.png');
width: 28px;
height: 28px;
}
.notif_habitoween_glow_pet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_glow_pet.png');
width: 28px;
height: 28px;
}
.notif_habitoween_purple_mount {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_purple_mount.png');
width: 28px;
height: 28px;
}
.notif_habitoween_purple_pet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_habitoween_purple_pet.png');
width: 28px;
height: 28px;
}
.notif_harvestfeast_base_mount {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_base_mount.png');
width: 28px;
height: 28px;
}
.notif_harvestfeast_base_pet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_base_pet.png');
width: 28px;
height: 28px;
}
.notif_harvestfeast_base_set {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_base_set.png');
width: 28px;
height: 28px;
}
.notif_harvestfeast_gilded_mount {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_gilded_mount.png');
width: 28px;
height: 28px;
}
.notif_harvestfeast_gilded_pet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_gilded_pet.png');
width: 28px;
height: 28px;
}
.notif_harvestfeast_gilded_set {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_gilded_set.png');
width: 28px;
height: 28px;
}
.notif_harvestfeast_pie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_harvestfeast_pie.png');
width: 28px;
height: 28px;
}
.notif_head_special_nye {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_head_special_nye.png');
width: 28px;
@@ -40047,6 +40292,11 @@
width: 28px;
height: 28px;
}
.notif_subscriber_reward {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/notif_subscriber_reward.png');
width: 28px;
height: 28px;
}
.npc_bailey {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/npc_bailey.png');
width: 60px;
@@ -40397,6 +40647,11 @@
width: 219px;
height: 219px;
}
.quest_lostMasterclasser4 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_lostMasterclasser4.png');
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying1 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_mayhemMistiflying1.png');
width: 150px;
@@ -41912,6 +42167,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_BearCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_BearCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Glass.png');
width: 105px;
@@ -42352,6 +42612,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_Cactus-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_Cactus-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-Glass.png');
width: 105px;
@@ -43037,6 +43302,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_Dragon-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dragon-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Glass.png');
width: 105px;
@@ -43472,6 +43742,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_FlyingPig-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_FlyingPig-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-Glass.png');
width: 105px;
@@ -43757,6 +44032,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_Fox-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_Fox-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-Glass.png');
width: 105px;
@@ -44482,6 +44762,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_LionCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_LionCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-Glass.png');
width: 105px;
@@ -44987,6 +45272,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_PandaCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_PandaCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-Glass.png');
width: 105px;
@@ -46277,6 +46567,11 @@
width: 105px;
height: 105px;
}
.Mount_Body_TigerCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Body_TigerCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-Glass.png');
width: 105px;
@@ -46872,6 +47167,11 @@
width: 135px;
height: 135px;
}
.Mount_Body_Wolf-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-Gingerbread.png');
width: 135px;
height: 135px;
}
.Mount_Body_Wolf-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-Glass.png');
width: 135px;
@@ -47407,6 +47707,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_BearCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_BearCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Glass.png');
width: 105px;
@@ -47847,6 +48152,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_Cactus-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_Cactus-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-Glass.png');
width: 105px;
@@ -48532,6 +48842,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_Dragon-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dragon-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Glass.png');
width: 105px;
@@ -48967,6 +49282,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_FlyingPig-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_FlyingPig-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-Glass.png');
width: 105px;
@@ -49252,6 +49572,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_Fox-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_Fox-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-Glass.png');
width: 105px;
@@ -49977,6 +50302,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_LionCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_LionCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-Glass.png');
width: 105px;
@@ -50482,6 +50812,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_PandaCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_PandaCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-Glass.png');
width: 105px;
@@ -51772,6 +52107,11 @@
width: 105px;
height: 105px;
}
.Mount_Head_TigerCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-Gingerbread.png');
width: 105px;
height: 105px;
}
.Mount_Head_TigerCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-Glass.png');
width: 105px;
@@ -52367,6 +52707,11 @@
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-Gingerbread.png');
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-Glass.png');
width: 135px;
@@ -52917,6 +53262,11 @@
width: 81px;
height: 99px;
}
.Pet-BearCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-BearCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Glass.png');
width: 81px;
@@ -53382,6 +53732,11 @@
width: 81px;
height: 99px;
}
.Pet-Cactus-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-Cactus-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Glass.png');
width: 81px;
@@ -54097,6 +54452,11 @@
width: 81px;
height: 99px;
}
.Pet-Dragon-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-Dragon-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Glass.png');
width: 81px;
@@ -54567,6 +54927,11 @@
width: 81px;
height: 99px;
}
.Pet-FlyingPig-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-FlyingPig-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Glass.png');
width: 81px;
@@ -54877,6 +55242,11 @@
width: 81px;
height: 99px;
}
.Pet-Fox-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-Fox-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Glass.png');
width: 81px;
@@ -55632,6 +56002,11 @@
width: 81px;
height: 99px;
}
.Pet-LionCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-LionCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Glass.png');
width: 81px;
@@ -56162,6 +56537,11 @@
width: 81px;
height: 99px;
}
.Pet-PandaCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-PandaCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Glass.png');
width: 81px;
@@ -57482,6 +57862,11 @@
width: 81px;
height: 99px;
}
.Pet-TigerCub-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-TigerCub-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Glass.png');
width: 81px;
@@ -58102,6 +58487,11 @@
width: 81px;
height: 99px;
}
.Pet-Wolf-Gingerbread {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Gingerbread.png');
width: 78px;
height: 96px;
}
.Pet-Wolf-Glass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Glass.png');
width: 81px;
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

+78 -42
View File
@@ -3,9 +3,9 @@
font-family: 'Roboto', sans-serif;
font-size: 14px;
font-weight: bold;
line-height: 1.71;
border: 1px solid transparent;
padding: 4px 12px;
line-height: 1.714;
border: 2px solid transparent;
padding: 2px 12px;
border-radius: 4px;
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
color: $white;
@@ -19,7 +19,7 @@
}
&:focus {
border-color: $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:active, &.active:not(.btn-flat) {
@@ -30,9 +30,9 @@
cursor: default;
color: $gray-50;
opacity: 0.75;
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
box-shadow: none;
background-color: $gray-700;
border: 1px solid transparent;
border: 2px solid transparent;
.svg {
color: $gray-300;
@@ -40,7 +40,7 @@
}
&.with-icon {
height: 2rem; // otherwise would something set the height to 33px
height: 32px; // otherwise would something set the height to 33px
display: flex;
flex-direction: row;
align-items: center;
@@ -48,40 +48,47 @@
}
.btn-front {
border: none !important;
font-size: 16px;
line-height: 1.5;
padding: 7.5px 15.5px;
padding: 2px 17px;
&:hover {
border: none !important;
}
}
.btn-primary {
background: $purple-200;
border: 1px solid transparent;
border: 2px solid transparent;
line-height: 1.714;
--icon-color: #{$purple-500};
&:focus {
background: $purple-200;
border-color: $purple-400;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
--icon-color: #{$white};
}
&:not(:disabled):not(.disabled) {
&:hover {
background: #5d3b9c;
border: 1px solid transparent;
background: $purple-200;
border: 2px solid transparent;
--icon-color: #{$white};
}
&:active, &.active {
background: $purple-200;
border: 1px solid transparent;
border: 2px solid transparent;
box-shadow: none;
--icon-color: #{$white};
}
&:active:focus, &.active:focus {
box-shadow: none;
border-color: $purple-400;
border: 2px solid $purple-400;
}
}
@@ -97,39 +104,43 @@
.show > .btn-secondary.dropdown-toggle:not(.btn-success)
{
background: $white;
border: 1px solid transparent;
border: 2px solid transparent;
color: $gray-50;
--icon-color: #{$gray-200};
&:focus, &:active {
color: $gray-50;
background: $white;
border-color: $purple-400;
border: 2px solid $purple-400;
color: $gray-50;
--icon-color: #{$purple-300};
}
&:not(:disabled):not(.disabled) {
&:active, &.active {
background: $white;
border: 2px solid $purple-400;
color: $purple-300;
--icon-color: #{$purple-300};
&:focus {
color: $purple-300;
box-shadow: none;
border-color: $purple-400;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:active {
box-shadow: none;
}
background: $white;
border: 1px solid transparent;
}
&:hover {
color: $purple-300;
background: $white !important;
border: 1px solid transparent;
border: 2px solid transparent;
--icon-color: #{$purple-300};
.svg {
@@ -151,91 +162,116 @@
.btn-danger {
background: $maroon-100;
border: 1px solid transparent;
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
&:hover:not(:disabled):not(.disabled) {
background: #e14e4e;
border: 1px solid transparent;
background: $maroon-100;
border: 2px solid transparent;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:focus {
background: $maroon-100;
border-color: $purple-400;
border: 2px solid $purple-400;
}
&:not(:disabled):not(.disabled):active:focus, &:not(:disabled):not(.disabled).active:focus {
box-shadow: none;
border-color: $purple-400;
border: 2px solid $purple-400;
}
&:not(:disabled):not(.disabled):active, &:not(:disabled):not(.disabled).active {
background: $maroon-100;
border: 1px solid transparent;
border: 2px solid $purple-400;
}
}
.btn-warning {
background: $orange-10;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
color: $white !important;
&:hover:not(:disabled):not(.disabled) {
background: $orange-100;
background: $orange-10;
color: $white;
}
&:focus {
background: $orange-10;
border-color: $purple-400;
border: 2px solid $purple-400;
}
&:not(:disabled):not(.disabled):active:focus, &:not(:disabled):not(.disabled).active:focus {
border: 2px solid $purple-400;
box-shadow: none;
border-color: $purple-400;
}
&:not(:disabled):not(.disabled):active, &:not(:disabled):not(.disabled).active {
background: $orange-10;
box-shadow: none;
}
}
.btn-success {
background: $green-50;
border: 1px solid transparent;
border: 2px solid transparent;
&:hover:not(:disabled):not(.disabled) {
background: #32bd8a;
border: 1px solid transparent;
background: $green-50;
border: 2px solid transparent;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:focus {
background: $green-50;
border-color: $purple-400;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:not(:disabled):not(.disabled):active:focus, &:not(:disabled):not(.disabled).active:focus {
border: 2px solid $purple-400;
box-shadow: none;
border-color: $purple-400;
}
&:not(:disabled):not(.disabled):active, &:not(:disabled):not(.disabled).active {
background: $green-50;
border: 1px solid transparent;
border: 2px solid $purple-400;
box-shadow: none;
}
}
.btn-info {
background: $blue-50;
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
&:disabled {
background: $blue-50;
box-shadow: none;
}
&:hover {
border: 2px solid transparent;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:focus {
background: $blue-100;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:hover:not(:disabled):not(.disabled) {
background-color: $blue-100;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled) {
background: $blue-50;
background: $blue-100;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
}
@@ -244,7 +280,7 @@
width: 100%;
padding: 8px;
font-size: 14px;
line-height: 1.43;
line-height: 1.714;
font-weight: bold;
text-align: center;
background: $gray-500;
@@ -268,6 +304,6 @@
.btn-small {
font-size: 12px;
line-height: 1.33;
padding: 4px 8px;
line-height: 2;
padding: 2px 2px;
}
@@ -78,15 +78,3 @@ $gold-color: #FFA624;
$hourglass-color: #2995CD;
$purple-task: #925cf3;
.gray-200 {
color: $gray-200 !important;
}
.purple-300 {
color: $purple-300 !important;
}
.white {
color: $white !important;
}
+9 -5
View File
@@ -1,8 +1,9 @@
.dropdown > .btn {
padding: 0.219rem 0.75rem;
font-family: 'Roboto', sans-serif;
font-size: 14px;
font-weight: normal;
line-height: 1.714;
padding: 2px 12px;
}
.dropdown-toggle:hover {
@@ -33,10 +34,10 @@
}
.dropdown-menu {
padding: 0px;
border: none;
border: transparent;
border-radius: 2px;
box-shadow: 0 3px 6px 0 rgba(26, 24, 29, 0.16), 0 3px 6px 0 rgba(26, 24, 29, 0.24);
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
padding: 0;
}
@@ -113,6 +114,10 @@
}
.dropdown-icon-item {
line-height: 1;
padding-top: 2px !important;
padding-bottom: 2px !important;
.svg-icon {
margin: 0px 16px 0px 0px;
vertical-align: middle;
@@ -128,7 +133,6 @@
.dropdown-toggle {
width: 100% !important;
height: 32px;
text-align: left;
}
+4
View File
@@ -44,6 +44,10 @@ ul {
color: $purple-200;
}
h4 {
color: $gray-50;
}
.body-text {
font-size: 1em;
color: $gray-10;
@@ -86,3 +86,91 @@ h4 {
.opacity-75 {
opacity: 0.75;
}
.bg-gray-100 {
background-color: $gray-100 !important;
}
.bg-gray-300 {
background-color: $gray-300 !important;
}
.bg-gray-600 {
background-color: $gray-600 !important;
}
.bg-gray-700 {
background-color: $gray-700 !important;
}
.bg-green-10 {
background-color: $green-10 !important;
}
.bg-green-100 {
background-color: $green-100 !important;
}
.bg-purple-100 {
background-color: $purple-100 !important;
}
.bg-purple-300 {
background-color: $purple-300 !important;
}
.bg-white {
background-color: $white !important;
}
.gray-10 {
color: $gray-10 !important;
}
.gray-50 {
color: $gray-50 !important;
}
.gray-200 {
color: $gray-200 !important;
}
.gray-300 {
color: $gray-300 !important;
}
.green-10 {
color: $green-10 !important;
}
.maroon-50 {
color: $maroon-50 !important;
}
.purple-200 {
color: $purple-200 !important;
}
.purple-300 {
color: $purple-300 !important;
}
.purple-600 {
color: $purple-600 !important;
}
.teal-1 {
color: $teal-1 !important;
}
.teal-10 {
color: $teal-10 !important;
}
.yellow-10 {
color: $yellow-10 !important;
}
.white {
color: $white !important;
}
@@ -0,0 +1,32 @@
<svg width="40" height="16" viewBox="0 0 40 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.3333 5.33333L12 8L17.3333 10.6667L20 16L22.6667 10.6667L28 8L22.6667 5.33333L20 0L17.3333 5.33333Z" fill="#BDA8FF"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M25 7.99984L21.6667 9.6665L20 7.99984L25 7.99984Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20 3L21.6666 6.33333L20 8V3Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M15 8L18.3333 6.33333L20 8L15 8Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20 13L18.3333 9.66667L20 8V13Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M15 7.99984L18.3333 9.6665L20 7.99984L15 7.99984Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M20 3L18.3333 6.33333L20 8V3Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M25 8L21.6667 6.33333L20 8L25 8Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M20 13L21.6666 9.66667L20 8V13Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M20.7999 7.20041L22.3333 8.00041L20.7999 8.80041L19.9999 10.3337L19.1999 8.80041L17.6666 8.00041L19.1999 7.20041L19.9999 5.66707L20.7999 7.20041Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.66667 6.66667L0 8L2.66667 9.33333L4 12L5.33333 9.33333L8 8L5.33333 6.66667L4 4L2.66667 6.66667Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M6.49976 7.99967L4.83309 8.83301L3.99976 7.99967H6.49976Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M3.99998 5.5L4.83331 7.16667L3.99998 8L3.99998 5.5Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M1.5 8L3.16667 7.16667L4 8H1.5Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M4 10.5L3.16667 8.83333L4 8V10.5Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M1.50018 7.99967L3.16685 8.83301L4.00018 7.99967H1.50018Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M4 5.5L3.16667 7.16667L4 8V5.5Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.5 8L4.83333 7.16667L4 8H6.5Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M3.99998 10.5L4.83331 8.83333L3.99998 8L3.99998 10.5Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M4.40002 7.59935L5.16669 7.99935L4.40002 8.39935L4.00002 9.16602L3.60002 8.39935L2.83335 7.99935L3.60002 7.59935L4.00002 6.83268L4.40002 7.59935Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.6667 6.66667L32 8L34.6667 9.33333L36 12L37.3333 9.33333L40 8L37.3333 6.66667L36 4L34.6667 6.66667Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M38.4998 7.99967L36.8331 8.83301L35.9998 7.99967H38.4998Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M36 5.5L36.8333 7.16667L36 8V5.5Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M33.5 8L35.1667 7.16667L36 8H33.5Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M36 10.5L35.1667 8.83333L36 8V10.5Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M33.5002 7.99967L35.1668 8.83301L36.0002 7.99967H33.5002Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M36 5.5L35.1667 7.16667L36 8V5.5Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M38.5 8L36.8333 7.16667L36 8H38.5Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M36 10.5L36.8333 8.83333L36 8V10.5Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M36.4 7.59935L37.1667 7.99935L36.4 8.39935L36 9.16602L35.6 8.39935L34.8334 7.99935L35.6 7.59935L36 6.83268L36.4 7.59935Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

@@ -1,7 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 144 31">
<g fill="none" fill-rule="evenodd">
<path fill="#FFF" d="M120.876 24.007a2.27 2.27 0 0 0-3.183.41 4.595 4.595 0 0 1-3.663 1.804 4.62 4.62 0 0 1-4.613-4.335c-.005-.35-.009-2.864-.009-3.19a4.627 4.627 0 0 1 4.622-4.622c1.28 0 2.47.51 3.353 1.44a2.269 2.269 0 0 0 3.29-3.125 9.2 9.2 0 0 0-6.643-2.853c-5.05 0-9.16 4.109-9.16 9.16 0 .03.002 3.175.014 3.406a9.158 9.158 0 0 0 9.146 8.657 9.1 9.1 0 0 0 7.257-3.57 2.27 2.27 0 0 0-.411-3.182M134.373 26.221a4.62 4.62 0 0 1-4.613-4.333c-.005-.353-.008-2.877-.008-3.193a4.627 4.627 0 0 1 4.621-4.622 4.627 4.627 0 0 1 4.622 4.622c0 .328-.003 2.84-.009 3.189a4.618 4.618 0 0 1-4.613 4.337m6.891-17.078a2.264 2.264 0 0 0-2.19 1.706 9.095 9.095 0 0 0-4.7-1.313c-5.051 0-9.16 4.109-9.16 9.16 0 .031.001 3.173.013 3.406a9.158 9.158 0 0 0 9.146 8.657 9.118 9.118 0 0 0 4.81-1.37 2.268 2.268 0 0 0 4.35-.899V11.412a2.27 2.27 0 0 0-2.269-2.269M30.546 26.221a4.62 4.62 0 0 1-4.613-4.335c-.006-.35-.01-2.863-.01-3.19a4.627 4.627 0 0 1 4.623-4.623 4.627 4.627 0 0 1 4.622 4.622c0 .328-.004 2.84-.01 3.189a4.618 4.618 0 0 1-4.612 4.337m6.89-17.078a2.264 2.264 0 0 0-2.19 1.706 9.095 9.095 0 0 0-4.7-1.313c-5.052 0-9.16 4.109-9.16 9.16 0 .031 0 3.174.013 3.406a9.158 9.158 0 0 0 9.147 8.657 9.118 9.118 0 0 0 4.809-1.37 2.268 2.268 0 0 0 4.35-.899V11.412a2.27 2.27 0 0 0-2.269-2.269M70.84 9.143a2.27 2.27 0 0 0-2.27 2.27V28.49a2.27 2.27 0 0 0 4.539 0V11.412a2.27 2.27 0 0 0-2.27-2.269M97.563 9.143a2.27 2.27 0 0 0-2.27 2.27V28.49a2.27 2.27 0 0 0 4.538 0V11.412a2.27 2.27 0 0 0-2.268-2.269M59.066 21.888a4.62 4.62 0 0 1-4.613 4.333 4.62 4.62 0 0 1-4.613-4.338c-.006-.35-.009-2.86-.009-3.187a4.627 4.627 0 0 1 4.622-4.622 4.627 4.627 0 0 1 4.622 4.622c0 .315-.004 2.84-.009 3.192M54.453 9.536a9.089 9.089 0 0 0-4.622 1.265V2.33a2.27 2.27 0 0 0-4.537 0V28.49a2.269 2.269 0 0 0 4.35.9 9.117 9.117 0 0 0 4.81 1.37 9.16 9.16 0 0 0 9.146-8.666c.011-.224.013-3.367.013-3.398 0-5.052-4.11-9.16-9.16-9.16M8.92 9.536a9.143 9.143 0 0 0-4.382 1.11V2.33A2.27 2.27 0 0 0 0 2.33v26.16a2.269 2.269 0 1 0 4.538 0V16.763c.173-.147.333-.314.46-.516a4.601 4.601 0 0 1 3.921-2.173 4.627 4.627 0 0 1 4.622 4.622c0 .415-.004 9.233-.01 9.738a2.27 2.27 0 0 0 4.535.172c.01-.225.012-9.814.012-9.91 0-5.052-4.108-9.16-9.159-9.16M88.95 9.143h-2.648V2.33a2.27 2.27 0 0 0-4.538 0v6.813h-2.647a2.27 2.27 0 0 0 0 4.538h2.647V28.49a2.27 2.27 0 0 0 4.538 0V13.681h2.647a2.27 2.27 0 0 0 0-4.538"/>
<path fill="#FF6066" d="M73.025 2.33a2.27 2.27 0 1 1-4.538 0 2.27 2.27 0 0 1 4.538 0"/>
<path fill="#4FB5E8" d="M99.748 2.33a2.27 2.27 0 1 1-4.539 0 2.27 2.27 0 0 1 4.539 0"/>
</g>
<svg width="217" height="48" viewBox="0 0 217 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M108.785 0.0195312C106.343 0.0195312 104.355 1.99967 104.355 4.44184C104.355 6.88401 106.343 8.86415 108.785 8.86415C111.227 8.86415 113.215 6.87668 113.215 4.44184C113.215 2.007 111.227 0.0195312 108.785 0.0195312Z" fill="#FF6165"/>
<path d="M148.564 0.0195312C146.121 0.0195312 144.134 1.99967 144.134 4.44184C144.134 6.88401 146.121 8.86415 148.564 8.86415C151.006 8.86415 152.993 6.87668 152.993 4.44184C152.993 2.007 151.006 0.0195312 148.564 0.0195312Z" fill="#50B5E9"/>
<path d="M184.2 42.1989C181.332 45.8879 177.005 48 172.319 48C164.355 48 157.776 41.8176 157.344 33.9264C157.322 33.5303 157.322 28.8367 157.322 28.7927C157.322 20.5788 164.047 13.8976 172.319 13.8976C176.411 13.8976 180.379 15.5917 183.195 18.54C184.053 19.4347 184.515 20.6154 184.478 21.8548C184.449 23.0943 183.928 24.2457 183.019 25.0964C181.156 26.8565 178.201 26.7759 176.426 24.9277C175.341 23.7983 173.881 23.1749 172.312 23.1749C169.188 23.1749 166.65 25.6904 166.65 28.7853C166.65 29.2694 166.65 32.995 166.665 33.5083C166.841 36.4052 169.327 38.7154 172.312 38.7154C174.087 38.7154 175.722 37.916 176.8 36.5225C178.369 34.4984 181.31 34.1244 183.342 35.6865C184.332 36.4419 184.962 37.5346 185.124 38.7667C185.285 39.9988 184.948 41.2162 184.192 42.1989H184.2ZM216.82 18.4739V43.4164C216.82 45.9392 214.774 47.9927 212.258 47.9927C210.916 47.9927 209.669 47.3986 208.819 46.4159C206.787 47.45 204.543 47.9927 202.262 47.9927C194.533 47.9927 188.145 41.9129 187.727 34.1464C187.705 33.7577 187.705 29.152 187.705 29.1007C187.705 21.0261 194.239 14.4623 202.262 14.4623C204.419 14.4623 206.545 14.9537 208.503 15.8924C209.332 14.6677 210.726 13.8903 212.266 13.8903C214.781 13.8903 216.827 15.9438 216.827 18.4666L216.82 18.4739ZM207.689 33.721C207.697 33.1196 207.704 29.5774 207.704 29.108C207.704 26.0791 205.262 23.6223 202.262 23.6223C199.263 23.6223 196.821 26.0865 196.821 29.108C196.821 29.5701 196.821 33.2443 196.836 33.7577C197.004 36.5812 199.395 38.84 202.262 38.84C205.13 38.84 207.506 36.5959 207.689 33.721ZM63.3042 18.4739V43.4164C63.3042 45.9392 61.2581 47.9927 58.7426 47.9927C57.4006 47.9927 56.1539 47.3986 55.3032 46.4159C53.2717 47.45 51.0276 47.9927 48.7469 47.9927C41.0099 47.9927 34.6296 41.9129 34.2115 34.1464C34.1895 33.8017 34.1895 30.2008 34.1895 29.1007C34.1895 21.0261 40.7238 14.4623 48.7469 14.4623C50.903 14.4623 53.0371 14.9537 54.9878 15.8924C55.8165 14.6677 57.2099 13.8903 58.75 13.8903C61.2654 13.8903 63.3115 15.9438 63.3115 18.4666L63.3042 18.4739ZM48.7469 23.6223C45.7474 23.6223 43.3053 26.0865 43.3053 29.108C43.3053 29.5847 43.3053 33.237 43.32 33.7503C43.4886 36.5812 45.8794 38.84 48.7469 38.84C51.6143 38.84 53.9904 36.5959 54.1738 33.721C54.1811 33.1196 54.1884 29.5847 54.1884 29.108C54.1884 26.0791 51.7463 23.6223 48.7469 23.6223ZM108.78 14.1396C106.338 14.1396 104.351 16.1931 104.351 18.716V43.4164C104.351 45.9392 106.338 47.9927 108.78 47.9927C111.222 47.9927 113.21 45.9392 113.21 43.4164V18.716C113.21 16.1931 111.222 14.1396 108.78 14.1396ZM148.558 14.1396C146.116 14.1396 144.129 16.1931 144.129 18.716V43.4164C144.129 45.9392 146.116 47.9927 148.558 47.9927C151 47.9927 152.988 45.9392 152.988 43.4164V18.716C152.988 16.1931 151 14.1396 148.558 14.1396ZM98.7551 28.866C98.7551 28.91 98.7551 33.5817 98.7331 33.9704C98.3151 41.8396 91.9275 48 84.1978 48C81.917 48 79.6729 47.45 77.6415 46.4012C76.7908 47.3986 75.5441 48 74.1947 48C71.6792 48 69.6331 45.9245 69.6331 43.3797V4.62032C69.6331 2.07548 71.6792 0 74.1947 0C76.7101 0 78.7562 2.07548 78.7562 4.62032V15.1224C80.487 14.411 82.3351 14.037 84.1978 14.037C92.2282 14.037 98.7551 20.6888 98.7551 28.866ZM84.1978 23.285C81.1983 23.285 78.7562 25.7858 78.7562 28.866C78.7562 29.35 78.7562 33.0536 78.7709 33.5743C78.9469 36.4565 81.3303 38.752 84.1978 38.752C87.0653 38.752 89.434 36.4712 89.6247 33.5523C89.6247 32.929 89.6394 29.328 89.6394 28.866C89.6394 25.7858 87.1973 23.285 84.1978 23.285ZM14.3887 14.037C12.6139 14.037 10.8612 14.3597 9.21109 14.9757V4.62766C9.21109 2.08281 7.14299 0.00733401 4.60554 0.00733401C2.06809 0.00733401 0 2.08281 0 4.62766V43.3797C0 45.9319 2.06809 48 4.60554 48C7.14299 48 9.21109 45.9245 9.21109 43.3797V26.5412C9.40176 26.3358 11.1178 23.285 14.3887 23.285C17.4395 23.285 19.9182 25.7858 19.9182 28.866C19.9182 29.482 19.9182 42.529 19.9036 43.2623C19.8376 45.7852 21.759 47.868 24.2524 47.9927C24.3404 47.9927 24.4211 47.9927 24.5091 47.9927C26.9586 47.9927 28.9753 46.0639 29.1 43.607C29.122 43.2257 29.122 29.0053 29.122 28.866C29.122 20.6888 22.5144 14.037 14.3887 14.037ZM136.399 14.037H133.7V4.62032C133.7 2.07548 131.61 0 129.036 0C126.462 0 124.372 2.07548 124.372 4.62032V14.037H121.673C119.106 14.037 117.009 16.1125 117.009 18.6646C117.009 21.2168 119.099 23.285 121.673 23.285H124.372V43.3797C124.372 45.9319 126.462 48 129.036 48C131.61 48 133.7 45.9245 133.7 43.3797V23.285H136.399C138.973 23.285 141.063 21.2095 141.063 18.6646C141.063 16.1198 138.973 14.037 136.399 14.037Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

@@ -0,0 +1,48 @@
<svg width="53" height="53" viewBox="0 0 53 53" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.4728 37.2881L31.0401 40.6634C30.8722 41.0588 30.533 41.3618 30.1106 41.4581C25.4964 42.5161 15.7591 38.3829 13.3131 34.3281C13.0907 33.958 13.073 33.5035 13.2408 33.108L14.6735 29.7328C15.9802 26.6545 18.829 24.3765 21.9907 23.6412C22.9143 23.4268 23.3484 22.4041 22.8611 21.5907C21.1937 18.8056 20.8534 15.174 22.16 12.0957L23.5927 8.72043C23.7606 8.32501 24.0998 8.02203 24.5199 7.92663C29.1358 6.86935 38.8731 11.0026 41.3173 15.0567C41.5422 15.4259 41.5599 15.8804 41.392 16.2758L39.9593 19.651C38.6527 22.7293 35.8039 25.0073 32.6422 25.7426C31.7185 25.957 31.2844 26.9797 31.7718 27.7931C33.4392 30.5782 33.7795 34.2099 32.4728 37.2881Z" fill="#A9DCF6" fill-opacity="0.8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.664 12.0938C29.7729 10.8666 27.3007 10.4316 25.8346 10.5102L24.7036 13.1747C23.7617 15.3938 23.9622 18.0859 25.2286 20.2007C25.9064 21.3331 26.0063 22.7223 25.4978 23.9203C24.9893 25.1182 23.9206 26.0114 22.6375 26.3096C20.2342 26.8686 18.1583 28.5945 17.2171 30.8118L16.0854 33.478C17.0473 34.5873 19.0775 36.0634 21.9686 37.2906C24.8596 38.5178 27.3318 38.9528 28.7979 38.8742L29.9297 36.208C30.8709 33.9906 30.6703 31.2985 29.4039 29.1837C28.7261 28.0513 28.6263 26.662 29.1348 25.4641C29.6433 24.2662 30.7119 23.3729 31.9957 23.0732C34.3983 22.5158 36.4742 20.7899 37.4162 18.5709L38.5472 15.9064C37.5853 14.7971 35.555 13.321 32.664 12.0938Z" fill="white" fill-opacity="0.9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M31.5684 13.8635C33.7371 14.784 35.9512 15.9582 35.7471 16.4997C35.5853 16.9371 35.2218 17.7653 33.0852 17.902C31.0091 18.0368 30.0196 19.4736 29.0902 19.0791C28.0092 18.6202 28.3314 17.6878 27.3948 16.2289C26.429 14.7261 26.743 13.3826 26.9685 12.8935C27.2828 12.2137 29.3996 12.9429 31.5684 13.8635Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.3942 16.2291C26.4285 14.7263 26.7424 13.3828 26.9679 12.8937C27.2164 12.3553 28.5959 12.7006 30.2369 13.3243C29.6862 13.3623 28.8925 13.5984 28.6315 14.6159C28.3585 15.6755 29.4738 17.4486 28.8447 18.2192C28.7229 18.3703 28.5806 18.4714 28.4271 18.5381C28.0907 18.0153 28.0509 17.2522 27.3942 16.2291Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.3429 26.9852C27.003 27.2653 26.6667 28.5305 27.3103 29.6779C28.1003 31.0844 28.7422 32.6761 28.3659 34.4146C28.0561 35.8466 27.757 35.9145 27.4109 35.8779C27.0665 35.842 24.5481 35.2396 22.4522 33.773C20.3546 32.3057 19.4609 30.8532 20.0783 30.0166C20.6666 29.2207 21.6339 28.7393 23.1921 28.369C24.6835 28.0155 25.6829 26.705 26.3429 26.9852Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.4114 35.8785C27.0653 35.8419 24.5469 35.2396 22.451 33.773C20.7841 32.6066 19.878 31.4501 19.8876 30.6036C19.8956 30.5893 19.9037 30.575 19.9144 30.5637C20.2509 30.1316 22.3027 30.658 24.5368 32.0612C26.6666 33.3964 28.1998 34.9294 27.8338 35.7684C27.6986 35.8902 27.5598 35.8942 27.4114 35.8785Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.80368 18.2264L8.2016e-05 20.1109L3.80368 21.9953L5.70549 25.7643L7.60729 21.9953L11.4109 20.1109L7.60729 18.2264L5.70549 14.4574L3.80368 18.2264Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M9.27148 20.1109L6.89423 21.2887L5.70561 20.1109H9.27148Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M5.70542 16.5775L6.89404 18.933L5.70542 20.1108V16.5775Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M2.13969 20.1108L4.51694 18.933L5.70557 20.1108H2.13969Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M5.70557 23.6443L4.51694 21.2887L5.70557 20.1109V23.6443Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M2.13969 20.1109L4.51694 21.2887L5.70557 20.1109H2.13969Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M5.70557 16.5775L4.51694 18.933L5.70557 20.1108V16.5775Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M9.27148 20.1108L6.89423 18.933L5.70561 20.1108H9.27148Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M5.70542 23.6443L6.89404 21.2887L5.70542 20.1109V23.6443Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.27609 19.5455L7.36963 20.1109L6.27609 20.6762L5.70555 21.7598L5.13501 20.6762L4.04148 20.1109L5.13501 19.5455L5.70555 18.4619L6.27609 19.5455Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.8625 1.53112L11.3172 2.29668L12.8625 3.06225L13.6351 4.59338L14.4077 3.06225L15.9529 2.29668L14.4077 1.53112L13.6351 -1.81198e-05L12.8625 1.53112Z" fill="#BDA8FF"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M15.0837 2.29667L14.118 2.77515L13.6351 2.29667H15.0837Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M13.635 0.861193L14.1179 1.81815L13.635 2.29663V0.861193Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M12.1864 2.29663L13.1521 1.81815L13.635 2.29663H12.1864Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M13.635 3.73218L13.1521 2.77522L13.635 2.29674V3.73218Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M12.1864 2.29667L13.1521 2.77515L13.635 2.29667H12.1864Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M13.635 0.861193L13.1521 1.81815L13.635 2.29663V0.861193Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M15.0837 2.29663L14.118 1.81815L13.6351 2.29663H15.0837Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M13.635 3.73218L14.1179 2.77522L13.635 2.29674V3.73218Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M13.8668 2.06701L14.311 2.29668L13.8668 2.52635L13.635 2.96655L13.4032 2.52635L12.959 2.29668L13.4032 2.06701L13.635 1.62681L13.8668 2.06701Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M48.2455 29.7042L45.8682 30.882L48.2455 32.0598L49.4341 34.4154L50.6227 32.0598L53 30.882L50.6227 29.7042L49.4341 27.3486L48.2455 29.7042Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M51.6628 30.882L50.1771 31.6182L49.4342 30.882H51.6628Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M49.4341 28.6737L50.177 30.146L49.4341 30.8821V28.6737Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M47.2054 30.8821L48.6912 30.146L49.4341 30.8821H47.2054Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M49.4341 33.0903L48.6912 31.6181L49.4341 30.882V33.0903Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M47.2054 30.882L48.6912 31.6182L49.4341 30.882H47.2054Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M49.4341 28.6737L48.6912 30.146L49.4341 30.8821V28.6737Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M51.6628 30.8821L50.1771 30.146L49.4342 30.8821H51.6628Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M49.4341 33.0903L50.177 31.6181L49.4341 30.882V33.0903Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M49.7907 30.5287L50.4741 30.882L49.7907 31.2354L49.4341 31.9126L49.0775 31.2354L48.394 30.882L49.0775 30.5287L49.4341 29.8515L49.7907 30.5287Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.9456 43.5776L35.1911 45.9332L39.9456 48.2888L42.3228 53L44.7001 48.2888L49.4546 45.9332L44.7001 43.5776L42.3228 38.8665L39.9456 43.5776Z" fill="#6133B4"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.7803 45.9333L43.8087 47.4055L42.3229 45.9333H46.7803Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M42.3228 41.5165L43.8086 44.461L42.3228 45.9332V41.5165Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M37.8654 45.9332L40.837 44.461L42.3228 45.9332H37.8654Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M42.3228 50.35L40.837 47.4055L42.3228 45.9332V50.35Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M37.8654 45.9333L40.837 47.4055L42.3228 45.9333H37.8654Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M42.3228 41.5165L40.837 44.461L42.3228 45.9332V41.5165Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.7803 45.9332L43.8087 44.461L42.3229 45.9332H46.7803Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M42.3228 50.35L43.8086 47.4055L42.3228 45.9332V50.35Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M43.0359 45.2266L44.4028 45.9332L43.0359 46.6399L42.3227 47.9944L41.6096 46.6399L40.2426 45.9332L41.6096 45.2266L42.3227 43.8721L43.0359 45.2266Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 9.0 KiB

@@ -0,0 +1,48 @@
<svg width="53" height="53" viewBox="0 0 53 53" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.5272 37.2881L22.9599 40.6634C23.1278 41.0588 23.467 41.3618 23.8894 41.4581C28.5036 42.5161 38.2409 38.3829 40.6869 34.3281C40.9093 33.958 40.927 33.5035 40.7592 33.108L39.3265 29.7328C38.0198 26.6545 35.171 24.3765 32.0093 23.6412C31.0857 23.4268 30.6516 22.4041 31.1389 21.5907C32.8063 18.8056 33.1466 15.174 31.84 12.0957L30.4073 8.72043C30.2394 8.32501 29.9002 8.02203 29.4801 7.92663C24.8642 6.86935 15.1269 11.0026 12.6827 15.0567C12.4578 15.4259 12.4401 15.8804 12.608 16.2758L14.0407 19.651C15.3473 22.7293 18.1961 25.0073 21.3578 25.7426C22.2815 25.957 22.7156 26.9797 22.2282 27.7931C20.5608 30.5782 20.2205 34.2099 21.5272 37.2881Z" fill="#A9DCF6" fill-opacity="0.8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.336 12.0938C24.2271 10.8666 26.6993 10.4316 28.1654 10.5102L29.2964 13.1747C30.2383 15.3938 30.0378 18.0859 28.7714 20.2007C28.0936 21.3331 27.9937 22.7223 28.5022 23.9203C29.0107 25.1182 30.0794 26.0114 31.3625 26.3096C33.7658 26.8686 35.8417 28.5945 36.7829 30.8118L37.9146 33.478C36.9527 34.5873 34.9225 36.0634 32.0314 37.2906C29.1404 38.5178 26.6682 38.9528 25.2021 38.8742L24.0703 36.208C23.1291 33.9906 23.3297 31.2985 24.5961 29.1837C25.2739 28.0513 25.3737 26.662 24.8652 25.4641C24.3567 24.2662 23.2881 23.3729 22.0043 23.0732C19.6017 22.5158 17.5258 20.7899 16.5838 18.5709L15.4528 15.9064C16.4147 14.7971 18.445 13.321 21.336 12.0938Z" fill="white" fill-opacity="0.9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.4316 13.8635C20.2629 14.784 18.0488 15.9582 18.2529 16.4997C18.4147 16.9371 18.7782 17.7653 20.9148 17.902C22.9909 18.0368 23.9804 19.4736 24.9098 19.0791C25.9908 18.6202 25.6686 17.6878 26.6052 16.2289C27.571 14.7261 27.257 13.3826 27.0315 12.8935C26.7172 12.2137 24.6004 12.9429 22.4316 13.8635Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.6058 16.2291C27.5715 14.7263 27.2576 13.3828 27.0321 12.8937C26.7836 12.3553 25.4041 12.7006 23.7631 13.3243C24.3138 13.3623 25.1075 13.5984 25.3685 14.6159C25.6415 15.6755 24.5262 17.4486 25.1553 18.2192C25.2771 18.3703 25.4194 18.4714 25.5729 18.5381C25.9093 18.0153 25.9491 17.2522 26.6058 16.2291Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.6571 26.9852C26.997 27.2653 27.3333 28.5305 26.6897 29.6779C25.8997 31.0844 25.2578 32.6761 25.6341 34.4146C25.9439 35.8466 26.243 35.9145 26.5891 35.8779C26.9335 35.842 29.4519 35.2396 31.5478 33.773C33.6454 32.3057 34.5391 30.8532 33.9217 30.0166C33.3334 29.2207 32.3661 28.7393 30.8079 28.369C29.3165 28.0155 28.3171 26.705 27.6571 26.9852Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.5886 35.8785C26.9347 35.8419 29.4531 35.2396 31.549 33.773C33.2159 32.6066 34.122 31.4501 34.1124 30.6036C34.1044 30.5893 34.0963 30.575 34.0856 30.5637C33.7491 30.1316 31.6973 30.658 29.4632 32.0612C27.3334 33.3964 25.8002 34.9294 26.1662 35.7684C26.3014 35.8902 26.4402 35.8942 26.5886 35.8785Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 30L15 32.5L10 35L7.5 40L5 35L0 32.5L5 30L7.5 25L10 30Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M3 32L6.33333 34L8 32H3Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M8 27L6 30.3333L8 32L8 27Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M12 32L8.66667 30L7 32H12Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M7 37L9 33.6667L7 32L7 37Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M12 32L8.66667 34L7 32H12Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M7 27L9 30.3333L7 32L7 27Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M3 32L6.33333 30L8 32H3Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M8 37L6 33.6667L8 32L8 37Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.31429 31.3143L5 32L6.31429 32.6857L7 34L7.68571 32.6857L9 32L7.68571 31.3143L7 30L6.31429 31.3143Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.3333 47.6667L21 49L18.3333 50.3333L17 53L15.6667 50.3333L13 49L15.6667 47.6667L17 45L18.3333 47.6667Z" fill="#BDA8FF"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M14 49L16 50L17 49H14Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17 46L16 48L17 49V46Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20 49L18 48L17 49H20Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17 52L18 50L17 49V52Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20 49L18 50L17 49H20Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17 46L18 48L17 49V46Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14 49L16 48L17 49H14Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17 52L16 50L17 49V52Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M16.9857 48.9857L16 49.5L16.9857 50.0143L17.5 51L18.0143 50.0143L19 49.5L18.0143 48.9857L17.5 48L16.9857 48.9857Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M40 2L42 3L40 4L39 6L38 4L36 3L38 2L39 0L40 2Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M37 3L38.3333 4L39 3H37Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M39 1L38 2.33333L39 3V1Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M41 3L39.6667 2L39 3L41 3Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M39 5L40 3.66667L39 3V5Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M41 3L39.6667 4L39 3H41Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M39 1L40 2.33333L39 3V1Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M37 3L38.3333 2L39 3L37 3Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M39 5L38 3.66667L39 3V5Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M38.6571 2.65714L38 3L38.6571 3.34286L39 4L39.3429 3.34286L40 3L39.3429 2.65714L39 2L38.6571 2.65714Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M49 21L53 23L49 25L47 29L45 25L41 23L45 21L47 17L49 21Z" fill="#6133B4"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M43 23L45.6667 24L47 23H43Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46 19L45 21.6667L46 23V19Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M50 23L47.3333 22L46 23H50Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M47 27L48 24.3333L47 23V27Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M50 23L47.3333 24L46 23H50Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M47 19L48 21.6667L47 23V19Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M43 23L45.6667 22L47 23H43Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46 27L45 24.3333L46 23V27Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.3143 21.9857L45 22.5L46.3143 23.0143L47 24L47.6857 23.0143L49 22.5L47.6857 21.9857L47 21L46.3143 21.9857Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

@@ -0,0 +1,9 @@
<svg width="38" height="44" viewBox="0 0 38 44" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="38" height="44" fill="url(#pattern0_1325_164)"/>
<defs>
<pattern id="pattern0_1325_164" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_1325_164" transform="scale(0.0263158 0.0227273)"/>
</pattern>
<image id="image0_1325_164" width="38" height="44" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAsCAYAAAAJpsrIAAAAAXNSR0IArs4c6QAAAn5JREFUWAnV1T1uFEEUBOAJwDEHICBFWomEE5BwDbiCAydOLRGSkRGQOOIYRGRIyEcgIbGFZIeN2tpvtBRqesx4lwbpqfb9Vm0xO56mzr9y87bUaI09fjCVGq2+em+ux+POjL2FHqFDvbkejzvT9fdXpcaLzXQbc2P7AdHp5qLUkPfmpunW3d8cxoM378y5AQtzY/uBkIMLuzifSg2CCE1Bn95flRrq5qH68dPPpYZ5zrlrPnnVZ8wBBxBxCpH6fGD7Qf3ehPkvJNDDiYiwFNwSZs4X4Zi7ePDmnTk3YMGBfy6MQgKhbw4JJ9geVDdnD7oL7XXRAnQQIiQgD6qbswfdhbm/OHcgiQjIQ+qE2HMn5/86dxABQgLysLo5e+7k/OrcYYiYEKhuDq4W0DqAABJAEFQ3B1t3V9cRv35+Xmp4gbbw7Nm3UsP7a7WA1oHhhKUgjnHi45vLshvqHIPqrS9+5/rBhSHsKTXHKe5w4MPJZdkNdXN3dgzhMMIIyj/SBOonbp48KjV23amfXx4d/RLZ56D7TUQ4rDAvQgI54lnyfpJDc+9OvpQ/BQOaDmXDwrDCfnx9WGpwwK8nnco8nbOfmIZ0c44NJ4xyAjkC0zlznIKezXwk5PbwLUaLBMHhhHEiBfoC+hyB6Zy6vcVOGbRICGI558zpI4Z7E4aQIEiQ3JwfDWGJ+vYZsRgtIiQA6svNIU5Bcn37iwUZtIgQEqIv14cEeH/J8xHAtxgRI4KE6Mv1ISH3Lsw3IAAiJkhdrg8J01/t2PDCUiAnOCBvObc3x4YXlgI5lMhJuHfHhhdGYCLnPHMc8ys8mHP/jTBCOZfY6qvvHVOQHLEcqvfwJ8mbnKIO4lmnAAAAAElFTkSuQmCC"/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,52 @@
<svg width="41" height="61" viewBox="0 0 41 61" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.53642 4.26827L12.8046 6.40237L8.53642 8.53648L6.40232 12.8047L4.26821 8.53648L0 6.40237L4.26821 4.26827L6.40232 5.72205e-05L8.53642 4.26827Z" fill="#6133B4"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M2.40088 6.40239L5.06851 7.73621L6.40233 6.40239H2.40088Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M6.4023 2.4009L5.06848 5.06853L6.4023 6.40234V2.4009Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M10.4038 6.40234L7.73616 5.06853L6.40234 6.40234L10.4038 6.40234Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M6.40234 10.4038L7.73616 7.73618L6.40234 6.40236L6.40234 10.4038Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M10.4038 6.40239L7.73616 7.73621L6.40234 6.40239H10.4038Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.40234 2.4009L7.73616 5.06853L6.40234 6.40234L6.40234 2.4009Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M2.40088 6.40234L5.06851 5.06853L6.40233 6.40234L2.40088 6.40234Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.4023 10.4038L5.06848 7.73618L6.4023 6.40236V10.4038Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M5.76208 5.7622L4.53497 6.40243L5.76208 7.04267L6.40232 8.26978L7.04255 7.04267L8.26966 6.40243L7.04255 5.7622L6.40232 4.53509L5.76208 5.7622Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M37.5385 14.2663L39.8368 15.4154L37.5385 16.5645L36.3894 18.8628L35.2402 16.5645L32.942 15.4154L35.2402 14.2663L36.3894 11.968L37.5385 14.2663Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M34.2347 15.4153L35.6712 16.1335L36.3894 15.4153H34.2347Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M36.3894 13.2608L35.6711 14.6972L36.3894 15.4154V13.2608Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M38.544 15.4154L37.1076 14.6972L36.3893 15.4154H38.544Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M36.3893 17.5701L37.1076 16.1337L36.3893 15.4154V17.5701Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M38.544 15.4153L37.1076 16.1335L36.3893 15.4153H38.544Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M36.3893 13.2608L37.1076 14.6972L36.3893 15.4154V13.2608Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M34.2347 15.4154L35.6712 14.6972L36.3894 15.4154H34.2347Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M36.3894 17.5701L35.6711 16.1337L36.3894 15.4154V17.5701Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M36.0446 15.0707L35.3839 15.4154L36.0446 15.7601L36.3893 16.4209L36.7341 15.7601L37.3948 15.4154L36.7341 15.0707L36.3893 14.4099L36.0446 15.0707Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.5354 28.2693L25.7885 30.8959L20.5354 33.5225L17.9088 38.7756L15.2822 33.5225L10.029 30.8959L15.2822 28.2693L17.9088 23.0161L20.5354 28.2693Z" fill="#BDA8FF"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M12.9839 30.8959L16.2671 32.5375L17.9087 30.8959H12.9839Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.9088 25.971L16.2672 29.2543L17.9088 30.8959V25.971Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M22.8336 30.8959L19.5504 29.2543L17.9088 30.8959H22.8336Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.9088 35.8207L19.5504 32.5374L17.9088 30.8958V35.8207Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M22.8336 30.8959L19.5504 32.5375L17.9088 30.8959H22.8336Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.9088 25.971L19.5504 29.2543L17.9088 30.8959V25.971Z" fill="#925CF3"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M12.9839 30.8959L16.2671 29.2543L17.9087 30.8959H12.9839Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.9088 35.8207L16.2672 32.5374L17.9088 30.8958V35.8207Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.1208 30.1078L15.6105 30.8958L17.1208 31.6838L17.9087 33.1941L18.6967 31.6838L20.207 30.8958L18.6967 30.1078L17.9087 28.5976L17.1208 30.1078Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.53742 54.2673L10.8207 55.9089L7.53742 57.5505L5.8958 60.8337L4.25419 57.5505L0.970947 55.9089L4.25419 54.2673L5.8958 50.984L7.53742 54.2673Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M2.81775 55.9089L4.86977 56.9349L5.89579 55.9089H2.81775Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M5.89582 52.8309L4.86981 54.8829L5.89582 55.9089V52.8309Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M8.97385 55.9089L6.92183 54.8829L5.89581 55.9089H8.97385Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M5.89581 58.9869L6.92183 56.9349L5.89581 55.9089V58.9869Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M8.97385 55.9089L6.92183 56.9349L5.89581 55.9089H8.97385Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M5.89581 52.8309L6.92183 54.8829L5.89581 55.9089V52.8309Z" fill="#6133B4"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M2.81775 55.9089L4.86977 54.8829L5.89579 55.9089H2.81775Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M5.89582 58.9869L4.86981 56.9349L5.89582 55.9089V58.9869Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M5.40334 55.4164L4.45941 55.9089L5.40334 56.4014L5.89583 57.3453L6.38831 56.4014L7.33225 55.9089L6.38831 55.4164L5.89583 54.4725L5.40334 55.4164Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M37.5374 44.2673L40.8207 45.9089L37.5374 47.5505L35.8958 50.8337L34.2542 47.5505L30.9709 45.9089L34.2542 44.2673L35.8958 40.984L37.5374 44.2673Z" fill="#6133B4"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M32.8177 45.9089L34.8698 46.9349L35.8958 45.9089H32.8177Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M35.8958 42.8309L34.8698 44.8829L35.8958 45.9089V42.8309Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M38.9738 45.9089L36.9218 44.8829L35.8958 45.9089H38.9738Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M35.8958 48.9869L36.9218 46.9349L35.8958 45.9089V48.9869Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M38.9738 45.9089L36.9218 46.9349L35.8958 45.9089H38.9738Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M35.8958 42.8309L36.9218 44.8829L35.8958 45.9089V42.8309Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M32.8177 45.9089L34.8698 44.8829L35.8958 45.9089H32.8177Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M35.8958 48.9869L34.8698 46.9349L35.8958 45.9089V48.9869Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M35.4033 45.4164L34.4594 45.9089L35.4033 46.4014L35.8958 47.3453L36.3883 46.4014L37.3322 45.9089L36.3883 45.4164L35.8958 44.4725L35.4033 45.4164Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

@@ -0,0 +1,19 @@
<svg width="60" height="58" viewBox="0 0 60 58" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect x="38" y="6" width="22" height="26" fill="url(#pattern0_1327_256)"/>
<rect width="26" height="26" fill="url(#pattern1_1327_256)"/>
<rect x="8" y="36" width="30" height="22" fill="url(#pattern2_1327_256)"/>
<defs>
<pattern id="pattern0_1327_256" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_1327_256" transform="scale(0.0454545 0.0384615)"/>
</pattern>
<pattern id="pattern1_1327_256" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image1_1327_256" transform="scale(0.0384615)"/>
</pattern>
<pattern id="pattern2_1327_256" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image2_1327_256" transform="scale(0.0333333 0.0454545)"/>
</pattern>
<image id="image0_1327_256" width="22" height="26" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAaCAYAAACzdqxAAAAAAXNSR0IArs4c6QAAAQlJREFUSA290k1qwlAUxfFsp+soXYdzoeAaWqFbcSx14LTQSbuAjruLVgdPnvArcsIjRlOFy8n9+t9jSNcN/B7u7stpDIyf3z6F1ufzN2MyQfvf91LjZ7s6RvZjvZ3m4tVgwN36q9TgkKrT7+ePUsNe06oBi4BUnQ6CE2iBAqXqU5w/5woWDVL1VH2K0wMbAHibfZYa6i01dzsw6y7m5+UfcMxhS3FwO4XJwICc5efFaeqg45uB05m85VCdwd679SqAUgFa2gQDWTQoT82+vOd4crALLtKszx8XpUarb76nFqgB+cVgoFTgp+VLqSHPudE50L+B16+bUsOh0Q5zAWhysEMOyCfTseADSSC3nu5iFacAAAAASUVORK5CYII="/>
<image id="image1_1327_256" width="26" height="26" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAASlJREFUSA3F1DFOw0AQBVDTRhSp6RHUaVLQcAWOECkNR6HiPtRcJl1KqBZtpEfxjbWrxA6WRl8znvl//q7lYYjnbnNb/gpt+e75fV1qqOtrooFEg1k/WygJ73c3pQYB+cUC/y6UTjh6225Ljd0wnMKi3ZhHNZsQYohYvv94LDXUOTm+vpQaXw9Pp1CfdIQQIpRfLIQQOnvEMOv6OWk6MwCTcHYhRwRTwAKJ7uT781BqcKj+e1ecEICzCyGmvFmtSg2bE7Rpbq7P+8m7upoQJ5AjZ5wb2xymg3Q8+ce4upCNc8OWA3Ow6Ujj4kLuiCBsCafjpqPFhaa+vl5hjvX7uPCOUIMB6Agh4sz14xkJZEEjdOaIWmgueUe5RriYUCoT7MWc7857BfQh/gFCaNQahl2u3gAAAABJRU5ErkJggg=="/>
<image id="image2_1327_256" width="30" height="22" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWCAYAAADXYyzPAAAAAXNSR0IArs4c6QAAARRJREFUSA3F08FtAjEUBFCagAYSKd3QAsUgcUkDqSO31JBjLrnSBlJk5MOD1Wgt7Ro5IH2N/cee+bPsbjaDf68vb2Vag+3u8lPTur4zK1cpZJ8y+h+H71LLPs8t3hNITAF8tzEB+PlzKdP6Pf+VWvjE0/6r1Fo9QApNTet6uDHD4/u5zBXeoJm0OzHhOdPawz9sTIBgGnrEyevvtttSi05ivoy3vYMpbAAGyes/bEzIf8YItgYx+C3J0oWLw4wZJHpUkkksoX4inl4zqAOJ/2bsO4MSGkgyifBQ3/lmUoSDDCFB/HDjNGQMDQC9fHgoWBMdbCXFQ4aw29hEhA1gj4f6ifjVSOhpxgZYPXnvBYawV2fpvStxGFyuIXWsWQAAAABJRU5ErkJggg=="/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,26 +1,29 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 39 44">
<g fill="none" fill-rule="evenodd">
<path fill="#24CC8F" d="M2.782 35.927l1.867-8.397 12.887-5.47 7.338 4.49-5.967 16.655z"/>
<path fill="#FFF" d="M9.147 33.008L6.351 28.98l5.523-2.344zM18.352 29.1l-.955-4.808-5.523 2.344z" opacity=".25"/>
<path fill="#FFF" d="M9.147 33.008l2.727-6.372 6.478 2.465zM5.097 34.727L6.35 28.98l2.796 4.028z" opacity=".5"/>
<path fill="#1B996B" d="M22.402 27.382l-5.005-3.09.955 4.809zM5.097 34.727l4.05-1.719 8.627 7.528z" opacity=".35"/>
<path fill="#FFF" d="M22.402 27.382l-4.05 1.719-.578 11.435z" opacity=".5"/>
<path fill="#FFF" d="M9.147 33.008l9.205-3.907-.578 11.435z" opacity=".25"/>
<g>
<path fill="#24CC8F" d="M23.248 7.266l4.784-3.162 8.714 3.345 1.44 5.55-10.575 5.225z"/>
<path fill="#FFF" d="M27.653 8.814l.524-3.227 3.734 1.434zM33.876 11.203l1.77-2.749-3.735-1.433z" opacity=".25"/>
<path fill="#FFF" d="M27.653 8.814L31.91 7.02l1.965 4.182zM24.914 7.763l3.263-2.176-.524 3.227z" opacity=".5"/>
<path fill="#1B996B" d="M36.615 12.254l-.97-3.8-1.769 2.749zM24.914 7.763l2.739 1.05.65 7.606z" opacity=".35"/>
<path fill="#FFF" d="M36.615 12.254l-2.739-1.051-5.572 5.216z" opacity=".5"/>
<path fill="#FFF" d="M27.653 8.814l6.223 2.389-5.572 5.216z" opacity=".25"/>
</g>
<g>
<path fill="#24CC8F" d="M.815 5.996l1.58-4L9.185.301l3.273 2.791-4.25 7.758z"/>
<path fill="#FFF" d="M4.187 5.052L3.121 2.845l2.911-.726zM9.039 3.843l-.096-2.45-2.91.726z" opacity=".25"/>
<path fill="#FFF" d="M4.187 5.052L6.032 2.12 9.04 3.843zM2.053 5.585l1.068-2.74 1.066 2.207z" opacity=".5"/>
<path fill="#1B996B" d="M11.173 3.31l-2.23-1.917.096 2.45zM2.053 5.585l2.134-.533L7.86 9.445z" opacity=".35"/>
<path fill="#FFF" d="M11.173 3.31l-2.134.533-1.18 5.602z" opacity=".5"/>
<path fill="#FFF" d="M4.187 5.052l4.852-1.21-1.18 5.603z" opacity=".25"/>
</g>
</g>
<svg width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.89107 26.3989L14.4076 18.6441L33.6795 23.9114L37.9287 35.4286L16.5188 48.8092L4.89107 26.3989Z" fill="#24CC8F"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M14.6023 28.7572L15.0317 21.7734L23.2911 24.0309L14.6023 28.7572Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M28.368 32.5196L31.5505 26.2883L23.2911 24.0309L28.368 32.5196Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14.6023 28.7573L23.2911 24.031L28.368 32.5197L14.6023 28.7573Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M8.54539 27.1018L15.0317 21.7735L14.6023 28.7572L8.54539 27.1018Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M34.4249 34.1751L31.5505 26.2883L28.368 32.5196L34.4249 34.1751Z" fill="#1B996B"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M8.54541 27.1018L14.6023 28.7572L17.6099 44.8171L8.54541 27.1018Z" fill="#1B996B"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M34.4249 34.175L28.368 32.5196L17.6099 44.8171L34.4249 34.175Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M14.6023 28.7573L28.368 32.5197L17.6099 44.8172L14.6023 28.7573Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.2974 3.46554L14.2627 0.349942L21.1938 1.32978L23.1792 5.14526L16.3285 10.7414L11.2974 3.46554Z" fill="#24CC8F"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M14.7769 3.85639L14.6178 1.41003L17.5882 1.82996L14.7769 3.85639Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M19.7277 4.55627L20.5587 2.24989L17.5883 1.82996L19.7277 4.55627Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14.7769 3.85647L17.5882 1.83004L19.7277 4.55636L14.7769 3.85647Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M12.5986 3.54849L14.6178 1.41008L14.7769 3.85644L12.5986 3.54849Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M21.906 4.86425L20.5587 2.24992L19.7277 4.5563L21.906 4.86425Z" fill="#1B996B"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M12.5986 3.54846L14.7769 3.85641L16.5314 9.30565L12.5986 3.54846Z" fill="#1B996B"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M21.906 4.86431L19.7277 4.55636L16.5314 9.30572L21.906 4.86431Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M14.7769 3.85645L19.7277 4.55633L16.5314 9.30568L14.7769 3.85645Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.8389 13.9788L33.0633 6.97062L44.4487 3.28717L50.3566 7.66432L44.0181 21.3937L30.8389 13.9788Z" fill="#24CC8F"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M36.4789 11.9744L34.4028 8.33398L39.2822 6.75536L36.4789 11.9744Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M44.6113 9.3434L44.1617 5.17675L39.2822 6.75537L44.6113 9.3434Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M36.4789 11.9745L39.2822 6.75541L44.6113 9.34344L36.4789 11.9745Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M32.9007 13.1321L34.4028 8.33396L36.4789 11.9744L32.9007 13.1321Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M48.1896 8.18571L44.1617 5.17672L44.6113 9.34337L48.1896 8.18571Z" fill="#1B996B"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M32.9007 13.1321L36.4789 11.9744L43.2551 19.0353L32.9007 13.1321Z" fill="#1B996B"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M48.1896 8.18576L44.6113 9.34342L43.2551 19.0353L48.1896 8.18576Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M36.4789 11.9745L44.6113 9.34345L43.2551 19.0353L36.4789 11.9745Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,26 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 47">
<g fill="none" fill-rule="evenodd">
<path fill="#A9DCF6" fill-opacity=".8" d="M25.955 43.329l-.999 2.352a.939.939 0 0 1-.644.555c-3.194.747-9.918-2.107-11.6-4.923a.941.941 0 0 1-.047-.85l.998-2.351c.911-2.146 2.886-3.738 5.074-4.257a.957.957 0 0 0 .607-1.429c-1.147-1.934-1.374-4.46-.463-6.606l.998-2.352a.937.937 0 0 1 .643-.555c3.195-.746 9.919 2.108 11.6 4.924a.935.935 0 0 1 .049.848l-.999 2.353c-.91 2.145-2.886 3.737-5.074 4.256a.957.957 0 0 0-.606 1.429c1.146 1.934 1.373 4.46.463 6.606"/>
<path fill="#FFF" fill-opacity=".9" d="M26.145 25.795c-1.997-.848-3.705-1.145-4.72-1.087l-.788 1.857c-.656 1.547-.524 3.42.347 4.889.466.786.532 1.753.178 2.588a2.881 2.881 0 0 1-1.983 1.669c-1.664.395-3.103 1.6-3.76 3.146l-.788 1.858c.663.77 2.063 1.792 4.06 2.64 1.996.847 3.705 1.144 4.719 1.086l.789-1.858c.656-1.545.523-3.418-.348-4.887a2.883 2.883 0 0 1-.178-2.588 2.886 2.886 0 0 1 1.984-1.67c1.663-.394 3.103-1.6 3.759-3.146l.788-1.857c-.662-.77-2.063-1.793-4.06-2.64"/>
<path fill="#9A62FF" d="M25.383 27.029c1.497.636 3.026 1.448 2.883 1.825-.112.305-.366.882-1.844.982-1.436.098-2.123 1.1-2.765.828-.746-.317-.521-.966-1.166-1.98-.664-1.043-.444-1.979-.287-2.32.219-.473 1.681.03 3.179.665"/>
<path fill="#4F2A93" d="M22.491 28.685c-.664-1.044-.444-1.98-.287-2.32.173-.376 1.126-.139 2.26.292-.382.027-.93.194-1.114.902-.19.738.576 1.97.14 2.507a.755.755 0 0 1-.29.223c-.231-.363-.257-.894-.709-1.604"/>
<path fill="#9A62FF" d="M21.74 36.173c.455.193.22 1.074.662 1.871.543.978.984 2.084.72 3.294-.218.998-.425 1.046-.664 1.021-.238-.024-1.979-.438-3.425-1.454-1.447-1.016-2.062-2.025-1.633-2.608.409-.556 1.079-.893 2.157-1.154 1.032-.25 1.727-1.164 2.182-.97"/>
<path fill="#4F2A93" d="M22.458 42.36c-.24-.025-1.98-.439-3.425-1.455-1.15-.807-1.774-1.61-1.766-2.2a.138.138 0 0 1 .019-.027c.233-.302 1.651.06 3.193 1.031 1.47.925 2.526 1.988 2.271 2.573-.093.085-.19.088-.292.077"/>
<g>
<path fill="#A9DCF6" fill-opacity=".8" d="M12.754 15.163l.61 1.59a.626.626 0 0 1-.052.565c-1.185 1.837-5.732 3.582-7.843 3.01a.627.627 0 0 1-.415-.385l-.61-1.59c-.558-1.45-.348-3.129.461-4.39a.638.638 0 0 0-.37-.967c-1.446-.397-2.725-1.503-3.282-2.954l-.61-1.59a.625.625 0 0 1 .05-.564c1.187-1.837 5.734-3.582 7.844-3.01a.623.623 0 0 1 .416.384l.61 1.59c.557 1.45.347 3.129-.462 4.39a.638.638 0 0 0 .371.967c1.446.397 2.725 1.503 3.282 2.954"/>
<path fill="#FFF" fill-opacity=".9" d="M4.725 6.666c-1.35.518-2.307 1.167-2.767 1.665l.482 1.255c.402 1.046 1.333 1.883 2.43 2.184a1.922 1.922 0 0 1 1.284 1.159 1.92 1.92 0 0 1-.178 1.719c-.615.96-.747 2.204-.346 3.249l.483 1.256c.674.062 1.82-.096 3.17-.614 1.349-.518 2.306-1.167 2.765-1.664l-.482-1.257c-.401-1.044-1.332-1.881-2.43-2.182a1.922 1.922 0 0 1-1.284-1.16 1.924 1.924 0 0 1 .178-1.72c.615-.958.747-2.203.346-3.248l-.482-1.256c-.674-.062-1.82.096-3.17.614"/>
<path fill="#9A62FF" d="M4.93 7.61c1.013-.388 2.122-.706 2.229-.46.087.199.233.593-.43 1.325-.643.713-.508 1.512-.942 1.678-.505.194-.698-.222-1.476-.41-.802-.192-1.13-.743-1.212-.979-.115-.328.82-.765 1.832-1.153"/>
<path fill="#4F2A93" d="M4.31 9.744c-.801-.193-1.129-.743-1.211-.98-.091-.26.476-.587 1.219-.906-.17.19-.357.524-.116.948.25.443 1.188.678 1.228 1.138a.503.503 0 0 1-.036.241c-.28-.067-.537-.31-1.083-.44"/>
<path fill="#9A62FF" d="M7.418 13.683c.308-.118.603.413 1.185.59.713.218 1.436.544 1.87 1.247.358.58.28.698.154.797-.125.099-1.15.706-2.315.889-1.165.183-1.926-.016-1.991-.495-.061-.455.104-.927.5-1.552.38-.598.289-1.358.597-1.476"/>
<path fill="#4F2A93" d="M10.628 16.317c-.126.1-1.152.707-2.316.89-.926.144-1.597.048-1.866-.238a.092.092 0 0 1-.004-.022c-.027-.253.82-.736 2.01-.984 1.132-.237 2.132-.217 2.28.182-.006.084-.05.13-.104.172"/>
</g>
<g>
<path fill="#A9DCF6" fill-opacity=".8" d="M32.605 10.804l-.31 1.24a.47.47 0 0 1-.275.324c-1.518.619-5.062-.265-6.113-1.524a.47.47 0 0 1-.09-.416l.31-1.24c.281-1.13 1.132-2.07 2.172-2.498a.479.479 0 0 0 .188-.753c-.718-.866-1.027-2.096-.745-3.226l.309-1.24a.469.469 0 0 1 .274-.324c1.519-.619 5.063.265 6.113 1.524.097.114.127.27.09.415l-.308 1.24c-.282 1.13-1.133 2.071-2.173 2.498a.479.479 0 0 0-.188.754c.718.865 1.027 2.095.746 3.226"/>
<path fill="#FFF" fill-opacity=".9" d="M31.327 2.13c-1.052-.262-1.92-.276-2.416-.168l-.244.98c-.203.814.009 1.729.554 2.386.292.352.4.824.29 1.264a1.44 1.44 0 0 1-.849.98 2.762 2.762 0 0 0-1.61 1.847l-.244.98c.387.328 1.16.723 2.211.986 1.052.262 1.92.275 2.416.167l.244-.98a2.761 2.761 0 0 0-.554-2.385 1.442 1.442 0 0 1-.29-1.265c.11-.44.427-.806.849-.98a2.76 2.76 0 0 0 1.61-1.847l.244-.979c-.387-.328-1.159-.724-2.211-.986"/>
<path fill="#9A62FF" d="M31.047 2.799c.79.197 1.608.478 1.567.676-.032.159-.112.464-.834.629-.701.16-.962.71-1.3.625-.394-.098-.334-.436-.731-.886-.41-.464-.375-.943-.324-1.124.071-.25.833-.117 1.622.08"/>
<path fill="#4F2A93" d="M29.749 3.843c-.41-.464-.375-.943-.324-1.124.056-.198.546-.156 1.139-.032-.186.044-.444.169-.48.533-.036.38.44.927.266 1.227a.378.378 0 0 1-.126.133c-.143-.161-.197-.422-.475-.737"/>
<path fill="#9A62FF" d="M29.963 7.6c.24.06.193.513.474.872.344.44.648.952.613 1.57-.03.51-.128.55-.248.556-.12.007-1.012-.061-1.805-.45-.794-.388-1.177-.838-1.01-1.16.158-.306.462-.525.974-.739.49-.204.762-.71 1.002-.65"/>
<path fill="#4F2A93" d="M30.802 10.599c-.12.006-1.012-.062-1.806-.45-.63-.31-1.002-.657-1.043-.949a.069.069 0 0 1 .007-.015c.091-.167.82-.1 1.657.26.798.341 1.403.784 1.323 1.092-.04.05-.087.059-.138.062"/>
</g>
</g>
<svg width="39" height="54" viewBox="0 0 39 54" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.2715 47.841L27.8997 51.0729C27.7389 51.4515 27.4157 51.7423 27.014 51.8357C22.6266 52.8619 13.3878 48.9402 11.0765 45.0707C10.8663 44.7175 10.8509 44.283 11.0117 43.9044L12.3835 40.6724C13.6347 37.7249 16.3485 35.5378 19.3549 34.8248C20.2332 34.6169 20.6488 33.6376 20.1883 32.8614C18.6128 30.2035 18.3009 26.732 19.552 23.7844L20.9239 20.5525C21.0846 20.1739 21.4079 19.8832 21.8073 19.7906C26.1963 18.7652 35.4351 22.6868 37.7447 26.5557C37.9572 26.9079 37.9726 27.3425 37.8119 27.7211L36.4401 30.953C35.1889 33.9005 32.475 36.0876 29.4687 36.8006C28.5904 37.0086 28.1747 37.9879 28.6352 38.7641C30.2107 41.4219 30.5227 44.8934 29.2715 47.841Z" fill="#A9DCF6" fill-opacity="0.8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.5322 23.7497C26.7892 22.5854 24.4416 22.1772 23.0484 22.257L21.9654 24.8083C21.0635 26.9331 21.2456 29.5067 22.4422 31.5248C23.0826 32.6056 23.1732 33.9336 22.6863 35.0807C22.1994 36.2277 21.1812 37.0852 19.9611 37.3743C17.6759 37.9164 15.6981 39.5731 14.7969 41.6963L13.7132 44.2492C14.6236 45.3069 16.548 46.712 19.2911 47.8764C22.0341 49.0407 24.3817 49.4489 25.7749 49.3691L26.8586 46.8162C27.7598 44.693 27.5777 42.1194 26.3811 40.1013C25.7407 39.0206 25.6501 37.6925 26.137 36.5454C26.6239 35.3984 27.6421 34.541 28.8628 34.2503C31.1474 33.7098 33.1252 32.053 34.0271 29.9282L35.1101 27.3769C34.1996 26.3192 32.2753 24.9141 29.5322 23.7497Z" fill="white" fill-opacity="0.9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.4856 25.4452C30.5433 26.3187 32.6433 27.4344 32.4477 27.9529C32.2926 28.3716 31.9446 29.1647 29.9141 29.3021C27.9411 29.4375 26.9965 30.8145 26.1146 30.4401C25.089 30.0048 25.3981 29.1122 24.5127 27.7201C23.5998 26.2862 23.9023 25.0005 24.1181 24.5322C24.4189 23.8812 26.4279 24.5718 28.4856 25.4452Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.5124 27.7203C23.5995 26.2864 23.902 25.0008 24.1178 24.5324C24.3555 24.0168 25.6652 24.3427 27.2224 24.9339C26.699 24.9719 25.9442 25.2001 25.693 26.1739C25.4303 27.188 26.4845 28.8798 25.8843 29.6187C25.7681 29.7636 25.6326 29.8607 25.4865 29.925C25.1685 29.4261 25.1331 28.6965 24.5124 27.7203Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.4797 38.0086C24.1059 38.2744 23.7824 39.4852 24.3904 40.5804C25.1366 41.9228 25.7414 43.4428 25.3785 45.1063C25.0797 46.4765 24.7953 46.5424 24.4665 46.5084C24.1394 46.4752 21.7484 45.9071 19.7617 44.5113C17.7733 43.1149 16.9287 41.7288 17.518 40.9269C18.0793 40.164 19 39.7007 20.4816 39.3417C21.8998 38.999 22.8534 37.7428 23.4797 38.0086Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.467 46.509C24.1383 46.4751 21.7473 45.907 19.7605 44.5113C18.1804 43.4012 17.3231 42.2982 17.3349 41.4887C17.3426 41.475 17.3503 41.4613 17.3605 41.4506C17.6815 41.0363 19.6294 41.5332 21.7477 42.8679C23.7671 44.138 25.2191 45.599 24.8686 46.4024C24.7398 46.5193 24.6079 46.5236 24.467 46.509Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.8803 22.4748L13.0712 24.6344C13.0936 24.8874 13.0019 25.1397 12.8101 25.3073C10.7172 27.1406 4.54355 27.6865 2.16031 26.249C1.9432 26.1175 1.80861 25.8852 1.78624 25.6322L1.59529 23.4726C1.42114 21.5029 2.26494 19.5229 3.69621 18.2613C4.11444 17.893 4.05658 17.2386 3.5802 16.9493C1.94977 15.9584 0.771638 14.1572 0.597488 12.1876L0.406536 10.0279C0.384166 9.77492 0.475899 9.52258 0.666679 9.35616C2.76071 7.52275 8.93431 6.97689 11.3165 8.41452C11.5346 8.54479 11.6692 8.77712 11.6915 9.03012L11.8825 11.1898C12.0566 13.1594 11.2128 15.1394 9.78156 16.401C9.36333 16.7693 9.42119 17.4238 9.89756 17.713C11.528 18.7039 12.7061 20.5051 12.8803 22.4748Z" fill="#A9DCF6" fill-opacity="0.8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.02615 9.27039C4.19318 9.43245 2.79533 9.89173 2.05923 10.3398L2.20997 12.0447C2.33551 13.4645 3.18214 14.8141 4.4203 15.5665C5.08317 15.9694 5.51817 16.6668 5.58595 17.4333C5.65372 18.1998 5.34784 18.9628 4.76693 19.4746C3.67901 20.4337 3.08233 21.9109 3.20777 23.3297L3.35861 25.0356C4.16191 25.3476 5.61866 25.5545 7.45163 25.3924C9.2846 25.2303 10.6825 24.7711 11.4186 24.323L11.2677 22.617C11.1423 21.1983 10.2956 19.8487 9.05748 19.0963C8.39461 18.6934 7.95961 17.996 7.89184 17.2295C7.82406 16.463 8.12994 15.7 8.71076 15.1871C9.79877 14.2291 10.3955 12.7519 10.2699 11.332L10.1192 9.62718C9.31587 9.31519 7.85912 9.10832 6.02615 9.27039Z" fill="white" fill-opacity="0.9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.94818 10.4983C7.32318 10.3767 8.7916 10.3749 8.83559 10.7142C8.87266 10.9875 8.91336 11.5207 7.84673 12.1853C6.81082 12.832 6.69593 13.8567 6.10664 13.9088C5.42128 13.9694 5.33053 13.3933 4.44377 12.8918C3.52987 12.3754 3.32137 11.587 3.30294 11.2691C3.27784 10.8269 4.57319 10.6199 5.94818 10.4983Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.44368 12.892C3.52978 12.3757 3.32128 11.5872 3.30285 11.2693C3.28266 10.9193 4.09102 10.7165 5.1113 10.5865C4.83716 10.7592 4.49205 11.1028 4.63795 11.7064C4.78931 12.3353 5.8551 12.9512 5.74257 13.5281C5.72134 13.6408 5.6757 13.7331 5.61477 13.8105C5.29657 13.631 5.06544 13.2437 4.44368 12.892Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.86862 18.7985C7.2871 18.7615 7.46241 19.5152 8.11175 19.9355C8.90824 20.4504 9.67927 21.103 9.96455 22.115C10.1996 22.9484 10.0638 23.067 9.87478 23.1439C9.68684 23.2208 8.21892 23.6056 6.73087 23.4219C5.24175 23.2383 4.37897 22.7283 4.46722 22.1201C4.55161 21.5413 4.91878 21.0215 5.62194 20.3956C6.29524 19.797 6.45015 18.8355 6.86862 18.7985Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.87521 23.1441C9.68621 23.2211 8.21829 23.6059 6.73023 23.4222C5.54676 23.2762 4.75927 22.924 4.53061 22.4795C4.53083 22.4698 4.53104 22.4601 4.53349 22.4512C4.58813 22.1323 5.79395 21.8374 7.33593 21.9495C8.80526 22.0553 10.0208 22.4298 10.0631 22.9694C10.0269 23.0705 9.95622 23.1111 9.87521 23.1441Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.9597 9.01912L34.5713 10.2909C34.6429 10.4399 34.6449 10.6147 34.5665 10.7608C33.7119 12.3575 30.0762 14.1058 28.2947 13.7765C28.1323 13.7463 27.9971 13.6356 27.9254 13.4866L27.3139 12.2148C26.7561 11.0549 26.8161 9.65517 27.3987 8.5584C27.569 8.2381 27.3837 7.85272 27.0272 7.78575C25.8067 7.55599 24.676 6.72887 24.1182 5.56895L23.5066 4.29712C23.435 4.14812 23.433 3.97336 23.5111 3.82823C24.3663 2.23116 28.002 0.48293 29.7828 0.812446C29.9456 0.841791 30.0808 0.952458 30.1525 1.10146L30.764 2.37329C31.3218 3.53321 31.2618 4.93289 30.6792 6.02966C30.5089 6.34996 30.6942 6.73535 31.0507 6.80232C32.2712 7.03207 33.4019 7.85919 33.9597 9.01912Z" fill="#A9DCF6" fill-opacity="0.8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.7563 2.54696C25.6769 3.06602 24.9306 3.66635 24.585 4.10812L25.0678 5.11213C25.4698 5.94828 26.2951 6.5763 27.2218 6.75067C27.7181 6.84413 28.143 7.16925 28.36 7.62065C28.5771 8.07205 28.5657 8.60697 28.3292 9.05198C27.8864 9.8857 27.8617 10.9224 28.2634 11.758L28.7465 12.7626C29.3074 12.7685 30.2423 12.5604 31.3217 12.0414C32.4012 11.5223 33.1474 10.922 33.4931 10.4802L33.01 9.47556C32.6082 8.64004 31.783 8.01202 30.8562 7.83765C30.36 7.74419 29.9351 7.41907 29.718 6.96767C29.5009 6.51628 29.5123 5.98136 29.7485 5.53571C30.1917 4.70262 30.2164 3.66588 29.8143 2.82973L29.3315 1.82572C28.7706 1.81987 27.8358 2.0279 26.7563 2.54696Z" fill="white" fill-opacity="0.9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.9904 3.31291C27.8001 2.92355 28.6943 2.58571 28.7989 2.78233C28.8841 2.94028 29.0312 3.25581 28.5338 3.90522C28.051 4.53676 28.216 5.18735 27.869 5.35422C27.4654 5.5483 27.278 5.21811 26.6228 5.11596C25.9476 5.011 25.6398 4.57848 25.5557 4.38904C25.439 4.12546 26.1806 3.70228 26.9904 3.31291Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.6228 5.11609C25.9476 5.01113 25.6398 4.57861 25.5557 4.38917C25.4631 4.18057 25.9091 3.8717 26.5008 3.55853C26.3734 3.72661 26.242 4.01506 26.4692 4.3493C26.7057 4.69772 27.4962 4.82848 27.5599 5.20575C27.5728 5.27927 27.5662 5.34594 27.5468 5.40711C27.3118 5.37072 27.0822 5.18777 26.6228 5.11609Z" fill="#4F2A93"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.4545 8.15813C29.7009 8.03962 29.9806 8.4586 30.4725 8.56572C31.0758 8.69672 31.6951 8.91751 32.101 9.46854C32.4353 9.92237 32.3797 10.0257 32.2823 10.116C32.1854 10.2059 31.3794 10.7769 30.4308 11.0062C29.4815 11.2359 28.839 11.123 28.7533 10.7323C28.672 10.3604 28.7764 9.9595 29.0613 9.41694C29.3342 8.89791 29.208 8.27663 29.4545 8.15813Z" fill="#9A62FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.2826 10.1159C32.1851 10.2062 31.3791 10.7772 30.4305 11.0065C29.676 11.1889 29.1155 11.155 28.8743 10.9366C28.8722 10.9307 28.8701 10.9247 28.8696 10.9188C28.8297 10.7119 29.4967 10.2558 30.4617 9.97051C31.3811 9.69797 32.2074 9.64738 32.3569 9.96638C32.3581 10.0363 32.3243 10.0773 32.2826 10.1159Z" fill="#4F2A93"/>
</svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

@@ -8,7 +8,7 @@
:no-close-on-backdrop="true"
>
<div class="modal-body select-class">
<h1 class="header-purple text-center">
<h1 class="header-purple text-center mb-0">
{{ $t('chooseClass') }}
</h1>
<div class="container-fluid">
@@ -26,7 +26,7 @@
:with-background="false"
:override-avatar-gear="classGear(heroClass)"
:hide-class-badge="true"
:sprites-margin="'1.8em 1.5em'"
:sprites-margin="'20px 36px 36px 20px'"
:override-top-padding="'0px'"
:show-visual-buffs="false"
:class="selectionBox(selectedClass, heroClass)"
@@ -91,7 +91,7 @@
<div class="opt-out-wrapper">
<span
id="classOptOutBtn"
class="danger"
class="danger mb-0"
@click="clickDisableClasses(); close();"
>{{ $t('optOutOfClasses') }}</span>
</div>
@@ -105,6 +105,11 @@
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
.btn-primary:active {
border: 2px solid $purple-400 !important;
box-shadow: none !important;
}
.class-badge {
$badge-size: 32px;
@@ -112,7 +117,7 @@
height: $badge-size;
background: $white;
box-shadow: 0 2px 2px 0 rgba($black, 0.16), 0 1px 4px 0 rgba($black, 0.12);
border-radius: 100px;
border-radius: 50px;
.svg-icon {
width: 19px;
@@ -121,8 +126,8 @@
}
.class-explanation {
font-size: 16px;
margin: 1.5em auto;
font-size: 1rem;
margin: 24px auto;
}
#classOptOutBtn {
@@ -130,35 +135,37 @@
}
.class-name {
font-size: 24px;
font-size: 1.5rem;
font-weight: bold;
margin: auto 0.33333em;
margin: auto 5px;
}
.danger {
color: $red-50;
margin-bottom: 0em;
}
.header-purple {
color: $purple-200;
margin-top: 1.33333em;
margin-bottom: 0em;
margin-top: 40px;
}
.modal-actions {
margin: 2em auto;
margin: 28px auto;
}
.opt-out-wrapper {
margin: 1em 0 0.5em 0;
margin: 14px 0 7px 0;
}
.selection-box {
width: 140px;
height: 148px;
border-radius: 16px;
border: solid 4px $purple-300;
border-radius: 16px;
bottom: -4px;
height: 150px;
left: -4px;
right: -4px;
top: -4px;
width: 150px;
}
.healer-color {
@@ -231,14 +238,6 @@ export default {
},
classGear (heroClass) {
if (heroClass === 'rogue') {
if (this.eventName) {
return {
armor: `armor_special_${this.eventName}Rogue`,
head: `head_special_${this.eventName}Rogue`,
shield: `shield_special_${this.eventName}Rogue`,
weapon: `weapon_special_${this.eventName}Rogue`,
};
}
return {
armor: 'armor_rogue_5',
head: 'head_rogue_5',
@@ -246,40 +245,24 @@ export default {
weapon: 'weapon_rogue_6',
};
} if (heroClass === 'wizard') {
if (this.eventName) {
return {
armor: `armor_special_${this.eventName}Mage`,
head: `head_special_${this.eventName}Mage`,
weapon: `weapon_special_${this.eventName}Mage`,
};
}
return {
armor: 'armor_wizard_5',
head: 'head_wizard_5',
weapon: 'weapon_wizard_6',
};
} if (heroClass === 'healer') {
if (this.eventName) {
return {
armor: `armor_special_${this.eventName}Healer`,
head: `head_special_${this.eventName}Healer`,
shield: `shield_special_${this.eventName}Healer`,
weapon: `weapon_special_${this.eventName}Healer`,
};
}
return {
armor: 'armor_healer_5',
head: 'head_healer_5',
shield: 'shield_healer_5',
weapon: 'weapon_healer_6',
};
}
if (this.eventName) {
} if (heroClass === 'warrior') {
return {
armor: `armor_special_${this.eventName}Warrior`,
head: `head_special_${this.eventName}Warrior`,
shield: `shield_special_${this.eventName}Warrior`,
weapon: `weapon_special_${this.eventName}Warrior`,
armor: 'armor_warrior_5',
head: 'head_warrior_5',
shield: 'shield_warrior_5',
weapon: 'weapon_warrior_6',
};
}
return {
@@ -7,7 +7,7 @@
:class="{'open': expand}"
@click="expand = !expand"
>
Priviliges, Gem Balance
Privileges, Gem Balance
</h3>
</div>
<div
@@ -91,11 +91,11 @@
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">
Consecutive months:
Cumulative months:
</label>
<div class="col-sm-9">
<input
v-model="hero.purchased.plan.consecutive.count"
v-model="hero.purchased.plan.cumulativeCount"
class="form-control"
type="number"
min="0"
@@ -105,39 +105,23 @@
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">
Perk offset months:
Received hourglass bonus:
</label>
<div class="col-sm-9">
<input
v-model="hero.purchased.plan.consecutive.offset"
class="form-control"
type="number"
min="0"
step="1"
>
<div class="input-group">
<input
v-model="hero.purchased.plan.hourglassPromoReceived"
class="form-control"
type="text"
>
<div class="input-group-append">
<strong class="input-group-text">
{{ dateFormat(hero.purchased.plan.hourglassPromoReceived) }}
</strong>
</div>
</div>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">
Perk month count:
</label>
<div class="col-sm-9">
<input
v-model="hero.purchased.plan.perkMonthCount"
class="form-control"
type="number"
min="0"
max="2"
step="1"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">
Next Mystic Hourglass:
</label>
<strong class="col-sm-9 col-form-label">{{ nextHourglassDate }}</strong>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">
Mystic Hourglasses:
@@ -162,8 +146,8 @@
class="form-control"
type="number"
min="0"
max="25"
step="5"
max="26"
step="2"
>
</div>
</div>
@@ -172,7 +156,7 @@
Total Gem cap:
</label>
<strong class="col-sm-9 col-form-label">
{{ Number(hero.purchased.plan.consecutive.gemCapExtra) + 25 }}
{{ Number(hero.purchased.plan.consecutive.gemCapExtra) + 24 }}
</strong>
</div>
<div class="form-group row">
@@ -185,7 +169,7 @@
class="form-control"
type="number"
min="0"
:max="hero.purchased.plan.consecutive.gemCapExtra + 25"
:max="hero.purchased.plan.consecutive.gemCapExtra + 24"
step="1"
>
</div>
@@ -268,6 +252,7 @@ export default {
nextHourglassDate () {
const currentPlanContext = getPlanContext(this.hero, new Date());
if (!currentPlanContext.nextHourglassDate) return 'N/A';
return currentPlanContext.nextHourglassDate.format('MMMM YYYY');
},
},
+57 -27
View File
@@ -186,7 +186,7 @@
</div>
<div class="donate-button">
<button
class="button btn-contribute"
class="btn button btn-secondary btn-contribute"
@click="donate()"
>
<div class="text">
@@ -309,7 +309,7 @@
<div class="my-2">
Time Traveling! It is {{ new Date().toLocaleDateString() }}
<a
class="btn btn-warning btn-small"
class="btn btn-small"
@click="resetTime()"
>
Reset
@@ -341,7 +341,7 @@
</button>
<div
v-if="debugMenuShown"
class="debug-toggle debug-group"
class="btn debug-toggle debug-group"
>
<div class="debug-pop">
<a
@@ -512,7 +512,14 @@ li {
grid-area: debug-pop;
}
.time-travel { grid-area: time-travel;}
.time-travel {
grid-area: time-travel;
a:hover {
text-decoration: none !important;
}
}
footer {
background-color: $gray-500;
@@ -584,42 +591,65 @@ h3 {
}
.debug {
margin-top: 16px;
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
display: flex;
justify-content: center;
margin-top: 16px;
padding: 2px 12px;
&:hover {
box-shadow: 0 3px 6px 0 rgba($black, 0.12), 0 3px 6px 0 rgba($black, 0.24);
}
&:focus {
border: 2px solid $purple-400 !important;
box-shadow: 0 3px 6px 0 rgba($black, 0.12), 0 3px 6px 0 rgba($black, 0.24);
}
:active {
border: 2px solid $purple-600 !important;
box-shadow: none;
}
}
.debug-group {
border-radius: 4px;
padding: 16px;
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
font-weight: 700;
background-color: $gray-600;
border: 2px solid transparent;
border-radius: 4px;
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
font-weight: 700;
padding: 8px 16px;
.btn {
margin: 2px;
}
a:hover {
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
text-decoration: none !important;
}
}
.btn-small {
background-color: $maroon-100;
border: 2px solid transparent;
color: $white !important;
line-height: 18px;
&:hover {
background-color: $maroon-100;
text-decoration: none !important;
border: 2px solid $maroon-100;
}
}
.btn-secondary {
padding: 2px 12px;
}
.btn-secondary a:hover {
text-decoration: none !important;
}
.btn-contribute {
background: $white;
border-radius: 2px;
width: 175px;
height: 32px;
color: $gray-50;
text-align: center;
vertical-align: middle;
padding: 0;
margin: 0;
&:hover {
color:$purple-300;
box-shadow: 0 3px 6px 0 rgba(26, 24, 29, 0.16), 0 3px 6px 0 rgba(26, 24, 29, 0.24);
&:active:not(:disabled) {
color:$purple-300;
border: 1px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba(26, 24, 29, 0.16), 0 3px 6px 0 rgba(26, 24, 29, 0.24);
}
}
border: 2px solid transparent;
a {
display: flex;
@@ -25,9 +25,13 @@
</b-modal>
</template>
<style scoped>
<style scoped lang="scss">
.modal-body {
padding-bottom: 2em;
.btn {
margin: 0px 2px;
}
}
</style>
@@ -27,13 +27,13 @@
</td>
</tr>
<tr
v-if="group.purchased.plan.consecutive.count || group.purchased.plan.consecutive.offset"
v-if="group.purchased.plan.consecutive.count"
>
<td>
<span class="glyphicon glyphicon-forward"></span>
{{ $t('consecutiveSubscription') }}
<ul class="list-unstyled">
<li>{{ $t('consecutiveMonths') }} {{ group.purchased.plan.consecutive.count + group.purchased.plan.consecutive.offset }}</li> <!-- eslint-disable-line max-len -->
<li>{{ $t('consecutiveMonths') }} {{ group.purchased.plan.consecutive.count }}</li> <!-- eslint-disable-line max-len -->
<li>{{ $t('gemCapExtra') }} {{ group.purchased.plan.consecutive.gemCapExtra }}</li>
<li>{{ $t('mysticHourglasses') }} {{ group.purchased.plan.consecutive.trinkets }}</li>
</ul>
@@ -354,13 +354,15 @@
></div>
<span>{{ userHourglasses }}</span>
</div>
<div class="item-with-icon gem">
<div
class="item-with-icon gem"
@click.prevent="showBuyGemsModal()"
>
<a
v-b-tooltip.hover.bottom="$t('gems')"
class="top-menu-icon svg-icon gem mr-2"
:aria-label="$t('gems')"
href="#buy-gems"
@click.prevent="showBuyGemsModal()"
v-html="icons.gem"
></a>
<span>{{ userGems }}</span>
@@ -529,7 +529,7 @@ export default {
// List of prompts for user on changes.
// Sounds like we may need a refactor here, but it is clean for now
if (!this.user.flags.welcomed && !this.$route.name.includes('groupPlan')) {
if (!this.user.flags.welcomed && !this.$route?.name.includes('groupPlan')) {
if (this.$store.state.avatarEditorOptions) {
this.$store.state.avatarEditorOptions.editingUser = false;
}
@@ -1,5 +1,5 @@
<template>
<div class="payments-column mx-auto mt-auto">
<div class="payments-column mx-auto">
<h4>{{ $t('choosePaymentMethod') }}</h4>
<button
v-if="stripeAvailable"
@@ -465,7 +465,7 @@ export default {
};
},
isGemsPromoActive () {
return Boolean(this.eventInfo);
return Boolean(this.eventInfo?.gemsPromo);
},
gemsBlocks () {
// We don't want to modify the original gems blocks when a promotion is running
@@ -51,7 +51,7 @@
</div>
<!-- menu area -->
<div class="row">
<div class="row bg-gray-700">
<div class="col-md-8 offset-md-2 text-center nav">
<div
class="nav-link"
@@ -73,7 +73,7 @@
<!-- subscriber block -->
<subscription-options
v-show="selectedPage === 'subscription'"
class="subscribe-option"
class="bg-gray-700 py-3"
:user-receiving-gift="userReceivingGift"
:receiver-name="receiverName"
/>
@@ -248,6 +248,11 @@
<style lang="scss">
@import '~@/assets/scss/mixins.scss';
#send-gift {
#subscription-form {
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
}
.modal-dialog {
max-width: 448px;
}
@@ -280,15 +285,7 @@
}
}
}
#subscription-form .subscribe-option {
background: #F9F9F9;
}
#subscription-form .selected {
background: rgba(213, 200, 255, 0.32);
// using rgba for transparency
}
}
}
</style>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
@@ -322,7 +319,6 @@
}
.row {
background-color: $gray-700;
margin: 0 0 0 0;
min-height: 32px;
}
@@ -336,19 +332,18 @@
}
.nav-link {
color: $gray-100;
color: $gray-50;
display: inline-block;
padding: 0px 8px 6px 8px;
&.active {
color: $purple-300;
border-bottom: 2px solid $purple-400;
color: $purple-300;
border-bottom: 2px solid $purple-400;
}
&:hover {
color: $purple-300;
border-bottom: 2px solid $purple-400;
cursor: pointer;
color: $purple-300;
cursor: pointer;
}
}
File diff suppressed because it is too large Load Diff
@@ -1,70 +1,167 @@
<template>
<div id="subscription-form">
<b-form-group class="mb-3 w-100 h-100">
<div
class="w-100 h-100"
:class="{'mb-2': userReceivingGift?._id}"
>
<strong
v-if="userReceivingGift?._id"
class="text-center d-block mb-3 mx-5"
>
{{ $t('giftSubscriptionLeadText') }}
</strong>
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
<b-form-radio
<div
v-for="block in subscriptionBlocksOrdered"
v-if="block.target !== 'group' && block.canSubscribe === true"
:key="block.key"
v-model="subscription.key"
:value="block.key"
class="subscribe-option pt-2 pl-5 pb-3 mb-0"
:class="{selected: subscription.key === block.key}"
@click.native="updateSubscriptionData(block.key)"
class="subscribe-option d-flex"
:class="{
selected: subscription.key === block.key,
'mb-2': block.months !== 12,
final: block.months === 12,
'mx-4': userReceivingGift?._id,
}"
@click="updateSubscriptionData(block.key)"
>
<div v-if="subscription.key === block.key">
<div class="selected-corner"></div>
<div
class="svg svg-icon svg-check color m-2"
v-html="icons.check"
>
</div>
</div>
<div
v-if="block.months === 12"
class="ribbon mt-3 d-flex align-items-center"
>
<small class="bold teal-1"> {{ $t('popular') }} </small>
</div>
<!-- eslint-enable vue/no-use-v-if-with-v-for -->
<div
v-if="userReceivingGift && userReceivingGift._id"
class="subscription-text ml-2 mb-1"
v-html="$t('giftSubscriptionRateText', {price: block.price, months: block.months})"
>
<div class="w-100">
<div
class="mx-5"
v-if="block.months < 12"
>
<h2
class="mt-3 mb-1"
> ${{ block.price }}.00 USD </h2>
<small
class="bold mb-2"
>
{{ recurrenceText(block.months) }}
</small>
<div class="d-flex flex-column mb-3">
<div class="d-flex align-items-center mb-1">
<div
class="svg svg-icon svg-plus color mr-1"
v-html="icons.plus"
>
</div>
<small
v-html="userReceivingGift?._id ? $t('unlockNGemsGift', { count: 24 })
: $t('unlockNGems', { count: 24 })"
></small>
</div>
<div class="d-flex align-items-center">
<div
class="svg svg-icon svg-plus color mr-1"
v-html="icons.plus"
>
</div>
<small
v-html="userReceivingGift?._id ? $t('earn2GemsGift') : $t('earn2Gems')"
></small>
</div>
</div>
</div>
<div v-else>
<div
class="bg-white py-3 pl-5"
:class="{ round: userReceivingGift?._id }"
>
<div class="d-flex align-items-center mb-1">
<h2 class="mr-2 my-auto"> ${{ block.price }}.00 USD</h2>
<strike class="gray-200">$60.00 USD</strike>
</div>
<small class="bold mb-2">
{{ recurrenceText(block.months) }}
</small>
<div class="d-flex flex-column">
<div class="d-flex align-items-center mb-1">
<div
class="svg svg-icon svg-plus color mr-1"
v-html="icons.plus"
>
</div>
<small
v-html="userReceivingGift?._id ? $t('unlockNGemsGift', { count: 50 })
: $t('unlockNGems', { count: 50 })"
></small>
</div>
<div class="d-flex align-items-center">
<div
class="svg svg-icon svg-plus color mr-1"
v-html="icons.plus"
>
</div>
<small v-html="userReceivingGift?._id ? $t('maxGemCapGift') : $t('maxGemCap')">
</small>
</div>
</div>
</div>
<div
class="gradient-banner text-center"
v-if="!userReceivingGift?._id && !user?.purchased?.plan?.hourglassPromoReceived"
>
<small class="my-3" v-html="$t('immediate12Hourglasses')"></small>
</div>
</div>
</div>
<div
v-else
class="subscription-text ml-2 mb-1"
v-html="$t('subscriptionRateText', {price: block.price, months: block.months})"
>
</div>
<div
class="ml-2"
v-html="subscriptionBubbles(block.key)"
>
</div>
</b-form-radio>
</b-form-group>
<div class="mx-4 mb-4 text-center">
</div>
<button
class="btn btn-primary"
:class="[canceled ? 'mt-4' : 'mt-3', userReceivingGift?._id ? 'mx-4' : 'w-100']"
@click="$root.$emit('bv::show::modal', 'buy-subscription')"
> {{ userReceivingGift?._id ? $t('selectPayment') : $t('subscribe') }} </button>
</div>
<div
v-if="note"
class="mx-4 my-3 text-center"
>
<small
v-if="note"
v-once
class="font-italic"
>
{{ $t(note) }}
</small>
</div>
<!-- payment buttons first is for gift subs and the second is for renewing subs -->
<payments-buttons
v-if="userReceivingGift && userReceivingGift._id"
:disabled="!subscription.key"
:stripe-fn="() => redirectToStripe({gift, uuid: userReceivingGift._id, receiverName})"
:paypal-fn="() => openPaypalGift({
gift: gift, giftedTo: userReceivingGift._id, receiverName,
})"
:amazon-data="{type: 'single', gift, giftedTo: userReceivingGift._id, receiverName}"
/>
<payments-buttons
v-else
:disabled="!subscription.key"
:stripe-fn="() => redirectToStripe({
subscription: subscription.key,
coupon: subscription.coupon,
})"
:paypal-fn="() => openPaypal({url: paypalPurchaseLink, type: 'subscription'})"
:amazon-data="{
type: 'subscription',
subscription: subscription.key,
coupon: subscription.coupon
}"
/>
<b-modal
id="buy-subscription"
size="md"
:hide-header="true"
:hide-footer="true"
>
<payments-buttons
v-if="userReceivingGift?._id"
:disabled="!subscription.key"
:stripe-fn="() => redirectToStripe({gift, uuid: userReceivingGift._id, receiverName})"
:paypal-fn="() => openPaypalGift({
gift: gift, giftedTo: userReceivingGift._id, receiverName,
})"
/>
<payments-buttons
v-else
:disabled="!subscription.key"
:stripe-fn="() => redirectToStripe({
subscription: subscription.key,
coupon: subscription.coupon,
})"
:paypal-fn="() => openPaypal({url: paypalPurchaseLink, type: 'subscription'})"
/>
</b-modal>
</div>
</template>
@@ -77,9 +174,13 @@
margin-top: 0.75rem;
}
.selected {
background-color: rgba(213, 200, 255, 0.32);
.discount-bubble {
background-color: $green-10;
color: $white;
}
.selected {
outline: 2px solid $purple-300;
.subscription-bubble {
background-color: $purple-300;
color: $white;
@@ -102,9 +203,12 @@
color: $gray-200;
}
.discount-bubble {
background-color: $green-10;
color: $white;
.selected strong {
color: $yellow-5;
}
.selected .gradient-banner strong {
color: $teal-1;
}
}
</style>
@@ -112,20 +216,113 @@
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
small {
small, .small {
color: $gray-100;
display: inline-block;
font-size: 12px ;
font-weight: normal;
line-height: 16px;
&.bold {
font-weight: 700;
}
}
strike, strong {
line-height: 24px;
}
.btn-primary {
min-width: 400px;
}
.gradient-banner small {
color: $teal-1;
width: 61%;
}
.ribbon {
width: fit-content;
background: linear-gradient(90deg, rgba(119, 244, 199, 1), rgba(114, 207, 255, 1));
border-radius: 4px;
clip-path: polygon(0px 0px, calc(100% + 1px) 0px, calc(100% + 1px) calc(100% + 1px),
0px calc(100% + 3px), 4px 50%);
box-shadow: 0px 1px 3px 0px rgba(26, 24, 29, 0.12), 0px 1px 2px 0px rgba(26, 24, 29, 0.24);
position: absolute;
right: -4px;
line-height: 1.33;
padding: 4px 10px 4px 12px;
}
.selected-corner {
border-color: $purple-300 transparent transparent transparent;
border-style: solid;
border-width: 48px 48px 0 0;
border-top-left-radius: 4px;
position: absolute;
}
.subscribe-option {
background-color: $gray-700;
max-width: 448px;
border-radius: 8px;
box-shadow: 0px 1px 3px 0px rgba($black, 0.12), 0px 1px 2px 0px rgba($black, 0.24);
position: relative;
background-color: $white;
&:not(:last-of-type) {
border-bottom: 1px solid $gray-600;
.bg-white {
border-top-left-radius: 8px;
border-top-right-radius: 8px;
&.round {
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
}
}
&.final h2 {
color: $teal-10;
}
&:hover, &.selected {
box-shadow: 0px 3px 6px 0px rgba($black, 0.16), 0px 3px 6px 0px rgba($black, 0.24);
}
&.selected {
&.final {
small {
color: $teal-1;
}
}
&:not(.final) {
h2, small {
color: $purple-200;
}
}
.svg-plus {
color: $yellow-10;
}
}
&.final {
background: linear-gradient(90deg, rgba($green-500, 1), rgba(114, 207, 255, 1));
}
h2 {
font-family: 'Roboto', sans-serif;
line-height: 24px;
color: $gray-50;
}
}
.svg-check {
width: 16px;
position: absolute;
color: $white;
}
.svg-plus {
color: $gray-300;
min-width: 10px;
}
</style>
@@ -136,6 +333,8 @@ import sortBy from 'lodash/sortBy';
import subscriptionBlocks from '@/../../common/script/content/subscriptionBlocks';
import paymentsButtons from '@/components/payments/buttons/list';
import paymentsMixin from '../../mixins/payments';
import check from '@/assets/svg/check.svg';
import plus from '@/assets/svg/positive.svg';
export default {
components: {
@@ -157,15 +356,23 @@ export default {
type: String,
default: '',
},
canceled: {
type: Boolean,
default: false,
},
},
data () {
return {
subscription: {
key: 'basic_earned',
},
gift: {
type: 'subscription',
subscription: { key: 'basic_earned' },
subscription: { key: 'basic_12mo' },
},
icons: Object.freeze({
check,
plus,
}),
subscription: {
key: 'basic_12mo',
},
};
},
@@ -179,6 +386,18 @@ export default {
},
},
methods: {
recurrenceText (months) {
if (this.userReceivingGift?._id) {
if (months < 2) {
return this.$t('oneMonthGift');
}
return this.$t('nMonthsGift', { months });
}
if (months < 2) {
return this.$t('recurringMonthly');
}
return (this.$t('recurringNMonthly', { length: months }));
},
subscriptionBubbles (subscription) {
switch (subscription) {
case 'basic_3mo':
@@ -193,7 +412,7 @@ export default {
},
updateSubscriptionData (key) {
this.subscription.key = key;
if (this.userReceivingGift._id) this.gift.subscription.key = key;
if (this.userReceivingGift?._id) this.gift.subscription.key = key;
},
},
};
@@ -378,7 +378,7 @@
height: 40px;
border-radius: 2px;
background-color: $white;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
box-shadow: 0 2px 2px 0 rgba($black, 0.16), 0 1px 4px 0 rgba($black, 0.12);
margin-right: 24px;
input {
@@ -462,17 +462,17 @@
&.gems {
color: $green-10;
background-color: rgba(36, 204, 143, 0.15);
background-color: rgba($green-100, 0.15);
}
&.gold {
color: $yellow-5;
background-color: rgba(255, 190, 93, 0.15);
background-color: rgba($yellow-100, 0.15);
}
&.hourglasses {
color: $hourglass-color;
background-color: rgba(41, 149, 205, 0.15);
background-color: rgba($blue-10, 0.15);
}
}
@@ -516,11 +516,16 @@
button.btn.btn-primary {
margin-top: 16px;
padding: 4px 16px;
height: 32px;
padding: 2px 12px;
line-height: 1.714;
&:focus {
border: 2px solid black;
border: 2px solid $purple-400;
}
&:active {
border: 2px solid $purple-400 !important;
box-shadow:none;
}
}
@@ -297,11 +297,16 @@
button.btn.btn-primary {
margin-top: 16px;
padding: 4px 16px;
height: 32px;
padding: 2px 12px;
line-height: 1.714;
&:focus {
border: 2px solid black;
border: 2px solid $purple-400;
}
&:active {
border: 2px solid $purple-400;
box-shadow: none;
}
.balance {
@@ -198,7 +198,7 @@
top: 25px;
border-radius: 8px;
background-color: $gray-600;
box-shadow: 0 2px 16px 0 rgba(26, 24, 29, 0.32);
box-shadow: 0 2px 16px 0 rgba($black, 0.32);
display: flex;
align-items: center;
flex-direction: column;
@@ -208,12 +208,17 @@
}
button.btn.btn-primary {
margin-top: 14px;
padding: 4px 16px;
height: 32px;
margin-top: 16px;
padding: 2px 12px;
line-height: 1.714;
&:focus {
border: 2px solid black;
border: 2px solid $purple-400;
}
&:active {
border: 2px solid $purple-400;
box-shadow: none;
}
}
@@ -249,7 +254,7 @@
&.gems {
color: $green-10;
background-color: rgba(36, 204, 143, 0.15);
background-color: rgba($green-100, 0.15);
line-height: 1.4;
margin: 0 0 0 -4px;
border-radius: 20px;
@@ -257,7 +262,7 @@
&.gold {
color: $yellow-5;
background-color: rgba(255, 190, 93, 0.15);
background-color: rgba($yellow-100, 0.15);
line-height: 1.4;
margin: 0 0 0 -4px;
border-radius: 20px;
@@ -265,7 +270,7 @@
&.hourglasses {
color: $hourglass-color;
background-color: rgba(41, 149, 205, 0.15);
background-color: rgba($blue-10, 0.15);
line-height: 1.4;
margin: 0 0 0 -4px;
border-radius: 20px;
@@ -163,14 +163,7 @@
slot="itemBadge"
slot-scope="ctx"
>
<span
class="badge-top"
@click.prevent.stop="togglePinned(ctx.item)"
>
<pin-badge
:pinned="ctx.item.pinned"
/>
</span>
<category-item :item="ctx.item" />
</template>
</shopItem>
</div>
@@ -178,6 +171,23 @@
</div>
</div>
</div>
<buy-quest-modal
:item="selectedItemToBuy || {}"
:price-type="selectedItemToBuy ? selectedItemToBuy.currency : ''"
:with-pin="true"
>
<template
slot="item"
slot-scope="ctx"
>
<item
class="flat"
:item="ctx.item"
:item-content-class="ctx.item.class"
:show-popover="false"
/>
</template>
</buy-quest-modal>
</div>
</template>
@@ -346,11 +356,17 @@ import svgWizard from '@/assets/svg/wizard.svg';
import svgRogue from '@/assets/svg/rogue.svg';
import svgHealer from '@/assets/svg/healer.svg';
import BuyQuestModal from '../quests/buyQuestModal.vue';
import CategoryItem from '../market/categoryItem';
import FilterGroup from '@/components/ui/filterGroup';
import FilterSidebar from '@/components/ui/filterSidebar';
import { worldStateMixin } from '@/mixins/worldState';
export default {
components: {
BuyQuestModal,
CategoryItem,
FilterGroup,
FilterSidebar,
Checkbox,
PinBadge,
@@ -386,6 +402,7 @@ export default {
featuredGearBought: false,
currentEvent: null,
backgroundUpdate: new Date(),
selectedItemToBuy: null,
imageURLs: {
background: '',
npc: '',
@@ -550,7 +567,12 @@ export default {
return false;
},
itemSelected (item) {
this.$root.$emit('buyModal::showItem', item);
if (item.type === 'quests') {
this.selectedItemToBuy = item;
this.$root.$emit('bv::show::modal', 'buy-quest-modal');
} else {
this.$root.$emit('buyModal::showItem', item);
}
},
},
};
@@ -26,7 +26,7 @@
position: fixed;
right: 10px;
width: 350px;
z-index: 9999; // to keep it above modal overlays
z-index: 999; // to keep it above modal overlays
top: var(--current-scrollY);
@@ -152,8 +152,11 @@
}
.btn-primary.pull-right {
height: 2.5em;
line-height: 2.25;
margin: auto 0px auto auto;
&:focus, :active {
border: 2px solid $purple-400;
}
}
nav.navbar {
+11 -3
View File
@@ -552,8 +552,16 @@
}
.sign-up {
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
padding-top: 11px;
padding-bottom: 11px;
&:focus, &:active {
background-color: $blue-50;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
}
::-webkit-input-placeholder { /* Chrome/Opera/Safari */
@@ -650,9 +658,9 @@
.btn-primary {
width: 411px;
height: 48px;
border-radius: 2px;
border-radius: 4px;
background-color: $purple-400;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.24), 0 1px 4px 0 rgba(26, 24, 29, 0.16);
box-shadow: 0 2px 2px 0 rgba($black, 0.24), 0 1px 4px 0 rgba($black, 0.16);
margin-bottom: 5em;
}
@@ -669,7 +677,7 @@
&:hover {
background-color: $purple-50;
box-shadow: 0 4px 4px 0 rgba(26, 24, 29, 0.16), 0 1px 8px 0 rgba(26, 24, 29, 0.12);
box-shadow: 0 4px 4px 0 rgba($black, 0.16), 0 1px 8px 0 rgba($black, 0.12);
}
}
+221 -358
View File
@@ -1,368 +1,231 @@
<template>
<!-- eslint-disable max-len -->
<div class="container-fluid">
<h1>Privacy Notice</h1>
<h1>HabitRPG Privacy Policy</h1>
<p class="strong pagemeta">
Last Updated September 19, 2022: Removed reference to Facebook login, which is no longer supported.
Last Updated June 20, 2024.
</p>
<p>
HabitRPG, Inc. (HabitRPG, we, us, or our) welcomes you. This privacy notice (the Privacy
Notice) describes how we process the information we collect about or from you through our Website
located at <a href="https://habitica.com/static/home">https://habitica.com/static/home</a> and/or our Apps
(our Digital Platforms), from our users, subscribers, visitors and other users of our technology and
platforms (together with our Digital Platforms, the Habitica Service or the Service), and when you
otherwise interact with us. This Privacy Notice may be updated by us from time to time without notice to
you. By accepting this Privacy Notice, accessing or using the Service, or otherwise manifesting your
assent to this Privacy Notice, you agree to be bound by this Privacy Notice. If you do not agree to (or
cannot comply with) all of the terms of this Privacy Notice, you may not access or use the Service.
This Privacy Policy applies when you interact with us through Habitica.com and any other feature or service owned or controlled by HabitRPG, Inc. (HabitRPG, we, or us) that posts or includes a valid link to this Privacy Policy (collectively, the Service(s)). This Privacy Policy informs you of our practices regarding the collection, use, and disclosure of personal information we receive from users of our Services. By accessing or using the Services, you consent to our Privacy Policy and our collection, use, and sharing of your information as described in this policy, our <a href="https://habitica.com/static/terms">Terms of Use</a>, and any additional policies and terms you may agree to in connection with the Services.
</p>
<p>
Capitalized terms not defined in this Privacy Notice shall have the meaning set forth in our Terms of
Service.
</p>
<h2>THE INFORMATION WE COLLECT AND HOW WE USE IT</h2>
<p>
In the course of operating the Service, HabitRPG collects or receives the following types of information
from visitors to the Website; users, subscribers or other users of its Platforms; and from third-party
integration partners, which may include personal information.
</p>
<h3>Contact Information</h3>
<p>
We collect contact information through our Service; contact information typically includes your name,
email address, and any other information you provide in messages to us. We use such contact information
for purposes such as providing you with information about the Service, responding to your inquiries,
sending you email alerts (including marketing emails), verifying your identity or providing you the
Service.
</p>
<h3>Account Access Information</h3>
<p>
In connection with the creation of an account on our Platforms, we collect account credentials such as
your email, username, and password. We use this account information to create your account, including to
verify your identity. We also use this information to manage your account, including your transactions. If
you choose to log into your account through Google or Apple, we capture and store the User ID and email
address connected to the respective account, so we can verify your identity when you log in.
</p>
<h3>User Content</h3>
<p>
As explained in more detail in the Terms of Service, HabitRPG allows you to upload and receive content,
including text, photos, images, task lists, graphics, artwork, links to outside content, and or other material.
It is your decision what kind of personal information (if any) you submit. We do not use personal
information posted in your content in any way except as needed to enforce the community guidelines and
terms of service or to provide assistance and troubleshooting issues with service to the account.
</p>
<h3>Transaction Information</h3>
<p>
When you make, or attempt to make, a purchase, sale or other transaction as a user or subscriber through
one of our Platforms, we may collect certain information from you, including your name, billing address,
mailing address, email address, and phone number. We refer to this information as Transaction
Information. We use the Transaction Information that we collect generally to facilitate transactions
between users through our Platforms (including providing you with invoices and/or transaction
confirmations). Additionally, we use this Transaction Information to: communicate with you; screen our
transactions for potential risk or fraud; and when in line with the preferences you have shared with us,
provide you with information or advertising relating to our products or Service. Our third-party payment
processing providers may also collect from you, process and store your payment information including
credit card information and/or bank account information in accordance with their respective privacy
policies linked to below:
</p>
<ul>
<li>
For Stripe, visit: <a
href="https://stripe.com/privacy"
target="_blank"
>https://stripe.com/privacy</a>
</li>
<li>
For Amazon Pay, visit: <a
href="https://pay.amazon.com/help/201751600"
target="_blank"
>https://pay.amazon.com/help/201751600</a>
</li>
<li>
For PayPal, visit: <a
href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full"
target="_blank"
>https://www.paypal.com/us/webapps/mpp/ua/privacy-full</a>
</li>
<li>
For Apple Pay, visit: <a
href="https://www.apple.com/legal/privacy/data/en/apple-pay/"
target="_blank"
>https://www.apple.com/legal/privacy/data/en/apple-pay/</a>
</li>
<li>
For Google Pay, visit: <a
href="https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid"
target="_blank"
>https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid</a>
</li>
</ul>
<p>
We reserve the right to change our payment vendors at any time, or to use additional payment vendors, at
our discretion, and will update this Privacy Notice from time to time accordingly.
</p>
<h3>Server Log, Device and Other Technical Information</h3>
<p>
Our servers keep log files that record data each time a device accesses those servers. The log files may
contain data about the nature of such access, including the devices IP address, user agent string (e.g.,
operating system and browser type/version), and the pages you have clicked on while on our Service, and
details regarding your activity on the Service such as time spent on the Service and other performance and
usage data. We may use these log files for purposes such as assisting in monitoring and troubleshooting
errors and incidents, analyzing traffic, or optimizing the user experience.
</p>
<h3>Cookies and Similar Technologies</h3>
<p>
We may collect information using cookies, web beacons, tags, pixel and other similar technologies to
record information about how you use the Website, and to facilitate log-in and payments. Cookies are
small packets of data that a website stores on your computers or mobile devices hard drive (or other
storage medium) so that your computer will remember information about your use. We use both first
and third party session cookies and persistent cookies. Below is a general primer on session and persistent
cookies; information collected by cookies depends on its particular purpose. For more information, please
see the information regarding analytics providers discussed further below.
</p>
<ul>
<li>
<strong>Session Cookies</strong>: We use session cookies to make it easier for you to navigate our Service. A
session ID cookie expires when you close the Service.
</li>
<li>
<strong>Persistent Cookies</strong>: A persistent cookie remains on your device for an extended period of time or
until you delete it. Persistent cookies enable us to better understand how you interact with the Service and to
provide visitors with a better and more personalized experience by retaining information about their identity and
preferences, including but not limited to keeping them logged in even if the browser is closed.
</li>
</ul>
<p>
If you do not want us to place a cookie on your device, you may be able to turn that feature off on your
device. You may refuse to accept cookies from the Service at any time by activating the setting on your
browser which allows you to refuse cookies. Further information about the procedure to follow in order to
disable cookies can be found on your Internet browser providers website via your help screen. You may
wish to refer to <a
href="https://www.allaboutcookies.org/manage-cookies/index.html"
target="_blank"
>
https://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
For more information about targeting and advertising cookies and how you can opt out, you can also visit
<a
href="https://optout.aboutads.info"
target="_blank"
>https://optout.aboutads.info</a>. Please be aware
that if cookies are disabled, not all features of the Service may operate properly or as intended.
</p>
<h3>Third-Party Analytics Providers</h3>
<p>
We use one or more thirdparty analytics Service to evaluate your use of the Service, as the case may be,
by compiling reports on activity (based on their collection of IP addresses, Internet service provider,
browser type, operating system and language, referring and exit pages and URLs, data and time, amount
of time spent on particular pages, what sections of the Service you visit, number of links clicked, search
terms and other similar usage data) and analyzing performance metrics. These third parties use cookies
and other technologies to help collect, analyze, and provide us reports or other data.
</p>
<p>
By accessing and using the Service, you consent to the processing of data about you by these analytics
providers in the manner and for the purposes set out in this Privacy Notice. For more information on these
third parties, including how to opt out from certain data collection, please visit the sites below. Please be
advised that if you opt out of any service, you may not be able to use the full functionality of the Service.
</p>
<ul>
<li>
For Google Analytics, visit: <a
href="https://marketingplatform.google.com/about/analytics/"
target="_blank"
>https://marketingplatform.google.com/about/analytics/</a>
</li>
<li>
For Amplitude, visit: <a
href="https://amplitude.com/privacy"
target="_blank"
>https://amplitude.com/privacy</a>
</li>
</ul>
<h3>Third-Party Advertisers/Remarketers</h3>
<p>
We may share or receive information about you with/from third parties, including, but not limited to,
advertising and remarketing providers, or similar partners, for purposes of personalizing or otherwise
understanding how you engage with ads or other content. These third parties may use cookies, pixel tags,
or other technologies to collect information in furtherance of such purposes, including to tailor, target
(i.e., behavioral, contextual, retargeting, and remarketing), analyze, report on, and/or manage advertising
campaigns or other initiatives. For example, when a browser visits a site, pixel tags enable us and these
third-parties to recognize certain cookies stored within the browser to learn which ads or other content
bring a user to a given site. Information that we may receive from these third-parties, including through
their service providers, may include advertising identifiers, IP addresses, reports, and campaign data.
</p>
<p>
By accessing and using the Service, you consent to the processing of data about you by these
advertisers/remarketing providers in the manner and for the purposes set out in this Privacy Notice.
</p>
<p>
For more information on our advertising partner Google AdMob, please visit <a
href="https://policies.google.com/privacy?hl=en"
target="_blank"
>https://policies.google.com/privacy?hl=en</a>.
</p>
<h3>Geolocation Information</h3>
<p>
We may, with your consent, automatically collect geolocation information from your device via your
browsers location Service. This consent may be provided by you on the device level (e.g., you have
consented to location Service generally through your browsers settings) or by accepting our request for
geolocation access on the Service. Please consult your browsers documentation regarding how to turn off
location Service. If you disable location Service, you may not be able to use the full array of features and
functionalities available through our Service.
</p>
<h3>Aggregate and De-identified Data</h3>
<p>
In an ongoing effort to better understand our users and the Service, we might analyze your information in
aggregate and/or de-identified form to operate, maintain, manage, and improve the Service. We may
share this aggregate or de-identified data with our affiliates, agents, and business partners. We may also
disclose aggregated or de-identified user statistics to describe the Service to current and prospective
business partners and to other third parties for other lawful purposes.
</p>
<h3>Onward Transfer to Third Parties</h3>
<ul>
<li>
Like many businesses, we hire other companies to perform certain business-related services. We
may disclose personal information to certain types of third party companies but only to the extent
needed to enable them to provide such service. The types of companies that may receive personal
information and their functions are: hosting service, technical assistance, database
management/back-up service, use analytics, marketing, and customer service.
</li>
<li>
To provide our Service and administer promotional programs, we may share your personal
information with our third-party promotional and marketing partners, including, without
limitation, businesses participating in our various programs.
</li>
<li>
We may also disclose personal information to our parent companies, subsidiaries, affiliates, joint
ventures, or other companies under common control to support the marketing and sale of our
products and Service.
</li>
</ul>
<h3>Business Transfers</h3>
<p>
In the event of a merger, dissolution, reorganization or similar corporate event, or the sale of all or
substantially all of our assets, we expect that the information that we have collected, including personal
information, would be transferred to the surviving entity in a merger or the acquiring entity. All such
transfers shall be subject to our commitments with respect to the privacy and confidentiality of such
personal information as set forth in this Privacy Notice. This Notice shall be binding upon HabitRPG and
its legal successors in interest.
</p>
<h3>Disclosure to Public Authorities</h3>
<p>
We are required to disclose personal information in response to lawful requests by public authorities,
including for the purpose of meeting national security or law enforcement requirements. We may also
disclose personal information to other third parties when compelled to do so by government authorities or
required by law or regulation including, but not limited to, in response to court orders and subpoenas.
</p>
<h2>UPDATES AND OPT-OUTS</h2>
<p>
On the website:<br>You can update your user profile on the Website by clicking the avatar box in the
upper left hand corner of the browser window, or by going to Settings and then selecting the Profile
option in the menu.
</p>
<p>
You can fully delete or reset your account via the Settings option on the Website.
</p>
<p>
On the mobile apps for iOS Versions 3.4.3 and Android versions 3.4.1.1 and below:
You can update your user profile on the mobile apps by tapping the Settings gear in the menu and then
selecting the Profile option.
</p>
<p>
You can fully delete or reset your account on the mobile apps by tapping the Settings gear in the menu
and then selecting the Authentication option.
</p>
<p>
If you would like us to fully delete your account and all data associated with it, please email us at
admin@habitica and we will handle your request within 30 days.
</p>
<p>
You may opt out at any time from the use of your personal information for direct marketing purposes by
emailing the instructions to <a href="mailto:admin@habitica.com">admin@habitica.com</a> or by clicking
on the Unsubscribe link located on the bottom of any HabitRPG marketing email and following the
instructions found on the page to which the link takes you. Please allow us a reasonable time to process
your request. You cannot opt out of receiving transactional e-mails related to the Service.
</p>
<h2>HOW WE PROTECT YOUR INFORMATION</h2>
<p>
HabitRPG takes very seriously the security and privacy of the personal information that it collects
pursuant to this Privacy Notice. Accordingly, we implement reasonable security measures designed to
protect your personal information from loss, misuse and unauthorized access, disclosure, alteration and
destruction, taking into account the risks involved in processing and the nature of such data, and to
comply with applicable laws and regulations. Please understand, however, that no security system is
impenetrable. We cannot guarantee the security of our databases or the databases of the third parties with
which we may share your information (as permitted herein), nor can we guarantee that the information
you supply will not be intercepted while being transmitted over the Internet. In particular, e-mail sent to
us may not be secure, and you should therefore take special care in deciding what information you send to
us via e-mail.
</p>
<h2>CHILDREN</h2>
<p>
The Service are intended for users 13 years or older; you are not permitted to access or use the Service if
you are younger than 13. We do not knowingly collect personal information from children under the age
of 13 through the Service. If you are under 13, please do not give us any personal information. We
encourage parents and legal guardians to monitor their childrens Internet usage and to help enforce our
Privacy Notice by instructing their children to never provide personal information without their
permission. If you have reason to believe that a child under the age of 13 has provided personal
information to us, please contact us at admin@habitica.com, and we will endeavor to delete that
information from our databases.
</p>
<h2>IMPORTANT NOTICE TO ALL NON-US RESIDENTS</h2>
<p>
Our servers are located in the US. Please be aware that your information may be transferred to, processed,
maintained, and used on computers, servers, and systems located outside of your state, province, country,
or other governmental jurisdiction where the privacy laws may not be as protective as those in your
country of origin. If you are located outside the United States and choose to use the Service, you do so at
your own risk.
</p>
<h2>CALIFORNIA PRIVACY RIGHTS</h2>
<p>
Pursuant to Section 1798.83 of the California Civil Code, residents of California have the right to obtain
certain information about the types of personal information that companies with whom they have an
established business relationship (and that are not otherwise exempt) have shared with third parties for
direct marketing purposes during the preceding calendar year, including the names and addresses of those
third parties, and examples of the types of Service or products marketed by those third parties. If you wish
to submit a request pursuant to Section 1798.83, please contact HabitRPG via email at
<a href="mailto:admin@habitica.com">admin@habitica.com</a>.
</p>
<h2>NEVADA PRIVACY RIGHTS</h2>
<p>
If you are a resident of Nevada, you have the right to opt-out of the sale of certain personal information to
third parties. You can exercise this right by contacting us at admin@habitica.com with the subject line
Nevada Do Not Sell Request and providing us with your name and the email address associated with
your account.
</p>
<h2>DO NOT TRACK</h2>
<p>
HabitRPG does not respond to Do Not Track settings or other related mechanisms on our Website at
this time.
</p>
<h2>LINKS TO EXTERNAL WEBSITES</h2>
<p>
The Service may contain links to third-party websites (<span style="text-decoration: underline;">External
Sites</span>). HabitRPG has no control over the privacy practices or the content of any such External Sites.
As such, we are not responsible for the content or the privacy policies of such External Sites. You should
check the applicable privacy notice or privacy policy and terms of use when visiting any such External Sites.
</p>
<h2>CHANGES TO THIS PRIVACY NOTICE</h2>
<p>
This Privacy Notice is effective as of the last updated date stated at the top of this Privacy Notice. We
may change this Privacy Notice from time to time with or without notice to you. By accessing the Service
after we make any such changes to this Privacy Notice, you are deemed to have accepted such changes.
Please be aware that, to the extent permitted by applicable law, our use of the information collected is
governed by the Privacy Notice in effect at the time we collect the information. Please refer back to this
Privacy Notice on a regular basis.
</p>
<h2>HOW TO CONTACT US</h2>
<p>
If you have questions about this Privacy Notice, please e-mail us at <a href="mailto:admin@habitica.com">
admin@habitica.com</a> with Privacy Notice in the subject line.
</p>
<address>
<strong>HabitRPG, Inc.</strong>
<br>202 Bicknell Ave., Ground Floor
<br>Santa Monica, CA 90405
<br>Email&colon;&nbsp;
<a href="mailto:admin@habitica.com">admin@habitica.com</a>
</address>
<h2>Table of Contents</h2>
<ol>
<li><a href="#collection-of-information">Collection of Information</a></li>
<ul>
<li><a href="#information-you-provide-directly">Information You Provide Directly</a></li>
<li><a href="#information-we-collect-automatically">Information We Collect Automatically</a></li>
<li><a href=#location-data>Location Data</a></li>
<li><a href="#information-from-third-parties">Information from Third Parties</a></li>
</ul>
<li><a href="#purpose-and-use-of-information-we-collect">Purpose and Use of Information We Collect</a></li>
<li><a href="#sharing-of-information">Sharing of Information</a></li>
<li><a href="#third-party-analytics-providers">Third-Party Analytics Providers</a></li>
<li><a href="#security">Security</a></li>
<li><a href="#data-retention">Data Retention</a></li>
<li><a href="#general-audience-services">General Audience Services</a></li>
<li><a href="#consent-to-international-transfer">Consent to International Transfer</a></li>
<li><a href="#your-choices">Your Choices</a></li>
<li><a href="#changes-to-this-privacy-policy">Changes to This Privacy Policy</a></li>
<li><a href="#contact-us">Contact Us</a></li>
<li><a href="#jurisdiction-specific-rights">Jurisdiction-Specific Rights</a></li>
<ul>
<li><a href="#us-specific-rights">US Specific Rights</a></li>
<li><a href="#additional-notice-to-california-residents">Additional Notice to California Residents</a></li>
<li><a href="#additional-notice-to-nevada-residents">Additional Notice to Nevada Residents</a></li>
<li><a href="#notice-to-uk-eea-switzerland-residents">Notice to UK/EEA/Switzerland Residents</a></li>
</ul>
</ol>
<h3 id="collection-of-information">1. Collection of Information</h3>
<p>We and our third-party service providers and business partners may collect information from you directly and automatically when you visit the Services and from third parties. Some of this information may be considered personal information or personal data under various applicable laws. We consider information that identifies you as a specific, identified individual (such as your name, phone number, and e-mail address) to be personal information. We will also treat additional information, including IP addresses and cookie identifiers, as personal information or personal data where required by applicable law.</p>
<p>We may take your personal information and de-identify or pseudonymize it to make it non-personally identifiable, either by combining it with information about other individuals and/or by hashing the information or otherwise removing characteristics that make the information personally identifiable directly to you. We maintain and use de-identified or pseudonymized data without attempting to re-identify it, except where permitted by applicable law, such as to determine whether our de-identification processes satisfy legal requirements. We will treat de-identified or pseudonymized information as non-personal to the fullest extent allowed by applicable law.</p>
<h4 id="information-you-provide-directly">1.1 Information You Provide Directly</h4>
<p>We may ask you to provide certain personal information when you interact with the Services. This information may include contact information (such as your name and email), account information (such as your email - and if you choose to log in through Google or Apple, the associated user ID and email address), transaction information (such as your billing address and mailing address), or user content you choose to upload (such as photos and task lists). Note that all payments are handled by our third-party payment providers who may collect relevant information in order to complete your transaction (such as your payment card, billing address, and phone number) and are subject to its privacy policy, as provided at the time of such collection.</p>
<p>We may also ask you to provide the contact information of another individual, such as when you invite another user to the Services. When you provide us with an individuals contact information in this context, we will only use this information for the specific reason for which it was provided.</p>
<h4 id="information-we-collect-automatically">1.2 Information We Collect Automatically</h4>
<p>We and third-party companies and business partners may use a variety of technologies that automatically or passively collect certain information whenever you visit our Services or otherwise interact with us or our content (<strong>Usage Information</strong>). Usage Information may include the hardware model, browser, and operating system you are using, the URL or advertisement that referred you to the Service you are visiting, all of the areas within the Services that you visit, your time zone, non-precise location information, and mobile network (if applicable), among other information. In addition, we automatically collect your IP address or other unique identifier (<strong>Device Identifier</strong>) for any computer, mobile phone or other device you use to access our Services. In some cases, we may directly collect location information through your device. You may be able to turn off the collection of location information through the settings on your device. Usage Information is generally non-identifying, but if HabitRPG associates it with you as a specific and identifiable person, HabitRPG treats it as personal information.</p>
<ul>
<li><em>Web Tags</em>: Small graphic images or other web programming code called web tags (also known as pixel tags, 1x1 GIFs, or clear GIFs) may be included in our email messages sent by our third-party service providers on our behalf. Web beacons may be invisible to you, but any electronic image or other web programming code inserted into a web page or email can act as a web beacon. Web beacons or similar technologies may be used for several purposes, including, without limitation, to count visitors to the Service, to monitor how users navigate the Service, to count how many emails that were sent were opened, or to count how many particular links were actually viewed.</li>
<li><em>Embedded Scripts</em>: An embedded script is a programming code that is designed to collect information about your interactions with the Services, such as the links you click on. The code is temporarily downloaded onto your device from our server or a third-party service.</li>
<li><em>Session Events</em>: HabitRPG may engage third party service providers to analyze your session events with user interfaces, including what pages you visit on the Service, how long you visit those pages, the links you click, and your path through the Service for website analytics purposes, solely for our internal business purposes, and to improve our Services.</li>
</ul>
<h4 id="location-data">1.3 Location Data</h4>
<p>We do not collect your precise location. However, please note that we may still be able to collect or infer your approximate location through other information we collect, such as IP address. In addition, some mobile service providers may also provide us or our third-party service providers with information regarding the non-precise physical location of the device used to access our Services.</p>
<h4 id="information-from-third-parties">1.4 Information from Third Parties</h4>
<p>We may receive information about you from third parties. You may have the opportunity to log in through or otherwise connect your Apple and Google accounts. Additionally, when you interact with us through social media, you will be choosing to share information about your interactions with HabitRPG with that social media service.</p>
<p>The following chart sets out by category the personal data collected (<strong>Category</strong>), the purposes for which the information is collected (<strong>A. Purposes</strong>), the categories of third parties to whom the information may be disclosed for a business purpose (<strong>B. Disclosed To</strong>), and the categories of third parties to whom the information may be sold for monetary value or other valuable consideration or shared for cross-context behavioral advertising/targeted marketing (<strong>C. Sold/Shared To</strong>).</p>
<p>CHART GOES HERE</p>
<h3 id="purpose-and-use-of-information-we-collect">2. Purpose and Use of Information We Collect</h3>
<p>We may use non-personal information for any purpose, including for research and marketing purposes. We also use information that we collect, including personal information and Usage Information, as disclosed in this Privacy Policy and as follows:</p>
<ul>
<li>to provide the Services to you and allow you to participate in the features we offer;</li>
<li>to verify your identity and to otherwise manage your user account;</li>
<li>to tailor and target content, recommendations, and offers we display to you on the Services to send you communications with information about our products, and Services;</li>
<li>to fulfill your order, send you an order confirmation, process your payment, and communicate with you about your order;</li>
<li>to respond to your inquiries, customer service questions, feedback, or requests;</li>
<li>to provide you with technical support;</li>
<li>to improve our Services and for legal, regulatory, and internal business purposes; and</li>
<li>to fulfill any other purpose consistent with this Privacy Policy.</li>
</ul>
<p>We may also use your personal information for any other purpose as disclosed to you at the time of collection and with your consent. For example, if we choose to begin offering sweepstakes promotions, we will notify you of the use of your personal information for such sweepstakes prior to your engagement.</p>
<h3 id="sharing-of-information">3. Sharing of Information</h3>
<p>HabitRPG may share non-personal information, such as information about use of our Services, aggregated user statistics, or hashed and other de-identified or pseudonymized information with third parties, in our discretion. We do not share personal information with unaffiliated third parties for those third parties' own marketing purposes without your consent.</p>
<p>In addition, we may share the information we have collected about you as disclosed at the time you provide your information or your consent, and as described elsewhere in this Privacy Policy, including:</p>
<ul>
<li><em>At Your Request/Publicly Posted Content.</em> We may share information when you direct us to do so, such as if you choose to submit content on the Service (for example, when you decide to share your habits with other users). We do not control the actions of third parties, and you post content and share your information at your own risk.</li>
<li><em>Service Providers.</em> Our service providers may collect information on our behalf and at our direction, in order to provide Services on our behalf to help with our business activities. These companies are authorized to use your personal information only as necessary to provide these Services to us.<br><br>
Our Service Providers include:<br><br>
<table>
<tr>
<th>Service Provider Name</th>
<th>Product(s)</th>
</tr>
<tr>
<td>Google Cloud</td>
<td>cloud computing; storage</td>
</tr>
<tr>
<td>MongoDB</td>
<td>database</td>
</tr>
<tr>
<td>Heroku</td>
<td>cloud-based testing</td>
</tr>
<tr>
<td>Amazon Web Services</td>
<td>content storage</td>
</tr>
<tr>
<td>Hetzner</td>
<td>translations and push notifications</td>
</tr>
<tr>
<td>Stripe</td>
<td>payment processing</td>
</tr>
<tr>
<td>PayPal</td>
<td>payment processing</td>
</tr>
<tr>
<td>Amazon Payments</td>
<td>payment processing</td>
</tr>
<tr>
<td>Apple App Store</td>
<td>app host</td>
</tr>
<tr>
<td>Google Play Store</td>
<td>app host</td>
</tr>
<tr>
<td>Mailchimp</td>
<td>email marketing</td>
</tr>
<tr>
<td>Gmail</td>
<td>internal communications</td>
</tr>
<tr>
<td>Redislabs</td>
<td>rate limiting</td>
</tr>
<tr>
<td>Loggly</td>
<td>log management and analytics</td>
</tr>
<tr>
<td>Slack</td>
<td>internal communications</td>
</tr>
<tr>
<td>Amplitude</td>
<td>analytics</td>
</tr>
</table>
<br>
</li>
<li><em>Sweepstakes, Contests and Promotions.</em> We may offer sweepstakes, contests, or other promotions (any of which, a <strong>Promotion</strong>) that may require registration. By participating in a Promotion, you are agreeing to the provisions, conditions, or official rules that govern the Promotion, which may contain specific requirements of you (including, except where prohibited by law, allowing the sponsor(s) of the Promotion to use your name, voice, likeness, or other indicia of persona in advertising or marketing materials). If you choose to enter a Promotion, personal information may be disclosed to co-promotion partners, third parties or the public in connection with the administration of such Promotion, including in connection with winner selection, prize fulfillment, as required by law, or as permitted by the Promotions terms or official rules.</li>
<li><em>Business Transitions.</em> By providing your personal information you understand if there is a corporate transition such as a merger, acquisition, bankruptcy, or sale of all or a portion of our assets, or during the course of any due diligence process, your personal information may be disclosed without your further consent. Where required by law, we will make reasonable efforts to notify you before such transfer.</li>
<li><em>Administrative and Legal Reasons.</em> We reserve the right to use or disclose any information as needed to satisfy or fulfill our obligations under any law, regulation or legal request; to protect the integrity of the HabitRPG; to fulfill your requests; to cooperate in a law enforcement investigation, an investigation on a public safety matter, or an investigation into claims of intellectual property infringement; to protect and defend the legal rights and/or property of HabitRPG and any of our affiliates, shareholders, or our Services, any of its users, or any other party; or, in an emergency, to protect the health and safety of users or the general public. </li>
</ul>
<h3 id="third-party-analytics-providers">4. Third Party Analytics Providers</h3>
<p>We work with third-party service providers, such as analytics providers, to provide us with information regarding use of and traffic on our Services (including without limitation the pages viewed and the actions users take when visiting our Services). These third parties may set and access their own tracking technologies on your device (including cookies), and they may otherwise collect or have access to certain information about your use of the Services (such as Usage Information and Device Identifier). Some of these parties may collect personal information over time when you visit our Services or other online websites, and some may connect the information they collect through cookies and with other information about you.</p>
<ul>
<li>Google Analytics. We use Google Analytics, which uses cookies and similar technologies to collect and analyze data about the use of the Services and report on activities and trends. This service may also collect data about the use of other websites, apps, and online services. You can <a href="https://policies.google.com/technologies/partner-sites">learn about Google's practices</a>, and opt out of them by downloading the <a href="https://tools.google.com/dlpage/gaoptout">Google Analytics opt-out browser add-on.</a></li>
</ul>
<p>Options for Our Mobile App: Mobile devices may contain settings that allow you to disable certain tracking analytics. If this is available, you can opt-out through your mobile device settings.</p>
<h3 id="security">5. Security</h3>
<p>HabitRPG uses commercially reasonable steps designed to secure your personal information; however, no data transmission over the Internet, wireless transmission, or electronic storage of data can be guaranteed to be 100% secure. HabitRPG cannot ensure or warrant the security of any data we collect. You use the Services and provide us your data at your own risk.</p>
<h3 id="data-retention">6. Data Retention</h3>
<p>We will only retain your personal information for as long as your account is active or as necessary to provide you Services, comply with our legal obligations, resolve disputes, and enforce our agreements.</p>
<h3 id="general-audience-services">7. General Audience Services</h3>
<p>The Service are intended for users 13 years or older; you are not permitted to access or use the Service if you are younger than 13. We do not knowingly collect personal information from children under the age of 13 through the Service. We encourage parents and legal guardians to monitor their childrens Internet usage and to help enforce our Privacy Policy by instructing their children to never provide personal information without their permission. If you have reason to believe that a child under the age of 13 has provided personal information to us, please contact us at privacy@habitica.com, and we will delete that information from our databases.</p>
<h3 id="consent-to-international-transfer">8. Consent to International Transfer</h3>
<p>HabitRPG is based in the United States. Please be aware that information we collect will be transferred to and processed in the United States and other countries. HabitRPG makes no representation that this Privacy Policy or the practices described in it comply with the laws of any other jurisdiction. By using the Services, or providing us with any information, you fully understand and unambiguously consent to this transfer, processing, and storage of your information in the United States and other jurisdictions for which the privacy laws may not be as comprehensive as those in the country where you reside and/or are a citizen. As a result, this information may be subject to access requests from governments, courts, or law enforcement in the United States and other countries according to laws in those jurisdictions.</p>
<h3 id="your-choices">9. Your Choices</h3>
<p><em>Edit Your Information</em>: On the website, you can update the information in your user profile at any time by going to the user icon in the upper right, selecting the Profile option, then clicking Edit Profile. You can update your username and email address by going to the user icon in the upper right and selecting the Settings option. If you are using the mobile app, you can update your user profile, username, and email by tapping the Settings gear in the menu and then selecting the My Account option.</p>
<p><em>Reset Your Account</em>: You can fully delete or reset your account by selecting the user icon in the upper right, selecting the Settings, and then looking under General Settings. You can fully delete or reset your account on the mobile apps by tapping the Settings gear in the menu and then selecting the My Account submenu. Please note that in order to fully delete all data associated with your account, you will need to email us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>. Note that we may be required to retain certain data about you to comply with applicable laws.</p>
<p><em>Newsletter</em>: You may also sign-up to receive our email newsletter. If you would like to discontinue receiving this information, you may update your email preferences by using the Unsubscribe link found in emails we send to you, or by contacting us. Please note that we reserve the right to send you certain communications relating to your account or use of the Services, such as administrative and services announcements. These transactional account messages may be unaffected if you choose to opt out from marketing e-mails.</p>
<p><em>Push Notifications</em>: With your consent, we may send promotional and non-promotional push notifications or alerts to your mobile device. You can elect to stop receiving those messages by changing the notification settings in the app or on your mobile device.</p>
<p><em>Other Privacy Rights</em>: Certain jurisdictions provide additional rights. Please see the <a href="#jurisdiction-specific-rights">Jurisdiction-Specific Rights</a> section below for more information.</p>
<h3 id="changes-to-this-privacy-policy">10. Changes to This Privacy Policy</h3>
<p>To the extent permitted by applicable law, we reserve the right to change or modify this Privacy Policy at our discretion at any time. We will notify you of any material changes by posting the changed or modified Privacy Policy on our Services. We may also provide notice to you in other ways, such as through contact information you have provided. Any changes will be effective immediately upon the posting of the revised Privacy Policy unless otherwise specified. Your continued use of the Services after the effective date of the revised Privacy Policy (or such other act as specified in the revised Privacy Policy) will, to the fullest extent permitted by applicable law, constitute your consent to those changes. However, we will provide notice and obtain your consent (opt-in or opt-out) if required by law. We encourage you to regularly review this Privacy Policy for the latest information on our privacy practices.</p>
<h3 id="contact-us">11. Contact Us</h3>
<p>If you have any questions or concerns about this Privacy Policy, please contact us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a> with Privacy Policy in the subject line. You may also write to us at:</p>
<address>
HabitRPG, Inc.
<br>202 Bicknell Ave., Ground Floor
<br>Santa Monica, CA 90405
</address>
<h3 id="jurisdiction-specific-rights">12. Jurisdiction-Specific Rights</h3>
<p>As set forth below, residents of certain jurisdictions may have additional rights and choices regarding their personal information. If you are a resident of Nevada, please see additional information <a href="#additional-notice-to-nevada-residents">here</a>. Residents of the US please see additional information <a href="#us-specific-rights">here</a>. Residents of the UK, Switzerland, and EEA, please see additional information <a href="#notice-to-uk-eea-switzerland-residents">here</a>.</p>
<ul id="us-specific-rights">
<li>
<p><strong>US Specific Rights</strong>. Residents of U.S. states have the ability to exercise additional rights and choices regarding their personal data. We will take reasonable steps to accommodate your request but may need to verify your identity before doing so.<br><br>
We set forth above the categories of personal data we process, the purpose for processing personal data, the categories of personal data shared, and the categories of third parties with whom personal data is shared. If you would like to exercise your applicable rights, please contact us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a> to submit a request.</p>
</li>
<ul>
<li><strong>Access Your Personal Data/Data Portability &mdash; </strong>You have the right to confirm whether we are processing your personal data and request to access such data, obtain a copy of the personal data previously provided by you to us and, to the extent feasible, in a readily usable format to allow data portability.</li>
<li><strong>Delete Your Personal Data &mdash; </strong>You have the Right to Delete your personal data.</li>
<li><strong>Correct Your Personal Data &mdash; </strong>You have the Right to Correct the personal data we hold about you.</li>
<li><strong>Opt-Out of Sales of Your Personal Data and Targeted Advertising &mdash; </strong>You have the right to opt out of the sale of your data. Note that HabitRPG does not sell personal data to third parties for monetary compensation, but may share personal data for other valuable consideration such as with our third party analytics providers. If you would like to opt out of the sale of your personal data, please adjust your settings in our Cookie Preference Center. <strong><em>[LINK NEEDED]</em></strong></li>
<li><strong>Right to Appeal &mdash; </strong>If, for any reason, you would like to appeal our decision relating to your request, you have the right to submit an appeal if your state permits such right. Please include your full name, the basis for your appeal, and any additional information to consider.</li>
<li><strong>Opt-Out of Profiling in furtherance of legal or similarly significant effects &mdash; </strong>HabitRPG does not process your personal data for the purposes of profiling in furtherance of decisions that produce legal or similarly significant effects.</li>
</ul>
</ul>
<ul id="additional-notice-to-california-residents">
<li><strong>Additional Notice to California Residents.</strong></li>
<p>HabitRPG does not share personal information with third parties for their direct marketing purposes (as defined by California Civil Code Section 1798.83). If you are a California consumer and you have questions about our practices, please send your request by email to <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>. You must put the statement Your California Privacy Rights in the subject field of your email. We are not responsible for notices that are not labeled or sent properly, or do not have complete information.</p>
</ul>
<ul id="additional-notice-to-nevada-residents">
<li><strong>Additional Notice to Nevada Residents.</strong></li>
<p>HabitRPG does not currently sell your covered information as those terms are defined under applicable Nevada law. You may still submit an opt-out request and we will honor that request as required by Nevada law if HabitRPG were to engage in such a sale in the future. You may do so by emailing us at <a href="mailto:privacy@habitica.com">privacy@habitica.com</a> and putting Your Nevada Privacy Rights in the subject field of your request.</p>
</ul>
<ul id="notice-to-uk-eea-switzerland-residents">
<li><strong>Notice to United Kingdom/European/Switzerland Residents.</strong></li>
<p>If you are a resident of the United Kingdom (UK), European Economic Area (EEA), or of Switzerland, the following information applies.</p>
<p><strong>Purposes of processing and legal basis for processing: </strong>As explained above, we process personal information in various ways depending upon your use of our Services. We process personal information on the following legal bases: (1) with your consent; (2) as necessary to perform our agreement to provide the Services; (3) compliance with our legal obligations; and (4) as necessary for our legitimate interests in providing the Service where those interests do not override your fundamental rights and freedoms related to data privacy such as for:</p>
<ul>
<li>preventing fraud;</li>
<li>ensuring network and information security, including preventing unauthorized access to our computer and electronic communication systems and preventing malicious software distribution;</li>
<li>supporting internal administration;</li>
<li>improving and developing the Services; and</li>
<li>conducting data analytics analyses to review and better understand consumer interaction.</li>
</ul><br>
<p><strong>Right to lodge a complaint: </strong>Users that reside in the UK, EEA, or Switzerland have the right to seek information and assistance or lodge a complaint about our data collection and processing actions with the supervisory authority where they reside. Contact details for data protection authorities are available here. UK: <a href="https://ico.org.uk/">https://ico.org.uk/</a>, EEA: <a href="ttps://edpb.europa.eu/about-edpb/board/members_en">https://edpb.europa.eu/about-edpb/board/members_en</a> Switzerland: <a href="https://www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html">//www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html</a>.</p>
<p><strong>Transfers:</strong>Personal information we collect may be transferred to, and stored and processed in, the United States or any other country in which we or our affiliates or subcontractors maintain facilities. Transfers of personal data to a third country without an adequacy decision (as that term is understood pursuant to Article 45 of GDPR) are required to be subject to appropriate safeguards such as standard contractual clauses. In certain cases, we rely on your consent to facilitate transfer, processing, and storage of your data in the United States and other jurisdictions, where laws regarding processing of personal information may be less stringent than the laws in the EEA, UK, and Switzerland.</p>
<p><strong>Withdraw consent: </strong>If we have collected personal information with your consent, you have the right to withdraw that consent at any time.</p>
<p><strong>Access: </strong>You have the right to request access to personal information we collected about you and information about its sources, purposes, and sharing.</p>
<p><strong>Correction: </strong>You have the right to request that we correct the personal information we hold about you if it is inaccurate or incomplete.</p>
<p><strong>Erasure: </strong>You have the right to request that we erase data we have collected from you. Please note that we may have a reason to deny your deletion request or delete data in a more limited way than you anticipated, e.g., because of a legal obligation to retain it.</p>
<p><strong>Portability:</strong>You have the right, in certain circumstances, to request that we provide your personal information to you in a format that can be transferred to another entity.</p>
<p><strong>Restrict Processing: </strong>You have the right, in certain circumstances, to request that we limit our processing of your personal information if you are (1) contesting the accuracy of your personal information, (2) asserting that our processing is unlawful; (3) asserting that we no longer need to keep the information for reasons related to the establishment, exercise, or defense of legal claims, or you object to our processing. You have the right, in certain circumstances, to request that we limit our processing of your personal information if you are contesting the accuracy of your personal information; asserting that our processing is unlawful; asserting that we no longer need to keep the information for reasons related to the establishment, exercise, or defense of legal claims, or you object to our processing</p>
<p><strong>Objection: </strong>You have the right to object to our processing if we are processing your personal information based on legitimate interests, using your personal information for direct marketing (including profiling), or processing your personal information for purposes of scientific or historical research and statistics.</p>
<p><strong>Verification Procedures: </strong>We must verify your identity for everyones protection, so we may require you to provide us with verification information prior to accessing any records containing personal information about you. We do this by asking you to provide personal identifiers we can match against information we may have collected from you previously and confirm your request using the email stated in the request.</p>
<p>We will use the information you provide for verification only for the purpose of verification. We may have a reason under the law why we do not have to respond to your request or respond to it in a more limited way than you anticipated. If we do, we will explain that to you in our response.</p>
</ul>
</div>
<!-- eslint-enable max-len -->
</template>
@@ -0,0 +1,111 @@
<template>
<div
v-once
class="top-container mx-auto"
>
<div class="main-text mr-4">
<div class="title-details">
<h1>{{ $t('subscriptionBenefitsFaqTitle') }}</h1>
</div>
<div class="body-text">
<p>{{ $t('subscriptionPara0') }}</p>
<p>{{ $t('contentFaqPara1') }}</p>
</div>
<h3>{{ $t('subscriptionHeading0') }}</h3>
<p>{{ $t('subscriptionDetail00') }}</p>
<ul>
<li>{{ $t('subscriptionDetail000') }}</li>
<li>{{ $t('subscriptionDetail001') }}</li>
<li>{{ $t('subscriptionDetail002') }}</li>
<li>{{ $t('subscriptionDetail003') }}</li>
</ul>
<p>{{ $t('subscriptionDetail01') }}</p>
<ul>
<li>{{ $t('subscriptionDetail010') }}</li>
<li>{{ $t('subscriptionDetail011') }}</li>
<li>{{ $t('subscriptionDetail012') }}</li>
</ul>
<h3>{{ $t('subscriptionHeading1') }}</h3>
<p>{{ $t('subscriptionDetail10') }}</p>
<ul>
<li>{{ $t('subscriptionDetail100') }}</li>
<li>{{ $t('subscriptionDetail101') }}</li>
<li>{{ $t('subscriptionDetail102') }}</li>
</ul>
<p>{{ $t('subscriptionDetail11') }}</p>
<ul>
<li>{{ $t('subscriptionDetail110') }}</li>
</ul>
<h3>{{ $t('subscriptionHeading2') }}</h3>
<ul>
<li>{{ $t('subscriptionDetail20') }}</li>
<li>{{ $t('subscriptionDetail21') }}</li>
<li>{{ $t('subscriptionDetail22') }}</li>
<li>{{ $t('subscriptionDetail23') }}</li>
<li>{{ $t('subscriptionDetail24') }}</li>
<li>{{ $t('subscriptionDetail25') }}</li>
</ul>
<h3>{{ $t('subscriptionHeading3') }}</h3>
<p>{{ $t('subscriptionPara1') }}</p>
<ul>
<li>{{ $t('subscriptionDetail30') }}</li>
<li>{{ $t('subscriptionDetail31') }}</li>
<li>{{ $t('subscriptionDetail32') }}</li>
<li>{{ $t('subscriptionDetail33') }}</li>
</ul>
<h3>{{ $t('commonQuestions') }}</h3>
<h4>{{ $t('subscriptionDetail40')}}</h4>
<p>{{ $t('subscriptionDetail400')}}</p>
<h4>{{ $t('subscriptionDetail41')}}</h4>
<p>{{ $t('subscriptionDetail410')}}</p>
<h4>{{ $t('subscriptionDetail42')}}</h4>
<p>{{ $t('subscriptionDetail420')}}</p>
<h4>{{ $t('subscriptionDetail43')}}</h4>
<p>{{ $t('subscriptionDetail430')}}</p>
<h4>{{ $t('subscriptionDetail44')}}</h4>
<p>{{ $t('subscriptionDetail440')}}</p>
<ul>
<li>{{ $t('subscriptionDetail4400', { initialNumber: 25, roundedNumber: 26 }) }}</li>
<li>{{ $t('subscriptionDetail4400', { initialNumber: 35, roundedNumber: 36 }) }}</li>
<li>{{ $t('subscriptionDetail4400', { initialNumber: 45, roundedNumber: 46 }) }}</li>
</ul>
<h4>{{ $t('subscriptionDetail45')}}</h4>
<p>{{ $t('subscriptionDetail450')}}</p>
<p>{{ $t('subscriptionDetail451')}}</p>
<h4>{{ $t('subscriptionDetail46')}}</h4>
<p>{{ $t('subscriptionDetail460')}}</p>
<h4>{{ $t('subscriptionDetail47')}}</h4>
<p>{{ $t('subscriptionDetail470')}}</p>
<h4>{{ $t('subscriptionDetail48')}}</h4>
<p>{{ $t('subscriptionDetail480')}}</p>
<p
v-html="$t('subscriptionPara2',
{ mailto: '<a href=mailto:admin@habitica.com>admin@habitica.com</a>'}
)"
></p>
<p>{{ $t('subscriptionPara3') }}</p>
</div>
<faq-sidebar />
</div>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/faq.scss';
</style>
<script>
import FaqSidebar from '@/components/shared/faqSidebar';
export default {
components: {
FaqSidebar,
},
mounted () {
this.$store.dispatch('common:setTitle', {
section: this.$t('faq'),
subSection: this.$t('subscriptionBenefitsAdjustments'),
});
document.body.style.background = '#ffffff';
},
};
</script>
@@ -88,7 +88,7 @@ $itemHeight: 2rem;
.inline-dropdown {
&.select-multi .dropdown-toggle {
height: auto;
line-height: 1.571;
padding-bottom: 0px;
}
}
@@ -651,9 +651,9 @@
input, textarea {
transition-property: border-color, box-shadow, color, background;
background-color: rgba(255, 255, 255, 0.5);
background-color: rgba($white, 0.5);
&:focus:not(:disabled), &:active:not(:disabled), &:hover:not(:disabled) {
background-color: rgba(255, 255, 255, 0.75);
background-color: rgba($white, 0.75);
}
}
@@ -810,11 +810,7 @@
margin-right: 16px;
color: $blue-10;
}
.btn-footer {
height: 2rem;
}
}
}
.weekday-check {
margin-left: 0px;
@@ -884,6 +880,24 @@
margin-bottom: 0;
}
}
.disabled {
background-color: $white;
border: 2px solid transparent;
color: $gray-200;
line-height: 1.714;
box-shadow: 0px 1px 3px 0px rgba(26, 24, 29, 0.12), 0px 1px 2px 0px rgba(26, 24, 29, 0.24);
&:focus {
background-color: $white;
border: 2px solid $purple-400;
box-shadow: none;
}
&:active {
box-shadow: 0px 1px 3px 0px rgba(26, 24, 29, 0.12), 0px 1px 2px 0px rgba(26, 24, 29, 0.24);
}
}
}
@media only screen and (max-width: 768px) {
+17 -3
View File
@@ -61,6 +61,18 @@
left: calc((100% + 236px - 978px) / 2);
right: 0%;
}
@media screen and (max-width: 575px) {
max-width: none;
left: 3%;
right: 3%;
}
.message {
@media screen and (max-width: 450px) {
width: 100%;
}
}
}
.drawer-toggle-icon {
@@ -136,7 +148,7 @@
color: $white !important;
text-decoration: none !important;
border-bottom: 2px solid transparent;
padding: 0.5rem;
padding: 8px;
&-active, &:hover {
color: $white !important;
@@ -157,17 +169,19 @@
}
.drawer-slider {
padding: 12px 0 0 8px;
padding: 0;
white-space: nowrap;
position: relative;
width: 100%;
& .message {
display: flex;
align-items: center;
justify-content: center;
margin: auto;
top: calc(50% - 30px);
left: 24px;
left: 0;
right: 0;
position: absolute;
@@ -51,7 +51,7 @@
.header-tabs {
display: grid;
grid-template-columns: 1fr auto 1fr;
grid-template-columns: max-content;
}
// MS Edge
@@ -34,12 +34,6 @@
<template
v-for="item in showItems"
>
<div
v-if="shouldAddVerticalLine(item)"
:key="item.key"
class="vertical-divider"
:style="dividerMargins"
></div>
<slot
name="item"
:item="item"
@@ -56,6 +50,10 @@
$buttonAreaWidth: 60;
.items > div {
margin: 0 12px
}
.slider-root {
position: relative;
}
@@ -95,9 +93,11 @@
&.left-button {
left: 0;
padding-left: 0px;
}
&.right-button {
padding-left:20px;
right: 0;
}
}
@@ -108,15 +108,6 @@
justify-content: center;
align-items: center;
padding-top: 10px;
margin-left: $buttonAreaWidth+ px;
margin-right: $buttonAreaWidth+ px;
}
.vertical-divider {
height: 92px;
width: 1px;
background: #34313a;
margin-bottom: 8px;
}
</style>
@@ -199,9 +190,6 @@ export default {
itemsPerPage () {
return Math.floor(this.currentWidth / (this.itemWidth + this.itemMargin));
},
shouldAddVerticalLine (item) {
return this.items[this.itemsPerPage() - 1] === item && this.pointer !== 5;
},
scrollButtonsVisible () {
return this.items.length > this.itemsPerPage();
},
@@ -12,7 +12,9 @@
@select="selectItem($event)"
>
<template #item="{ item }">
<span :class="{'dropdown-icon-item': withIcon}">
<span
:class="{'dropdown-icon-item': withIcon}"
>
<slot
name="item"
:item="item"
@@ -54,7 +56,3 @@ export default {
},
};
</script>
<style scoped lang="scss">
</style>
@@ -446,7 +446,6 @@
padding: 1.5rem;
.guidelines {
height: 32px;
font-size: 12px;
font-weight: normal;
font-style: normal;
@@ -459,9 +458,10 @@
}
button {
height: 40px;
border-radius: 2px;
border-radius: 4px;
line-height: 1.714;
margin-left: 1.5rem;
padding: 2px 12px;
&.disabled {
cursor: default;
@@ -540,7 +540,7 @@
z-index: 1;
pointer-events: none;
box-shadow: 0 3px 12px 0 rgba(26, 24, 29, 0.24);
box-shadow: 0 3px 12px 0 rgba($black, 0.24);
}
.center-avatar {
+10 -4
View File
@@ -46,10 +46,13 @@
</div>
</div>
<div
class="col-12 d-flex "
:class="{'justify-content-center': applyNarrowView}"
class="col-12 d-flex"
:class="{'justify-content-center': applyNarrowView || maxWidthView}"
>
<div :class="{'settings-content': applyNarrowView, 'full-width-content': !applyNarrowView}">
<div :class="{
'settings-content': applyNarrowView,
'full-width-content': !applyNarrowView && !maxWidthView,
}">
<router-view />
</div>
</div>
@@ -207,8 +210,11 @@ export default {
if (!this.currentEvent || !this.currentEvent.promo) return 'none';
return this.currentEvent.promo;
},
maxWidthView () {
return this.$route.name === 'subscription';
},
applyNarrowView () {
return !['subscription', 'transactions'].includes(this.$route.name);
return !this.maxWidthView && this.$route.name !== 'transactions';
},
},
methods: {
+8 -10
View File
@@ -22,17 +22,15 @@ export default function handleRedirect (to, from, next) {
newAppState.paymentCompleted = true;
setLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE, JSON.stringify(newAppState));
if (newAppState.isStripeEdit) {
if (newAppState.paymentType === 'subscription') {
return next({ name: 'subscription' });
}
if (newAppState.isStripeEdit && newAppState.paymentType === 'groupPlan') {
return next({
name: 'groupPlanBilling',
params: { groupId: newAppState.groupId },
});
}
if (newAppState.paymentType === 'groupPlan') {
return next({
name: 'groupPlanBilling',
params: { groupId: newAppState.groupId },
});
}
if (newAppState.paymentType === 'subscription' || newAppState.paymentType === 'gift-subscription') {
return next({ name: 'subscription' });
}
const newGroup = newAppState.group;
@@ -12,6 +12,7 @@ const ContactPage = () => import(/* webpackChunkName: "static" */'@/components/s
const FAQPage = () => import(/* webpackChunkName: "static" */'@/components/static/faq');
const ChatSunsetFaq = () => import(/* webpackChunkName: "static" */'@/components/static/chatSunsetFaq');
const ContentScheduleFaq = () => import(/* webpackChunkName: "static" */'@/components/static/contentScheduleFaq');
const SubscriptionBenefitsFaq = () => import(/* webpackChunkName: "static" */'@/components/static/subscriptionBenefitsFaq');
const FeaturesPage = () => import(/* webpackChunkName: "static" */'@/components/static/features');
const GroupPlansPage = () => import(/* webpackChunkName: "static" */'@/components/static/groupPlans');
// Commenting out merch page see
@@ -48,6 +49,9 @@ export const STATIC_ROUTES = {
{
name: 'contentScheduleFaq', path: 'faq/content-release-changes', component: ContentScheduleFaq, meta: { requiresLogin: false },
},
{
name: 'subscriptionBenefitsFaq', path: 'faq/subscription-benefits-adjustments', component: SubscriptionBenefitsFaq, meta: { requiresLogin: false },
},
{
name: 'features', path: 'features', component: FeaturesPage, meta: { requiresLogin: false },
},
+4 -4
View File
@@ -1,6 +1,5 @@
{
"frequentlyAskedQuestions": "Често задавани въпроси",
"webFaqAnswer7": "Когато достигнете ниво 10, може да изберете да станете воин, магьосник, мошеник или лечител. (Всички играчи по подразбиране започват като воини.) Всеки клас има различна екипировка; различни умения, които могат да използват след ниво 11; и различни предимства. Воините могат лесно да нанасят щети на главатарите, както и да понесат повече щети от задачите си и като цяло правят групата си по-силна. Магьосниците също с лекота нанасят щети на главатарите, а също и качват нива по-бързо и възстановяват маната на групата си. Мошениците печелят най-много злато и намират най-много предмети, и могат да помогнат на останалите в групата да имат същия късмет. И накрая, лечителите могат да лекуват себе си и останалите в групата. Ако не искате веднага да избирате клас, например ако все още събирате средства, с които да закупите цялата екипировка за текущия си клас, може да се откажете от тази възможност, и когато сте готов(а), да я включите отново от настройките.",
"iosFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в кръчмата чрез Меню > Кръчма! Ще се радваме да помогнем.",
"androidFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в кръчмата чрез Меню > Кръчма! Ще се радваме да помогнем.",
"webFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в [Помощната гилдия на Хабитика](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! Ще се радваме да помогнем.",
@@ -18,13 +17,14 @@
"webFaqAnswer29": "Можете да възвърнете 15 HP, като закупите отвара от колоната си за Награди, за 25 злато. Освен това винаги ще възвърнете пълното си HP, когато качите ниво!",
"faqQuestion30": "Какво става, когато изчерпам HP?",
"webFaqAnswer30": "Ако вашите HP стигнат до нула, ще загубите едно ниво, цялото си злато и един случаен предмет, който може да бъде закупен отново.",
"faqQuestion31": "Защо загубих HP при неотрицателна задача в Habitica?",
"faqQuestion31": "Защо загубих HP при неотрицателна задача ?",
"webFaqAnswer31": "Ако завършите задача и загубите HP, когато не би трябвало, сте срещнали забавяне, докато сървърът синхронизира промените, направени на други платформи. Например, ако използвате злато, мана или загубите HP в мобилното приложение и след това завършите задача в уебсайта, сървърът просто потвърждава, че всичко е синхронизирано.",
"faqQuestion32": "Кога мога да си избера клас?",
"faqQuestion33": "Какво е синьото поле, което се появява след ниво 10?",
"faqQuestion34": "Какъв тип Храна харесва Домашният ми любимец?",
"webFaqAnswer33": "След като отключите Класовата система, също така отключвате Умения, които изискват Мана за използване. Маната се определя от вашата INТ стойност и може да бъде коригирана от Умения и Екипировка.",
"webFaqAnswer34": "Домашните любимци обичат Храна, която съответстват на техния цвят. Основните домашни любимци са изключение, но всички те харесват една и съща храна. Можете да видите конкретната Храна, която всеки домашен любимец харесва по-долу:\n\n- Основните домашни любимци харесват Месо\n- Белите домашни любимци харесвт Мляко\n- Домашните любимци от пустинята харесват Картофи\n- Червените домашни любимци харесват Ягоди\n- Тъмните домашни любимци харесват Шоколад\n- Скелетните домашни любимци харесват Риба\n- Зомби домашни любимци харесват Гнило месо\n- Розовите бонбонени домашни любимци харесват Розов захарен памук\n- Сините бонбонени домашни любимци харесват Син захарен памук\n- Златните домашни любимци харесват Мед",
"faqQuestion35": "Нахраних любимеца си и той изчезна!\nКакво се случи?",
"webFaqAnswer35": "След като сте нахранили своя домашен любимец достатъчно, за да го превърнете в Превозно, ще трябва да излюпите отново този вид домашен любимец, за да го имате в двора си.\n\nЗа да видите Превозни в мобилните приложения:\n\n- От менюто изберете \"Любимци&Превозни\" и превключете към раздела \"Превозни\".\n\nЗа да видите Превозни на уебсайта:\n\n- От менюто \"Инвентар\" изберете \"Двор\" и прегледайте раздела \"Превозни\"."
"faqQuestion35": "Нахраних любимеца си и той изчезна! Какво се случи?",
"webFaqAnswer35": "След като сте нахранили своя домашен любимец достатъчно, за да го превърнете в Превозно, ще трябва да излюпите отново този вид домашен любимец, за да го имате в двора си.\n\nЗа да видите Превозни в мобилните приложения:\n\n- От менюто изберете \"Любимци&Превозни\" и превключете към раздела \"Превозни\".\n\nЗа да видите Превозни на уебсайта:\n\n- От менюто \"Инвентар\" изберете \"Конюшня\" и прегледайте раздела \"Превози\".",
"faqQuestion36": "Как да променя външния вид на моя аватар?"
}
+19 -2
View File
@@ -5,7 +5,7 @@
"groupBy": "Групиране по <%= type %>",
"classBonus": "(Този предмет е за Вашия клас, така че показателите му се умножават по 1,5.)",
"classArmor": "Класова броня",
"featuredset": "Препоръчан комплект <%= name %>",
"featuredset": "Препоръчан комплект: <%= name %>",
"mysterySets": "Тайнствени комплекти",
"gearNotOwned": "Не притежавате този предмет.",
"noGearItemsOfType": "Не притежавате нищо от тези.",
@@ -1718,5 +1718,22 @@
"weaponSpecialKS2019Notes": "Огънат като човката и ноктите на грифон, този богато украсен полюс ти напомня да проявиш упоритост когато задачата изглежда невъзможна. Увеличава Сила със <%= str %>.",
"weaponSpecialKS2019Text": "Митичен Грифон Глайв",
"weaponSpecialSummer2019WarriorText": "Червен Корал",
"weaponSpecialSpring2019HealerText": "Пролетна Песен"
"weaponSpecialSpring2019HealerText": "Пролетна Песен",
"moreArmoireGearComing": "Омагьосаният Гардероб също получава нови запаси всеки месец!",
"weaponSpecialFall2019WarriorNotes": "Пригответе се да разкъсате враговете си с ноктите на гарван! Увеличава силата с <%= str %>. Лимитирана серия 2019 есенна екипировка.",
"moreArmoireGearAvailable": "Дотогава има <%= armoireCount %> части от екипировка в Омагьосаният Гардероб за намиране!",
"weaponSpecialSpring2019HealerNotes": "Твоята песен от цветя и дъжд ще успокои духовете на всички, които чуят. Увеличава интелигентността с <%= int %>. Ограничено издание на пролетна екипировка за 2019 г.",
"gearItemsCompleted": "Вие притежавате цялото <%= klass %> оборудване! Нова екипировка се пуска по време на сезонните Гала.",
"weaponSpecialSummer2019RogueNotes": "Това древно и страхотно оръжие ще ви помогне да спечелите всяка подводна битка. Увеличава силата с <%= str %>. Лимитирана серия 2019 лятна екипировка.",
"weaponSpecialSummer2019MageNotes": "Плод на вашия труд, взет за първи път от басейна, това малко съкровище дава сили и вдъхновява. Увеличава интелигентността с <%= int %>. Лимитирана серия 2019 лятна екипировка.",
"weaponSpecialFall2019RogueText": "Стойка за музика",
"weaponSpecialWinter2020RogueNotes": "Тъмнината е приятел на Мошеника. Тогава кой може по-добре да осветява пътя в най-тъмното време на годината? Увеличава силата с <%= str %>. Ограничено издание на зимна екипировка 2019-2020 г.",
"weaponSpecialFall2019MageNotes": "Независимо дали става въпрос за изковаване на гръмотевици, издигане на укрепления или просто всяване на ужас в сърцата на смъртните, този жезъл дава силата на гиганти, за да върши чудеса. Увеличава интелигентността с <%= int %> и възприятието с <%= per %>. Лимитирана серия 2019 есенна екипировка.",
"weaponSpecialWinter2020WarriorNotes": "Назад, катерици! Няма да вземете парче от това! ...Но ако всички искате да се мотаете и да пиете какао, това е страхотно. Увеличава силата с <%= str %>. Ограничено издание на зимна екипировка 2019-2020 г.",
"weaponSpecialWinter2020MageNotes": "С практиката можете да излъчвате тази звукова магия на всяка желана честота: медитативно бръмчене, празничен звън или АЛАРМА ЗА ОТЛОЖЕНА ЧЕРВЕНА ЗАДАЧА. Увеличава интелигентността с <%= int %> и възприятието с <%= per %>. Ограничено издание на зимна екипировка 2019-2020 г.",
"weaponSpecialFall2019RogueNotes": "Независимо дали дирижирате оркестъра или пеете ария, това полезно устройство държи ръцете ви свободни за драматични жестове! Увеличава силата с <%= str %>. Лимитирана серия 2019 есенна екипировка.",
"weaponSpecialWinter2020HealerNotes": "Размахайте го и ароматът му ще призове вашите приятели и помощници да започнат да готвите и печете! Увеличава интелигентността с <%= int %>. Ограничено издание на зимна екипировка 2019-2020 г.",
"weaponSpecialSummer2019HealerNotes": "Мехурчетата от тази пръчка улавят лечебна енергия и древна океанска магия. Увеличава интелигентността с <%= int %>. Лимитирана серия 2019 лятна екипировка.",
"weaponSpecialSummer2019HealerText": "Пръчка за балончета",
"weaponSpecialFall2019MageText": "Еднооката Тояга"
}
-1
View File
@@ -1,6 +1,5 @@
{
"frequentlyAskedQuestions": "Nejčastější otázky",
"webFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most Gold and find the most item drops, and they can help their party do the same. Finally, Healers can heal themselves and their party members. If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click \"Opt Out\" and re-enable it later under Settings.",
"iosFaqStillNeedHelp": "Jestli máš otázku, která není na tomto seznamu nebo na [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), použij formulář Ask a Question v sekci Nápověda na horní liště rozhraní. Jsme rádi když můžeme pomoct.",
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
"webFaqStillNeedHelp": "Pokud máš otázku, která není na tomto seznamu nebo na [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), přijď se zeptat do [Cechu „Habitica Help‟](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! Rádi ti pomůžeme.",
-1
View File
@@ -1,6 +1,5 @@
{
"frequentlyAskedQuestions": "Ofte stillede spørgsmål",
"webFaqAnswer7": "Når du når niveau 10 kan du vælge at blive en Kriger, Magiker, Slyngel eller Helbreder. (Alle spillere starter som Krigere.) Hver klasse har forskellige muligheder for udstyr, forskellige Evner du kan kaste efter niveau 11, og forskellige fordele. Krigere kan let gøre skade på bosser, tåle mere skade fra deres u-udførte opgaver, og hjælpe med at gøre deres gruppe sejere. Magikere kan også let gøre skade på bosser, samt stige hurtigt i niveau og genskabe mana for deres gruppe. Slyngler er dem der tjener mest guld og finder de fleste genstande, og de kan hjælpe deres gruppe med at gøre det samme. Endelig kan Helbredere hele sig selv og deres gruppemedlemmer. Hvis du ikke vil vælge en klasse med det samme - hvis du for eksempel stadig er i gang med at købe alt udstyret til din nuværende klasse -- kan du vælge \"Fravælg\" og vælge senere under Indstillinger.",
"iosFaqStillNeedHelp": "Hvis du har et spørgsmål, der ikke er på listen eller i [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), så kom forbi og spørg i værtshuset under Menu > Værtshus! Vi hjælper gerne.",
"androidFaqStillNeedHelp": "Hvis du har et spørgsmål, der ikke er på listen eller i [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), så kom forbi og spørg i Værtshuschatten under Menu > Værtshus! Vi hjælper gerne.",
"webFaqStillNeedHelp": "Hvis du har et spørgsmål, der ikke er på listen eller i [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), så kom forbi og spørg i Klanen [Habitica Help](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! Vi hjælper gerne.",
+6 -3
View File
@@ -820,9 +820,9 @@
"backgroundIceSculptureFestivalText": "Eisskulptur Festival",
"backgroundIceSculptureFestivalNotes": "Besuche ein Eisskulptur Festival.",
"backgroundWinterFullMoonNotes": "Bestaune den Wintervollmond.",
"backgroundBarrelCellarText": "Faßkeller",
"backgroundBarrelCellarText": "Fasskeller",
"backgrounds112023": "SET 114: Veröffentlicht im November 2023",
"backgroundBarrelCellarNotes": "Schau dich im Faßkeller nach Tafelfreuden um.",
"backgroundBarrelCellarNotes": "Schau dich im Fasskeller nach Tafelfreuden um.",
"backgroundSpectralCandleRoomText": "Raum der gespenstischen Kerzen",
"backgroundSpectralCandleRoomNotes": "Sprich mit Geistern im Raum der gespenstischen Kerzen.",
"backgroundMonstrousCaveText": "Monströse Höhle",
@@ -882,5 +882,8 @@
"backgroundMagicDoorInForestNotes": "Riskiere es, durch das Magische Tor im Wald zu gehen.",
"backgroundSurroundedByGhostsText": "Umgeben von Geistern",
"backgroundSurroundedByGhostsNotes": "Verbringe einen spukhaften Abend umgeben von Geistern.",
"backgrounds102024": "Set 124: Veröffentlicht im September 2024"
"backgrounds102024": "Set 124: Veröffentlicht im September 2024",
"backgroundCastleHallWithHearthText": "Schlosshalle mit Feuerstelle",
"backgrounds112024": "SET 126: Veröffentlicht im November 2024",
"backgroundCastleHallWithHearthNotes": "Entspanne dich in der Wärme einer Schlosshalle mit einer Feuerstelle."
}
+59 -5
View File
@@ -1,20 +1,19 @@
{
"frequentlyAskedQuestions": "Häufig gestellte Fragen",
"webFaqAnswer7": "Wenn Du Level 10 erreichst, kannst Du wählen, ob Du Krieger, Magier, Schurke oder Heiler werden möchtest. (Alle Spieler beginnen standardmäßig als Krieger). Jede Klasse hat unterschiedliche Ausrüstungsoptionen, unterschiedliche Fähigkeiten, die sie ab Level 11 verwenden können, und unterschiedliche Vorteile. Krieger fügen Bossen leichter Schaden zu, halten mehr Schaden von ihren Aufgaben aus und helfen ihrer Party widerstandsfähiger zu werden. Magier schaden Bossen ebenfalls leichter, steigen schnell Level auf und können Mana für ihre Party wieder auffüllen. Schurken erhalten das meiste Gold, finden die meiste Beute und können ihrer Party helfen, dies ebenfalls zu tun. Heiler können sich selbst und ihre Party heilen. Wenn Du nicht sofort eine Klasse auswählen möchtest zum Beispiel, wenn Du gerade dabei bist die gesamte Ausrüstung für Deine aktuelle Klasse zu kaufen kannst Du \"Später entscheiden\" klicken und die Klasse unter Menü > Einstellungen später aktivieren.",
"iosFaqStillNeedHelp": "Wenn Du eine Frage hast, die hier oder im [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ) nicht beantwortet wurde, stelle sie mit der \"Ask a Question\" Funktion. Wir helfen dir gerne.",
"androidFaqStillNeedHelp": "Wenn Du eine Frage hast, die hier oder im [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ) nicht beantwortet wurde, verwende das Stell eine Frage Formular [LINK NEEDED]! Wir helfen Dir gerne.",
"webFaqStillNeedHelp": "Wenn Du eine Frage hast, die hier oder im [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ) nicht beantwortet wurde, verwende das Stell eine Frage Formular [LINK NEEDED]! Wir helfen Dir gerne.",
"parties": "Partys",
"webFaqAnswer25": "Habitica verwendet drei verschiedene Aufgabentypen, um deinen Bedürfnissen gerecht zu werden: Gewohnheiten, tägliche Aufgaben und To-Dos.\n\nGewohnheiten können positiv oder negativ sein und stellen etwas dar, das Sie vielleicht mehrmals am Tag oder nach einem nicht festgelegten Zeitplan verfolgen möchten. Positive Gewohnheiten bringen euch Belohnungen wie Gold und Erfahrung (Exp), während ihr bei negativen Gewohnheiten Lebenspunkte (HP) verliert.\n\nDailies sind wiederkehrende Aufgaben, die du nach einem strukturierten Zeitplan erledigen möchtest. Zum Beispiel einmal am Tag, dreimal in der Woche oder viermal im Monat. Wenn du Dailies verpasst, verlierst du HP, aber je schwieriger sie sind, desto besser ist die Belohnung!\n\nTo-Dos sind einmalige Aufgaben, für deren Erledigung es Belohnungen gibt. To-Dos können ein Fälligkeitsdatum haben, aber du verlierst keine HP, wenn du es verpasst.\n\nWähle die Aufgabenart, die am besten zu dem passt, was du erreichen willst!",
"commonQuestions": "Häufige Fragen",
"commonQuestions": "Häufige Fragenj",
"faqQuestion25": "Welche Aufgabentypen gibt es?",
"faqQuestion26": "Was sind einige Beispielaufgaben?",
"webFaqAnswer31": "Wenn du eine Aufgabe erfüllst und HP verlierst, obwohl du das nicht hättest tun sollen, kam es zu einer Verzögerung, während der Server die auf anderen Plattformen vorgenommenen Änderungen synchronisiert hat. Wenn du zum Beispiel Gold oder Mana verwendest oder HP in der mobilen App verlierst und dann eine Aufgabe auf der Website erledigst, bestätigt der Server lediglich, dass alles synchronisiert ist.",
"webFaqAnswer49": "Wenn Du Habitica mit anderen erleben möchtest, aber keine anderen Spieler kennst, ist die Suche nach einer Party die beste Option! Wenn Du bereits andere Spieler kennst, die eine Party haben, kannst Du deinen @Benutzernamen mit ihnen teilen, um eingeladen zu werden. Alternativ kannst Du auch eine neue Gruppe erstellen und sie mit ihrem @Nutzernamen oder ihrer E-Mail-Adresse einladen.\n\nUm eine Party zu erstellen oder zu suchen, wähle \"Party\" im Navigationsmenü und wähle dann die Option, die Dir am besten gefällt.",
"webFaqAnswer62": "Gruppenpläne bieten dir die einzigartige Möglichkeit, anderen Mitgliedern deines Gruppenplans gemeinsame Aufgaben zuzuweisen. Wenn eine gemeinsame Aufgabe einem Mitglied zugewiesen wird, können andere Mitglieder sie nicht mehr erledigen.\n\nDu kannst eine Aufgabe auch mehreren Mitgliedern zuweisen. Wenn sich zum Beispiel alle Mitglieder die Zähne putzen müssen, erstellst du eine Aufgabe und weist sie jedem Mitglied zu. Jedes Mitglied kann die Aufgabe erledigen und sich seine individuelle Belohnung verdienen. Die Hauptaufgabe wird als erledigt angezeigt, sobald alle Mitglieder sie erledigt haben.",
"webFaqAnswer32": "In Habitica gibt es vier Klassen: Krieger, Magier, Schurke und Heiler. Alle Spieler beginnen in der Klasse des Kriegers, bis du Stufe 10 erreicht hast. Sobald du Stufe 10 erreicht hast, hast du die Wahl, eine neue Klasse zu wählen oder als Krieger weiterzuspielen.\n\nJede Klasse verfügt über unterschiedliche Ausrüstungen und Fertigkeiten. Wenn du dich nicht für eine Klasse entscheiden möchtest, kannst du \"Aussteigen\" wählen. Wenn du dich dafür entscheidest, kannst du das Klassensystem später in den Einstellungen wieder aktivieren.",
"webFaqAnswer32": "In Habitica gibt es vier Klassen: Krieger, Magier, Schurke und Heiler. Alle Spieler beginnen in der Klasse des Kriegers, bis du Stufe 10 erreicht hast. Sobald du Stufe 10 erreichst, hast du die Wahl, eine neue Klasse zu wählen oder als Krieger weiterzuspielen.\n\nJede Klasse verfügt über unterschiedliche Ausrüstungen und Fertigkeiten. Wenn du dich nicht für eine Klasse entscheiden möchtest, kannst du \"Aussteigen\" wählen. Wenn du dich dafür entscheidest, kannst du das Klassensystem später in den Einstellungen wieder aktivieren.",
"sunsetFaqPara14": "<strong>Linguists</strong><br />Wir freuen uns auch weiterhin über Hilfe bei der Übersetzung der Apps und der Website und werden für qualifizierte Beiträge nach wie vor Beitragsstufen vergeben. Die Methode, mit der wir Übersetzungen annehmen, wird sich jedoch ändern. Wir möchten unsere Ressourcen auf die Unterstützung einer bestimmten Auswahl von Sprachen für alle Plattformen konzentrieren. Um dies zu erreichen, werden wir die Anzahl der für Übersetzungen verfügbaren Sprachen reduzieren. Zuvor nicht fertiggestellte Sprachen werden in Github archiviert. Wir hoffen, dass diese Änderung das plattformübergreifende Habitica-Erlebnis konsistenter macht. Sie können unsere aktuellsten Richtlinien für das Übersetzungsverfahren auf unserer Website lesen <a href='https://translate.habitica.com/projects/habitica/#information'>Übersetzungswebsite</a>.",
"webFaqAnswer34": "Haustiere mögen Futter, das zu ihrer Farbe passt. Basis-Tiere sind die Ausnahme, aber alle Basis-Tiere mögen den gleichen Gegenstand. Im Folgenden siehst du, welche Nahrungsmittel jedes Haustier mag:\n\n * Basistiere mögen Fleisch\n * Weiße Haustiere mögen Milch\n * Wüstenhaustiere mögen Kartoffeln\n * Rote Haustiere mögen Erdbeeren\n * Schattentiere mögen Schokolade\n * Skelett-Tiere mögen Fisch\n * Zombie-Tiere mögen verdorbenes Fleisch\n * Zuckerwatte rosa Haustiere mögen rosa Zuckerwatte\n * Zuckerwatte Blaue Haustiere mögen blaue Zuckerwatte\n * Goldene Haustiere mögen Honig",
"webFaqAnswer34": "Haustiere mögen Futter, das zu ihrer Farbe passt. Basis-Tiere sind die Ausnahme, aber alle Basis-Tiere mögen den gleichen Gegenstand. Im Folgenden siehst du, welche Nahrungsmittel jedes Haustier mag:\n\n * Basistiere mögen Fleisch\n * Weiße Haustiere mögen Milch\n * Wüstenhaustiere mögen Kartoffeln\n * Rote Haustiere mögen Erdbeeren\n * Schattentiere mögen Schokolade\n * Skelett-Tiere mögen Fisch\n * Zombie-Tiere mögen verdorbenes Fleisch\n * Zuckerwatte rosa Haustiere mögen rosa Zuckerwatte\n * Zuckerwatte blaue Haustiere mögen blaue Zuckerwatte\n * Goldene Haustiere mögen Honig",
"webFaqAnswer35": "Sobald du dein Haustier genug gefüttert hast, um es zu einem Reittier zu machen, musst du diese Art von Haustier erneut ausbrüten, um es in deinem Stall zu haben.\n\nUm Reittiere in den mobilen Apps zu sehen:\n\n * Wähle im Menü \"Haustiere & Reittiere\" und wechseln zur Registerkarte \"Reittiere\".\n\nSo zeigst du Reittiere auf der Website an:\n\n * Wähle im Menü \"Inventar\" die Option \"Haustiere und Reittiere\" und scrollen nach unten zum Abschnitt \"Reittiere\"",
"webFaqAnswer37": "Kontrolliere, ob die Option Kostüm aktiviert ist. Wenn dein Avatar ein Kostüm trägt, wird dieses Ausrüstungsset anstelle deiner Kampfausrüstung angezeigt.\n\nSo schaltest du das Kostüm in den mobilen Apps ein:\n * Wähle im Menü \"Ausrüstung\", um den Schalter für das Kostüm zu finden.\n\nSo schaltest du das Kostüm auf der Website um:\n * Wähle in deinem Inventar \"Ausrüstung\" und suche den Schalter \"Kostüm\" auf der Registerkarte \"Kostüm\" in der Ausrüstungsschublade",
"webFaqAnswer41": "Mystische Sanduhren sind die exklusive Abonnentenwährung von Habitica, die im Mysteriöse Zeitreisende Laden verwendet wird! Sanduhren werden nach einem bestimmten Zeitplan geliefert, der auf Ihrem Abonnementplan basiert.\n\nZeitplan für die Lieferung von Sanduhren:\n * 1-Monats-Abonnenten erhalten 1 Sanduhr am Anfang des Monats nach der 3. aufeinanderfolgenden Zahlung.\n * 3-Monats-Abonnenten erhalten 1 Sanduhr sofort nach Abschluss des Abonnements, dann 1 weitere Sanduhr zu Beginn des Monats nach jeder Erneuerung.\n * 6-Monats-Abonnenten erhalten 2 Sanduhren sofort nach Abschluss des Abonnements, dann 2 weitere Sanduhren zu Beginn des Monats nach jeder Verlängerung.\n * 12-Monats-Abonnenten erhalten 4 Sanduhren sofort nach Abschluss des Abonnements, dann 4 weitere Sanduhren zu Beginn des Monats nach jeder Verlängerung.",
@@ -187,5 +186,60 @@
"contentAnswer70": "Hintergründe, Quests, Haustiere und Reittiere, die im Zeitreisenden Markt erhältlich sind, werden das ganze Jahr über erhältlich bleiben.",
"contentAnswer71": "Bleib am Ball für weitere Neuigkeiten über geplante Verbesserungen am Zeitreisenden Markt Shoppingerlebnis.",
"contentAnswer52": "Wir hoffen, daß diese Änderungen den Spielern helfen, durch die Individualisierungen in ihrem Besitz durchzusehen, während sie das Aussehen ihres Avatars bearbeiten, und dabei das Shoppingerlebnis für die anderen käuflichen Gegenstände erhalten bleibt.",
"contentFaqPara3": "Wenn du irgendwelche Fragen hast, die von den Antworten oben nicht abgedeckt sind, kannst du immer das Team kontaktieren unter <%= mailto %>! Wir gespannt auf den neuen Inhalte-Veröffentlichungsplan und freuen uns auf noch mehr Projekte in der Zukunft, die helfen, Habitica für alle Spieler besser zu machen."
"contentFaqPara3": "Wenn du irgendwelche Fragen hast, die von den Antworten oben nicht abgedeckt sind, kannst du immer das Team kontaktieren unter <%= mailto %>! Wir gespannt auf den neuen Inhalte-Veröffentlichungsplan und freuen uns auf noch mehr Projekte in der Zukunft, die helfen, Habitica für alle Spieler besser zu machen.",
"subscriptionBenefitsAdjustments": "Anpassungen der Abonnentenvorteile",
"subscriptionBenefitsFaqTitle": "Anpassungen der Abonnentenvorteile FAQ",
"subscriptionHeading0": "Änderungen der Mystischen Sanduhr",
"subscriptionDetail00": "Alle Abonnenten, inklusive derjenigen mit geschenkten Abonnements, werden 1 Mystische Sanduhr zu Beginn jedes Monats erhalten, an dem sie Abonnentenvorteile haben.",
"subscriptionDetail000": "Bei einer Abolaufzeit von 12 Monaten erhältst du 12 Mystische Sanduhren anstatt der bisherigen 4.",
"subscriptionDetail002": "Abonnenten müssen nicht länger auf den Monat nach ihrer wiederkehrenden Zahlung warten, um Mystische Sanduhren zu erhalten.",
"subscriptionDetail01": "Neue 12-Monatsabos erhalten einen initialen Einmalbonus von 12 zusätzlichen Mystischen Sanduhren beim Kauf.",
"subscriptionDetail011": "Spieler mit einem aktiven 12-Monatsabo werden diesen Bonus am selben Tag erhalten, an dem diese Änderungen in Kraft treten.",
"subscriptionDetail012": "Dieser Bonus gilt nicht für verschenkte Abonnements.",
"subscriptionHeading1": "Änderungen der Abonnenten-Edelsteine",
"subscriptionDetail100": "Neue 1-, 3- und 6-Monatsabos beginnen nun mit 24 Edelsteinen pro Monat und dieser Wert erhöht sich jeden Monat, an dem sie Abonnentenvorteile haben.",
"subscriptionDetail101": "Für alle Abonnenten, die derzeit eine ungerade Anzahl an Edelsteinen pro Monat erhalten, wird die maximale Edelsteinmenge auf die nächste gerade Zahl aufgerundet.",
"subscriptionDetail11": "Die Menge an Edelsteinen, die jeden Monat für Gold erworben werden kann, wird nicht länger zurückgesetzt, wenn dein Abonnement ausläuft.",
"subscriptionHeading2": "Warum führen wir diese Änderungen durch?",
"subscriptionDetail20": "In der aktuellen Struktur kann es schwierig zu erkennen sein, wie viele Mystische Sanduhren du erhältst und wann.",
"subscriptionDetail21": "Die vier Abonnement-Stufen waren bekannt dafür, Komplikationen bei einem Up- oder Downgrade auf eine andere Stufe zu verursachen.",
"subscriptionDetail22": "Bei Geschenk- oder wiederkehrenden Abonnements gab es unterschiedliche Vorteile und Regeln, die wir vereinfachen wollten.",
"subscriptionDetail24": "Wir wollten Abonnenten mehr als vier Chancen im Jahr geben, Gegenstände aus dem Laden des Zeitreisenden zu sammeln.",
"subscriptionHeading3": "Belohnungen am Veröffentlichungstag",
"subscriptionPara1": "Um den Wechsel in den neuen Rhythmus zu erleichtern, können bestehende Abonnenten einige Extras am Veröffentlichungstag erwarten. Wir wollen uns ehrlich für eure kontinuierliche Unterstützung in dieser Änderung bedanken!",
"subscriptionDetail31": "Spieler mit einem wiederkehrenden 3- oder 6-Monats-Abonnement werden 4 Mystische Sanduhren und 20 Edelsteine erhalten.",
"subscriptionDetail32": "Spieler mit einem wiederkehrenden 12-Monats-Abonnement werden den Bonus aus 12 Mystischen Sanduhren, wie oben genannt, und 20 Edelsteine erhalten.",
"subscriptionDetail40": "Ich bin ein Abonnent, wann bekomme ich meine erste reguläre Mystische Sanduhr und Erhöhung der Edelsteinobergrenze vom neuen Rhythmus?",
"subscriptionDetail41": "Wird sich der Preis des Abonnements ändern, wenn das veröffentlicht wird?",
"subscriptionDetail410": "Diese Änderungen werden nicht den aktuellen Preis für Abonnements beeinflussen.",
"subscriptionDetail42": "Wenn ich mich einen Monat lang nicht anmelde, während ich ein aktives Abonnement habe, werde ich die Vorteile verpassen?",
"subscriptionDetail420": "Genau wie Mystery-Ausrüstungssets wirst du keine Mystischen Sanduhren oder Erhöhungen der Edelsteinobergrenze verpassen, wenn du dich während des Abos nicht einloggst. Das nächste Mal, wenn du dich anmeldest, wirst du alle Vorteile für alle Monate erhalten, über die dein Abonnement aktiv war.",
"subscriptionDetail43": "Wenn ich mich für ein wiederkehrendes Abonnement anmelde und es dann kündige, werde ich trotzdem Vorteile erhalten?",
"subscriptionDetail44": "Ich bin ein aktiver Abonnent, wie viele Edelsteine werde ich nach den Änderungen im Marktplatz jeden Monat zur Verfügung haben?",
"subscriptionDetail4400": "Wenn du derzeit <%= initialNumber %> Edelsteine pro Monat freigeschaltet hast, wird diese Zahl auf <%= roundedNumber %> gesetzt.",
"subscriptionDetail45": "Wird mir der Kauf von zusätzlichen Geschenkabonnements mehr Mystische Sanduhren oder schneller eine höhere Edelsteinobergrenze bringen?",
"subscriptionDetail451": "Jedes Geschenkabonnement zählt zu der Anzahl an Monaten, die ein Spieler Abonnentenvorteile besitzt, hinzu und ermöglicht es, weiterhin jeden Monat Mystische Sanduhren und Erhöhungen der Edelsteinobergrenze zu erhalten.",
"subscriptionDetail46": "Wenn ich in der Vergangenheit ein Abonnement hatte, kann ich meine alte Edelsteinobergrenze freischalten, wenn ich das Abonnement jetzt erneuere?",
"subscriptionDetail47": "Ich habe ein Gruppen-Abonnement, was bedeutet das für mich?",
"subscriptionDetail48": "Gibt es Änderungen an anderen Abonnentenvorteilen, wie Mystery-Ausrüstungssets?",
"subscriptionDetail480": "Diese Änderungen betreffen nur Mystische Sanduhren und Abonnenten-Edelsteine. Alle anderen Vorteile bleiben unverändert.",
"subscriptionPara2": "Wenn du Fragen hast, die nicht von den obigen Antworten abgedeckt wurden, kannst du unser Team jederzeit unter <%= mailto %> kontaktieren.",
"subscriptionPara0": "Wir machen Habitica-Abonnements besser als je zuvor mit noch mehr Mystischen Sanduhren und Edelsteinen! Diese Neuerungen machen es viel einfacher, deine Abonnementvorteile zu verstehen.",
"subscriptionDetail001": "Alle Abonennten werden eine Mystische Sanduhr zum selben Zeitpunkt erhalten, passend zum Veröffentlichungszeitpunkt der monatlichen Mystischen Ausrüstungssets.",
"subscriptionDetail003": "Alle Abonnenten erhalten 1 Mystische Sanduhr direkt nach dem Kauf. Dies zählt als die Mystische Sanduhr des aktuellen Monats.",
"subscriptionDetail010": "Dies ist zusätzlich zu der monatlichen Mystischen Sanduhr, die alle neuen Abonnenten nach dem ersten Kauf erhalten.",
"subscriptionDetail10": "Die Menge an Edelsteinen, die Abonnenten mit Gold auf dem Marktplatz kaufen können, erhöht sich jeden Monat, an dem sie Abonnentenvorteile haben, um 2 bis zu einem Maximum von 50.",
"subscriptionDetail102": "Neue 12-Monatsabos beginnen sofort mit der maximalen Menge an Edelsteinen pro Monat, 50 Edelsteine statt der bisherigen 45.",
"subscriptionDetail110": "Wenn du die Menge an Edelsteinen, die du jeden Monat kaufen kannst, erhöhst und dann dein Abonnement kündigst, kannst du bei derselben Menge jederzeit in der Zukunft wieder einsteigen, selbst, wenn du eine niedrigere Abonnement-Stufe abschließt.",
"subscriptionDetail25": "Wir verstehen, dass sich die wirtschaftliche Lage ändern kann und wollten Abonnenten nicht für ausgelaufene Abos bestrafen, indem wir ihnen die Vorteile nehmen, die sie sich verdient haben.",
"subscriptionDetail30": "Spieler mit einem wiederkehrenden 1-Monats- oder Gruppen-Abonnement werden 2 Mystische Sanduhren und 20 Edelsteine erhalten.",
"subscriptionDetail33": "Um diese Belohnungen zu erhalten, muss dein Account ein aktives Abonnement vor dem 19. November besitzen.",
"subscriptionDetail23": "Eine Mystische Sanduhr pro Monat zu erhalten erlaubt es Abonnenten, in den Genuss der wechselnden Gegenstände im Laden des Zeitreisenden zu kommen.",
"subscriptionDetail400": "Für aktive Abonnenten, ihr bekommt eure erste Mystische Sanduhr und +2 Edelsteine auf euer monatliches Maximallevel bei eurem ersten Login des Monats nach der Veröffentlichung. Das bedeutet, wenn ihr euch schon im November eingeloggt haben solltet, wird eure erste reguläre Erhöhung im Dezember stattfinden.",
"subscriptionDetail450": "Da Mystische Sanduhren und Erhöhungen der Edelsteinobergrenze nun ein monatlicher Vorteil ist, wird der Kauf mehrerer Geschenkabonnements keine sofortigen zusätzlichen Vorteile bringen.",
"subscriptionDetail460": "Da wir die Anzahl an Edelsteinen, die du jeden Monat kaufen konntest, zurückgesetzt haben, sobald die Vorteile ausgelaufen waren, müssen Spieler mit ausgelaufenen Abonnements unter diesem neuen System neu anfangen.",
"subscriptionDetail430": "Die Kündigung eines aktiven Abonnements wird ein Enddatum für deine Vorteile festsetzen, bis zu dem du vollen Zugang zu allen Abo-Vorteilen hast. Das bedeutet, dass du weiterhin am Start jedes Monats Mystische Sanduhren und Erhöhungen der Edelsteinobergrenze erhältst, solange du Zugang zu diesen Vorteilen hast.",
"subscriptionDetail440": "Am Tag, an dem diese Änderungen in Kraft treten, erhalten aktive Abonnenten mit einer ungeraden Anzahl an Edelsteinen pro Monat folgende Anpassungen ihrer Edelsteinobergrenze:",
"subscriptionDetail470": "Gruppenabonnentenvorteile verhalten sich genauso wie die eines wiederkehrenden 1-Monats-Abonnements. Du erhältst eine Mystische Sanduhr am Anfang jedes Monats und die Anzahl an Edelsteinen, die du jeden Monat auf dem Marktplatz kaufen kannst, wird sich erhöhen bis zu einem Limit von 50.",
"subscriptionPara3": "Wir hoffen, dass dieser neue Rhythmus besser vorhersagbar ist, mehr Zugang zur fantastischen Gegenstandauswahl im Laden des Zeitreisenden ermöglicht und noch mehr Motivation bietet, jeden Monat Fortschritte an deinen Aufgaben zu machen!"
}
+35 -2
View File
@@ -2932,9 +2932,42 @@
"armorMystery202401Notes": "Diese Roben erscheinen filigran wie Schneeflocken, aber werden dich reichlich warm halten, während du deine winterliche Magie wirkst. Gewährt keinen Attributbonus. Januar 2024 Abonnentengegenstand.",
"armorMystery202406Notes": "Suche deine Feinde heim mit Stil und Flair! Gewährt keinen Attributbonus. Juni 2024 Abonnentengegenstand.",
"armorMystery202407Text": "Liebenswerter Axolotl Anzug",
"weaponArmoireSpookyCandyBucketNotes": "Mit einem epischen Kostüm wie diesem wirst du derart viel Süßigkeiten bekommen! Gut, daß du diesen bodenlosen Eimer hast, um das alles aufzunehmen. Versuche, nicht zu naschen, bevor du nachhause kommst. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Süßes oder Saures Set (Gegenstand 2 von 2)",
"weaponArmoireSpookyCandyBucketNotes": "Mit einem epischen Kostüm wie diesem wirst du derart viel Süßigkeiten bekommen! Gut, dass du diesen bodenlosen Eimer hast, um das alles aufzunehmen. Versuch, nicht zu naschen, bevor du nach Hause kommst. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Süßes oder Saures Set (Gegenstand 2 von 2)",
"weaponArmoireSpookyCandyBucketText": "Grusliger Süßigkeiten Eimer",
"armorMystery202407Notes": "Gleite durch Seen und Kanäle mit deinem hin und her fegenden rosa Schwanz! Gewährt keinen Attributbonus. Juli 2024 Abonnentengegenstand.",
"armorArmoireJewelersApronText": "Juweliers-Schürze",
"armorArmoireJewelersApronNotes": "Diese Hochleistungsschürze ist genau das Richtige zum Anziehen, wenn du dich kreativ fühlst. Das Beste daran sind die Dutzende kleiner Taschen, um alles, was du brauchst, darin zu verstauen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Juwelier Set (Gegenstand 1 von 4)."
"armorArmoireJewelersApronNotes": "Diese Hochleistungsschürze ist genau das Richtige zum Anziehen, wenn du dich kreativ fühlst. Das Beste daran sind die Dutzende kleiner Taschen, um alles, was du brauchst, darin zu verstauen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Juwelier Set (Gegenstand 1 von 4).",
"armorArmoireBlueStripedSwimsuitText": "Blau gestreifter Badeanzug",
"armorArmoireSmileyShirtText": "Shirt mit Smiley-Gesicht",
"armorArmoireSoftWhiteSuitText": "Weicher weißer Anzug",
"armorArmoireSchoolUniformPantsText": "Schuluniform mit Hose",
"armorArmoireSchoolUniformSkirtNotes": "Ob du nun eine Schule für magische Zauberer, Drachenreiter, Ballsportspieler, kreative Künstler oder Mitglieder einer Organisation, die zu geheim ist, um sie hier aufzuzählen, besuchst, du wirst mit dieser Uniform gut dazu passen. Erhöht Intelligenz um <%= int %>.Verzauberter Schrank: Schuluniform-Set (Gegenstand 1 von 4).",
"armorArmoireHattersSuitNotes": "Dein Outfit ist nicht vollständig ohne deine grüne Glücks-Fliege. Trage dies zu deiner nächsten verrückten Teeparty. Oder angenehmen Teeparty. Oder begeisterten Teeparty. Oder... Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Hutmacher-Set (Gegenstand 2 von 4).",
"armorArmoireBlueStripedSwimsuitNotes": "Was könnte spannender sein als Seemonster am Strand zu bekämpfen? Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Strand-Set (Gegenstand 2 von 4).",
"armorArmoireSchoolUniformPantsNotes": "Ob du nun eine Schule für magische Zauberer, Drachenreiter, Ballsportspieler, kreative Künstler oder Mitglieder einer Organisation, die zu geheim ist, um sie hier aufzuzählen, besuchst, du wirst mit dieser Uniform gut dazu passen. Erhöht Intelligenz um <%= int %>.Verzauberter Schrank: Schuluniform-Set (Gegenstand 2 von 4).",
"armorArmoireGreenFluffTrimmedCoatNotes": "Sagen erzählen, dass einmal in einer Generation ein Mantel daherkommt, der der wärmste und bequemste von allen ist. Sein Flausch ist außergewöhnlich und seine Knöpfe sind sogar von fäustlingsumhüllten Händen handhabbar. Das ist dieser Mantel hier. Erhöht Stärke und Intelligenz um jeweils <%= attrs %>. Verzauberter Schrank: Fallenstellerhut-Set (Gegenstand 2 von 2).",
"armorArmoireSoftWhiteSuitNotes": "Weiß ist eine friedvolle Farbe. Ob du nun ein strahlend weißes Bettlaken oder eine Decke aus frischgefallenem Schnee betrachtest, du wirst einen klaren und vorbereiteten Geist haben. Erhöht Ausdauer um <% con %> und Wahrnehmung um <%= per %>. Verzauberter Schrank: Weiße Lounge-Kleidung (Gegenstand 2 von 3).",
"armorArmoireCorsairsCoatAndCapeText": "Mantel und Umhang des Korsaren",
"armorArmoireSmileyShirtNotes": "Weil du glücklich bist! Zeig der Welt, dass du heute den ganzen Tag lächelst. Erhöht Intelligenz und Wahrnehmung um jeweils <%= attrs %>. Verzauberter Schrank: Optimisten-Set (Gegenstand 1 von 4).",
"armorArmoireYellowStripedSwimsuitText": "Gelb gestreifter Badeanzug",
"armorArmoireYellowStripedSwimsuitNotes": "Was könnte erfreulicher sein als Seemonster am Strand zu bekämpfen? Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Strand-Set (Gegenstand 1 von 4).",
"armorArmoireGreenFluffTrimmedCoatText": "Mantel mit grünem Flauschband",
"armorArmoireSchoolUniformSkirtText": "Schuluniform mit Rock",
"armorArmoireHattersSuitText": "Anzug des Hutmachers",
"armorArmoireKarateGiText": "Karate Gi",
"armorArmoireKarateGiNotes": "Diese leichte Karate-Uniform ist perfekt für Training oder Wettbewerbe. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Karate-Set (Gegenstand 1 von 10).",
"weaponArmoireStormKnightAxeText": "Axt des Sturmritters",
"weaponArmoireStormKnightAxeNotes": "Sammle deine Wut und schlage wie ein Donnerschlag zu! Erhöht Stärke um <%= str %>. Verzauberter Schrank: Sturmritter-Set (Gegenstand 3 von 3)",
"armorArmoireDiagonalRainbowShirtNotes": "Ein Klecks Farbe mit einem Schuss Stil. Sei fröhlich! Erhöht Ausdauer und Wahrnehmung um jeweils <%= attrs %> . Verzauberter Schrank: Regenbogen-Set (Gegenstand 2 von 2).",
"armorArmoireAdmiralsUniformText": "Admirals-Uniform",
"armorArmoireAdmiralsUniformNotes": "Wir salutieren dir! Diese Marineuniform signalisiert, dass du bereit bist, das Kommando sowohl von deinen Aufgaben als auch von einem Schiff zu übernehmen. Erhöht Ausdauer und Stärke um jeweils <%= attrs %> . Verzauberter Schrank: Admirals-Set (Gegenstand 2 von 2).",
"armorArmoireShawlCollarCoatText": "Schalkragen-Mantel",
"armorArmoireStripedRainbowShirtText": "Gestreiftes Regenbogen-Shirt",
"armorArmoireStripedRainbowShirtNotes": "Die Farben des Regenbogens sahen noch nie zuvor so gut aus. Sei mutig! Erhöht Stärke und Intelligenz um jeweils <%= attrs %>. Verzauberter Schrank: Regenbogen-Set (Gegenstand 1 von 2).",
"armorArmoireDiagonalRainbowShirtText": "Diagonales Regenbogen-Shirt",
"armorArmoireBasketballUniformText": "Basketball-Uniform",
"armorArmoireBasketballUniformNotes": "Fragst du dich, was auf dem Rücken dieser Uniform aufgedruckt ist? Deine Glückszahl, natürlich! Erhöht Wahrnehmung um <%= per %>.Verzauberter Schrank: Altertümliches Basketballset (Gegenstand 1 von 2).",
"armorArmoireShawlCollarCoatNotes": "Ein weiser Zauberer sagte einst, dass nichts besser ist als es sowohl gemütlich zu haben als auch produktiv zu sein! Trage diesen warmen und stylischen Mantel, wenn du die diesjährigen Herausforderungen meisterst. Erhöht Ausdauer um <%= con %>.",
"armorArmoirePaintersApronText": "Schürze des Malers",
"armorArmoirePaintersApronNotes": "Diese Schürze kann deine Kleidung vor Farbe und deine kreativen Projekte vor harschen Kritiken schützen. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Maler-Set (Gegenstand 1 von 4)."
}
+22 -18
View File
@@ -404,7 +404,7 @@
"questDustBunniesBoss": "Ungezähmte Staubmäuse",
"questGroupMoon": "Mondschlacht",
"questMoon1Text": "Mondkampf, Teil 1: Finde die geheimnisvollen Scherben",
"questMoon1Notes": "Die Bevölkerung von Habitica wurde durch etwas seltsames von ihren Aufgaben abgelenkt: Gewundene Steinsplitter erscheinen überall im Land. Besorgt ruft Dich die Seherin, @Starsystemic, zu ihrem Turm. Sie sagt: \"Ich erkenne ein besorgniserregendes Omen in diesen Splittern, die sich über das Land vereiteln und die hartarbeitende Bevölkerung ablenken. Ich kann die Quelle zurückverfolgen, aber dazu muss ich diese Steinsplitter zuerst untersuchen. Kannst Du einige davon zu mir bringen?\"",
"questMoon1Notes": "Die Bevölkerung von Habitica wurde durch etwas seltsames von ihren Aufgaben abgelenkt: Gewundene Steinsplitter erscheinen überall im Land. Besorgt ruft Dich die Seherin, @Starsystemic, zu ihrem Turm. Sie sagt: \"Ich erkenne ein besorgniserregendes Omen in diesen Splittern, die sich über das Land verteilen und die hartarbeitende Bevölkerung ablenken. Ich kann die Quelle zurückverfolgen, aber dazu muss ich diese Steinsplitter zuerst untersuchen. Kannst Du einige davon zu mir bringen?\"",
"questMoon1Completion": "@Starsystemic verschwindet in ihren Turm, um die Splitter zu begutachten, die Du gesammelt hast. \"Das könnte komplizierter werden, als wir dachten,\" meint @Beffymaroo, ihre treue Gehilfin. \"Es wird etwas dauern, bis wir die Ursache herausgefunden haben. Schau täglich vorbei und, sobald wir mehr wissen, werden wir Dir die nächste Questschriftrolle zukommen lassen.\"",
"questMoon1CollectShards": "Mondscherben",
"questMoon1DropHeadgear": "Mondkriegerhelm (Kopfbedeckung)",
@@ -497,7 +497,7 @@
"questMayhemMistiflying3DropShield": "Verwegene Regenbogenbotschaft (Schildhand-Gegenstand)",
"questMayhemMistiflying3DropWeapon": "Verwegene Regenbogenbotschaft (Haupthand-Gegenstand)",
"featheredFriendsText": "\"Gefiederte Freunde\" Quest-Paket",
"featheredFriendsNotes": "Beinhaltet \"Hilfe! Harpyien!\", \"Die Nachteule\" und \"Die Zeitraubvögel\".",
"featheredFriendsNotes": "Beinhaltet Quests, um Eier für das Eulen-Haustier, Papageien-Haustier und Falken-Haustier und Die Zeitraubvögel zu erhalten.",
"questNudibranchText": "Befall mit NurSofort-Nacktkiemern",
"questNudibranchNotes": "An einem faulen Tag in Habitica kommst Du endlich dazu, Deine To-Dos anzugehen. An Deiner dunkelrötlichsten Aufgabe leuchtet eine Horde glänzend blauer Seeschnecken. Du bist entzückt! Ihre saphirblaue Farbe lässt Deine einschüchterndsten Aufgaben so leicht wie Deine besten Gewohnheiten aussehen. In fieberhaftem Wahn machst Du Dich an die Arbeit, packst in unaufhörlicher Raserei eine Aufgabe nach der anderen an...<br><br>Das nächste, an das Du Dich erinnerst, ist wie @LilithofAlfheim Dich mit kaltem Wasser übergießt. \"Die NurSofort-Nacktkiemer haben Dich total zerstochen! Du musst eine Pause machen!\" <br><br>Schockiert stellst Du fest, dass Deine Haut genauso rot leuchtet, wie einst Deine To-Do-Liste. \"Produktiv zu sein ist eine Sache\", sagt @beffymaroo, \"aber Du musst auch auf Dich selbst achten. Beeilung, lass sie uns loswerden!\"",
"questNudibranchCompletion": "Du siehst, wie die letzte NurSofort-Nacktkiemerschnecke von einem Stapel erledigter Aufgaben rutscht, als @amadshade sie wegwäscht. Eine lässt einen Kleidersack zurück, und als Du ihn öffnest, findest Du etwas Gold ein paar kleine Ellipsoiden, von denen Du annimmst, dass es Eier sind.",
@@ -505,7 +505,7 @@
"questNudibranchDropNudibranchEgg": "Nacktkiemerschnecke (Ei)",
"questNudibranchUnlockText": "Schaltet den Kauf von Nacktkiemerschneckeneiern auf dem Marktplatz frei",
"splashyPalsText": "\"Spritzige Kumpel\" Quest-Paket",
"splashyPalsNotes": "Beinhaltet 'Das Dilatory-Rennen', 'Führe die Schildkröte' und 'Jammern des Wals'.",
"splashyPalsNotes": "Beinhaltet Quests, um Eier für das Schildkröten-Haustier, Wal-Haustier und Seepferdchen-Haustier zu erhalten: Führe die Schildkröte, Jammern des Wals und Das Dilatory-Rennen.",
"questHippoText": "Was für ein heuchlerisches Hippo",
"questHippoNotes": "Du und @awesomekitty kollabiert vor Erschöpfung in dem Schatten einer Palme. Die Sonne glüht über der Schleichendstetigen Savanne und verbrennt den Grund unter ihr. Bis jetzt ist dies ein produktiver Tag gewesen, an dem Du Deine Tagesaufgaben besiegt hast. Und nun sieht diese Oase wie schönes Plätzchen aus, an dem man eine erfrischende Pause machen kann. Du beugst dich in der Nähe des Wassers herunter um etwas zu trinken, doch Du stolperst sogleich geschockt zurück, als sich ein riesiges Nilpferd vor dir erhebt. \"Ruhst Du dich jetzt schon aus? Sei nicht so faul und geh zurück zu deiner Arbeit.\" Du versuchst ihm zu widersprechen und zu sagen, dass Du sehr hart gearbeitet hast und eine Pause brauchst, aber das Hippo wollte nichts davon wissen. <br><br> @khdarkwolf flüstert dir zu, \"Fällt dir auf wie es den ganzen Tag faulenzt, aber die Frechheit besitzt dich faul zu nennen? Dies ist das heuchlerische Hippo!\" <br><br> Dein Freund @jumorales nickt. \"Kommt, wir zeigen ihm wie es ist, hart zu arbeiten!\"",
"questHippoCompletion": "Das Hippo verbeugt sich kapitulierend. “Ich habe Dich unterschätzt. Es sieht so aus, als ob Du gar nicht faul gewesen bist. Ich entschuldige mich. Um die Wahrheit zu sagen, ich habe vielleicht einiges auf Dich projiziert. Vielleicht sollte ich selbst auch einige meiner Aufgaben erledigen. Hier, nimm diese Eier als ein Zeichen meiner Dankbarkeit.” Nachdem Du sie genommen hast, lässt Du Dich beim Wasser nieder, um endlich zu entspannen.",
@@ -513,9 +513,9 @@
"questHippoDropHippoEgg": "Nilpferd (Ei)",
"questHippoUnlockText": "Schaltet den Kauf von Nilpferdeiern auf dem Marktplatz frei",
"farmFriendsText": "\"Farmfreunde\" Quest-Paket",
"farmFriendsNotes": "Beinhaltet 'Die Muhtantische Kuh', 'Reite die Nacht-Mähre', und 'Der Donner-Bock'.",
"farmFriendsNotes": "Beinhaltet Quests, um Eier für das Pferde-Haustier, Schaf-Haustier und Kuh-Haustier zu erhalten: Reite die Nacht-Mähre, Der Donner-Bock und Die Muhtantische Kuh.",
"witchyFamiliarsText": "\"Hexenhafte Haustiere\" Quest-Paket",
"witchyFamiliarsNotes": "Beinhaltet 'Der Rattenkönig', 'Die eisige Arachnoide', und 'Sumpf des Chaos-Froschs'.",
"witchyFamiliarsNotes": "Beinhaltet Quests, um Eier für das Frosch-Haustier, Spinnen-Haustier und Ratten-Haustier zu erhalten: Sumpf des Chaos-Froschs, Die eisige Arachnoide und Der Rattenkönig.",
"questGroupLostMasterclasser": "Geheimnis der Klassenmeister",
"questUnlockLostMasterclasser": "Um diese Quest freizuschalten, musst Du die finalen Quests der Questreihen 'Dilatory in Gefahr', 'Chaos in Mistiflying', 'Stoïstilles Unglück' und 'Schrecken in den Aufgabenwäldern' abgeschlossen haben.",
"questLostMasterclasser1Text": "Das Geheimnis der Klassenmeister, Teil 1: Lies zwischen den Zeilen",
@@ -559,7 +559,7 @@
"questYarnDropYarnEgg": "Wollknäuel (Ei)",
"questYarnUnlockText": "Schaltet den Kauf von Wollknäueleiern auf dem Marktplatz frei",
"winterQuestsText": "\"Winter\" Quest-Paket",
"winterQuestsNotes": "Beinhaltet 'Wildernder Weihnachtswichtel', 'Finde das Jungtier' und 'Der Federvieh-Frost'. Beachte, dass Wildernder Weihnachtswichtel und Finde das Jungtier stapelbare Questerfolge haben, aber nur einmalig ein seltenes Haus- und Reittier verleihen.",
"winterQuestsNotes": "Beinhaltet Quests, um Eier für das Eisbären-Haustier, das Eisbären-Reittier und das Pinguin-Haustier zu erhalten: Finde das Jungtier, Wildernder Weihnachtswichtel und Der Federvieh-Frost.",
"questPterodactylText": "Der Pterror-Dactylus",
"questPterodactylNotes": "Du machst einen Spaziergang entlang der friedlichen Stoïstillen Klippen, als ein böses Kreischen die Luft zerreißt. Du drehst Dich um, siehst eine schreckliche Kreatur auf Dich zufliegen und wirst von einem mächtigen Schrecken überwältigt. Als Du Dich zur Flucht wendest, packt Dich @Lilith of Alfheim. \"Keine Panik! Es ist nur ein Pterror-Dactylus.\"<br><br>@Procyon P nickt. \"Sie nisten in der Nähe, aber sie fühlen sich angezogen vom Geruch negativer Gewohnheiten und unerledigter Tagesaufgaben.\"<br><br>Keine Sorge\", sagt @Katy133. \"Wir müssen nur besonders produktiv sein, um ihn zu besiegen!\" Du bist erfüllt von einem erneuerten Sinn für Zielstrebigkeit und wendest Dich Deinem Feind zu.",
"questPterodactylCompletion": "Mit einem letzten Kreischen stürzt der Pterror-Dactylus über die Klippe. Du rennst nach vorn, um zu sehen, wie er über die entfernten Steppen hinwegfliegt. \"Puh, ich bin froh, dass das vorbei ist\", sagst Du. \"Ich auch\", antwortet @GeraldThePixel. \"Aber seht doch! Er hat ein paar Eier für uns zurückgelassen.\" @Edge gibt Dir drei Eier, und Du gelobst, sie in friedlicher Ruhe aufzuziehen, umgeben von positiven Gewohnheiten und blauen Tagesaufgaben.",
@@ -594,7 +594,7 @@
"questDysheartenerDropHippogriffMount": "Hoffnungsfroher Hippogreif (Reittier)",
"dysheartenerArtCredit": "Artwork von @AnnDeLune",
"hugabugText": "\"Knuddel den Käfer\" Quest-Paket",
"hugabugNotes": "Beinhaltet 'Der KRITISCHE BUG', 'Die Schnecke der Schlamm-Schinderei' und 'Flieg' weiter, Funkenfalter!'.",
"hugabugNotes": "Beinhaltet Quests, um Eier für das Käfer-Haustier, das Raupen-Haustier und das Schnecken-Haustier zu erhalten: Der KRITISCHE BUG, Flieg' weiter, Funkenfalter! und Die Schnecke der Schlamm-Schinderei.",
"questSquirrelText": "Das Raffinierte Eichhörnchen",
"questSquirrelNotes": "Du wachst auf und bemerkst, dass Du verschlafen hast! Warum hat Dein Wecker nicht geklingelt? .... Wie ist eine Eichel in die Klingel geraten?<br><br>Als Du versuchst, Frühstück zu machen, ist der Toaster mit Eicheln gefüllt. Als Du Dein Reittier holen willst, ist @Shtut da und versucht erfolglos, den Stall aufzusperren. Du schaust in das Schlüsselloch. “Ist das eine Eichel da drin?”<br><br>@randomdaisy ruft: “Oh nein! Ich wusste, dass meine Haustier-Eichhörnchen ausgebüxt sind, aber ich wusste nicht, dass sie solche Schwierigkeiten gemacht haben! Kannst Du mir helfen, sie zusammenzutreiben, bevor sie noch mehr Chaos anrichten?”<br><br>Den Spuren der schelmisch platzierten Eichennüsse folgend, fängst Du die eigensinnigen Nager, wobei @Cantras hilft sie sicher zu Hause unterzubringen. Aber gerade als Du denkst, dass Deine Aufgabe fast erledigt ist, prallt eine Nuss von Deinem Helm ab! Du schaust auf, um ein mächtiges Exemplar eines Eichhörnchens zu sehen, das zur Verteidigung eines wunderbaren Haufens von Eicheln zusammengekauert dasitzt.<br><br>“Oh je”, sagt @randomdaisy leise. “Sie war schon immer eine Art Ressourcenschützerin. Wir müssen sehr vorsichtig vorgehen!” Ihr kreist das Tier langsam ein, bereit für Ärger!",
"questSquirrelCompletion": "Mit einer sanften Herangehensweise, Tauschangeboten und ein paar beruhigenden Zaubersprüchen kannst Du das Eichhörnchen von seinem Schatz weglocken und zurück zu den Ställen bringen, die @Shtut gerade erst enteichelt hat. Ein paar der Eicheln siehst Du auf einem Arbeitstisch beiseite gelegt. “Das sind Eichhörncheneier! Vielleicht kannst Du welche aufziehen, die nicht so viel mit ihrem Essen spielen.”",
@@ -602,9 +602,9 @@
"questSquirrelDropSquirrelEgg": "Eichhörnchen (Ei)",
"questSquirrelUnlockText": "Schaltet den Kauf von Eichhörncheneiern auf dem Marktplatz frei",
"cuddleBuddiesText": "\"Kuschelkumpel\" Quest-Paket",
"cuddleBuddiesNotes": "Beinhaltet 'Das Killerkaninchen', 'Das Ruchlose Frettchen' und 'Die Meerschweinchen Gang'.",
"cuddleBuddiesNotes": "Beinhaltet Quests, um Eier für das Hasen-Haustier, das Frettchen-Haustier und das Meerschweinchen-Haustier zu erhalten: Das Killerkaninchen, Das Ruchlose Frettchen und Die Meerschweinchen Gang.",
"aquaticAmigosText": "\"Feuchte Freunde\" Quest-Paket",
"aquaticAmigosNotes": "Beinhaltet 'Der magische Axolotl', 'Der Kraken von Unfertik' und 'Der Ruf des Octothulu'.",
"aquaticAmigosNotes": "Beinhaltet Quests, um Eier für das Tintenfisch-Haustier, das Oktopus-Haustier und das Axolotl-Haustier zu erhalten: Der Kraken von Unfertik, Der Ruf des Octothulu und Der magische Axolotl.",
"questSeaSerpentText": "Gefahr in der Tiefe: Seeschlangen-Angriff!",
"questSeaSerpentNotes": "Du fühlst Deine Glückssträhne - es ist die perfekte Zeit für einen Ausflug zur Seepferdchen-Rennstrecke. Du steigst in das U-Boot bei Diligent Docks ein und machst Dich bereit für die Reise nach Dilatory, aber kaum bist Du untergetaucht, erschüttert ein Aufprall das U-Boot und lässt seine Insassen stolpern. “Was ist los?” schreit @AriesFaries.<br><br>Du schaust durch ein nahegelegenes Bullauge und bist schockiert von der Wand aus schimmernden Schuppen, die an ihm vorbeizieht. “Seeschlange!” ruft Captain @Witticaster über die Gegensprechanlage aus. “Haltet euch fest, sie kommt schon wieder!” Während Du Dich an die Armlehnen Deines Sitzes klammerst, ziehen Deine unerledigten Aufgaben vor Deinen Augen vorüber. “Vielleicht, wenn wir zusammen arbeiten und sie erledigen”, denkst Du, “können wir dieses Monster vertreiben!”",
"questSeaSerpentCompletion": "Von Deiner Hingabe angeschlagen, flieht die Seeschlange und verschwindet in den Tiefen. Als Du in Dilatory ankommst, entfährt Dir ein Seufzer der Erleichterung, bevor Du bemerkst, dass @*~Seraphina~ sich mit drei durchsichtigen Eiern in ihren Armen nähert. “Hier, die hier sollst Du haben”, sagt sie. “Du weißt, wie man mit einer Seeschlange umgeht!” Als Du die Eier annimmst, gelobst Du von neuem, standhaft bei der Erfüllung Deiner Aufgaben zu bleiben, um sicherzustellen, dass es nicht zu einer Wiederholung kommt.",
@@ -618,7 +618,7 @@
"questKangarooDropKangarooEgg": "Känguru (Ei)",
"questKangarooUnlockText": "Schaltet den Kauf von Känguru-Eiern auf dem Marktplatz frei",
"forestFriendsText": "\"Waldfreunde\" Quest-Paket",
"forestFriendsNotes": "Beinhaltet 'Die Seele des Frühlings', 'Das Igelmonster' und 'Das Baumgewirr'.",
"forestFriendsNotes": "Beinhaltet Quests, um Eier für das Baumling-Haustier, das Reh-Haustier und das Igel-Haustier zu erhalten: Das Baumgewirr, Die Seele des Frühlings und Das Igelmonster.",
"questAlligatorText": "Der Insta-Gator",
"questAlligatorNotes": "“Verflixt!” ruft @gully aus. “Ein Insta-Gator in seinem natürlichen Lebensraum! Vorsichtig, er lenkt seine Beute mit Dingen ab, die dringend erscheinen, JETZT SOFORT, und er ernährt sich von den daraus resultierenden liegengebliebenen Tagesaufgaben.” Du verstummst um nicht aufzufallen, aber ohne Erfolg. Der Insta-Gator entdeckt Dich und stürmt los! Aus den Sümpfen der Stagnation erheben sich ablenkende Stimmen, die nach Deiner Aufmerksamkeit greifen: “Lies diesen Beitrag! Sieh Dir dieses Foto an! Achte auf mich, JETZT SOFORT!” Du reißt Dich zusammen um einen Gegenangriff zu starten, vervollständigst Deine Tagesausgaben und stärkst Deine guten Gewohnheiten, um den gefürchteten Insta-Gator zu bekämpfen.",
"questAlligatorCompletion": "Du konzentrierst Dich auf das Wesentliche und nicht auf die Ablenkungen des Insta-Gators, und so flieht der Insta-Gator. Sieg! “Sind das Eier? Sie sehen für mich wie Alligatoreier aus”, fragt @mfonda. “Wenn wir uns richtig um sie kümmern, werden sie treue Haustiere oder Reittiere sein”, antwortet @UncommonCriminal und übergibt Dir drei, um sich um sie zu kümmern. Lasst es uns hoffen, sonst könnte der Insta-Gator zurückkehren…",
@@ -626,9 +626,9 @@
"questAlligatorDropAlligatorEgg": "Alligator (Ei)",
"questAlligatorUnlockText": "Schaltet den Kauf von Alligatoreneiern auf dem Marktplatz frei",
"oddballsText": "\"Sonderlinge\" Quest-Paket",
"oddballsNotes": "Beinhaltet 'Der Glibberkönig', 'Entkomme dem Höhlenungetüm' und 'Ein verheddertes Knäuel'.",
"oddballsNotes": "Beinhaltet Quests, um Eier für das Schleim-Haustier, das Garn-Haustier und das Felsen-Haustier zu erhalten: Der Glibberkönig, Ein verheddertes Knäuel und Entkomme dem Höhlenungetüm.",
"birdBuddiesText": "\"Vogel-Freunde\" Quest-Paket",
"birdBuddiesNotes": "Beinhaltet 'Der Federvieh-Frost', 'Der Hahnenkampf' und 'Der Für-und-Wider-Pfau'.",
"birdBuddiesNotes": "Beinhaltet Quests, um Eier für das Pfauen-Haustier, das Pinguin-Haustier und das Hahn-Haustier zu erhalten: Der Für-und-Wider-Pfau, Der Federvieh-Frost und Der Hahnenkampf.",
"questVelociraptorText": "Der Veloci-Rapper",
"questVelociraptorNotes": "Du teilst Honigkuchen mit @*~Seraphina~*, @Procyon P, and @Lilith of Alfheim an einem See in den Stoïstille Steppen. Plötzlich unterbricht eine traurige Stimme Dein Picknick.<br><br><em>Meine Gewohnheiten vergessen, die Tagesaufgaben verpasst,<br>Ich hab nachgelassen, das ist mir verhasst,<br>Alles lief rund, ich fühlte mich gut,<br>Doch jetzt herrscht Fälligkeitstermine-Flut.</em><br><br>@*~Seraphina~* guckt hinter einen Grasbüschel. “Das ist Veloci-Rapper. Es scheint... verzweifelt?” <br><br>Du ballst entschlossen Deine Faust. “Da gibt es nur eine Lösung. Zeit für eine Rap Battle!”",
"questVelociraptorCompletion": "Du springst durch das Gras und stellst Veloci-Rapper.<br><br><em>Hör mir zu, Rapper, gib nicht so schnell auf,<br>Schlechten Gewohnheiten raubst Du doch den Schnauf!<br>Hak' ab die To-Dos mit neuer Lust,<br>Jammer nicht lang über Deinen Patzer-Frust!</em><br><br>Voll neuem Selbstvertrauen hüpft es davon um ein ander mal zu freestylen und hinterlässt drei Eier, wo es gesessen hat.",
@@ -636,7 +636,7 @@
"questVelociraptorDropVelociraptorEgg": "Velociraptor (Ei)",
"questVelociraptorUnlockText": "Schaltet den Kauf von Velociraptoreiern auf dem Marktplatz frei",
"mythicalMarvelsText": "Mythische Wunder Quest-Paket",
"mythicalMarvelsNotes": "Beinhaltet \"Überzeuge die Einhornkönigin\", \"Der Feuergreif\" und \"Gefahr in der Tiefe: Seeschlangen-Angriff!\".",
"mythicalMarvelsNotes": "Beinhaltet Quests, um Eier für das Einhorn-Haustier, das Greifen-Haustier und das Seeschlangen-Haustier zu erhalten: Überzeuge die Einhornkönigin Der Feuergreif und Gefahr in der Tiefe: Seeschlangen-Angriff!",
"questBronzeDropBronzePotion": "Bronzenes Schlüpfelixier",
"questDolphinText": "Der Delfin des Zweifels",
"questDolphinBoss": "Delfin des Zweifels",
@@ -659,7 +659,7 @@
"questSilverUnlockText": "Schaltet den Kauf von Silbernen Schlüpfelixieren auf dem Marktplatz frei",
"questRobotCompletion": "Als @Rev und der Rechenschafts-Buddy die letzte Schraube einsetzen, erwacht die Zeitmaschine zum Leben. @FolleMente und @McCoyly springen an Bord. „Danke für die Hilfe! Wir sehen uns in der Zukunft! Übrigens, die hier sollen Dir bei Deiner nächsten Erfindung helfen!\" Damit verschwinden die Zeitreisenden, aber im Wrack des alten Produktivitätsstabilisators verbleiben drei Eier mit Uhrwerken. Vielleicht sind das die entscheidenden Komponenten für eine neue Produktionslinie von Rechenschafts-Buddys!",
"questRobotNotes": "Im Max Kapazitäten-Labor verleiht @Rev der neuesten Erfindung, einem robotischen Rechenschafts-Buddy , den letzten Schliff, als plötzlich ein seltsames Metallfahrzeug in einer Rauchwolke erscheint, nur wenige Zentimeter vom Fluktuationsdetektor des Roboters entfernt! Die Insassen, zwei seltsame, in Silber gekleidete Gestalten, verlassen ihr Gefährt und nehmen ihre Weltraumhelme ab, wobei sie sich als @FolleMente und @McCoyly offenbaren. <br><br>„Ich postuliere, dass unsere Produktivitätsimplementierung eine Anomalie aufwies“, meint @FolleMente verlegen. <br><br>@ McCoyly verschränkt ihre Arme. „Das bedeutet, dass sie es versäumt haben, ihre Tagesaufgaben zu erledigen, was, wie ich postuliere, zur Zersetzung unseres Produktivitätsstabilisators geführt hat. Dabei handelt es sich um eine wesentliche Komponente für Zeitreisen, die zwingend Konsistenz benötigt, um richtig funktionieren zu können. Unsere Leistungen befeuern unsere Bewegung durch Zeit und Raum! Ich habe keine Zeit, um es genauer zu erklären, @Rev. Du wirst es in 37 Jahren entdecken oder vielleicht auch Deine Verbündeten, die Mysteriösen Zeitreisenden. Kannst Du uns vorerst dabei helfen, unsere Zeitmachine zu reparieren?\"",
"rockingReptilesNotes": "Beinhaltet den \"Insta-Gator\", \"Die Schlange der Ablenkung\" und den \"Veloci-Rpper\".",
"rockingReptilesNotes": "Beinhaltet Quests, um Eier für das Alligator-Haustier, das Velociraptor-Haustier und das Schlangen-Haustier zu erhalten: Der Insta-Gator, Der Veloci-Rapper und Die Schlange der Ablenkung.",
"rockingReptilesText": "\"Rockendes Reptilien\"-Quest-Bundle",
"questRobotUnlockText": "Schaltet den Kauf von Robotereiern auf dem Markplatz frei",
"questRobotDropRobotEgg": "Roboter (Ei)",
@@ -667,7 +667,7 @@
"questRobotCollectGears": "Zahnräder",
"questRobotCollectBolts": "Schrauben",
"questRobotText": "Mysteriöse Mechanische Merkwürdigkeiten!",
"delightfulDinosNotes": "Enthält den \"Pterror-dactyl\", \"Trampelnden Triceratops\" und \"Ausgegrabenen Dinosaurier\".",
"delightfulDinosNotes": "Beinhaltet Quests, um Eier für das Triceratops-Haustier, das T-Rex-Haustier und das Pterodactyl-Haustier zu erhalten: Der Trampelnde Triceratops, Der Ausgegrabene Dinosaurier und Der Pterror-Dactyl.",
"delightfulDinosText": "\"Dufte Dinos\" Quest-Paket",
"questAmberCompletion": "\"Trerezin?\" sagt @-Tyr- mit ruhiger Stimme. \"Würdest Du @Vikte loslassen? Ich glaube nicht, dass es ihm so hoch oben wohl ist.\"<br><br>Trerezins Haut wird hochrot und sie setzt @Vikte sanft auf dem Boden ab. \"Bitte entschuldigt! Es ist schon so lange her, dass ich Gäste hatte. Dabei habe ich meine guten Manieren vergessen!\" Sie gleitet vorwärts um euch standesgemäss zu begrüssen, bevor sie in ihrem Baumhaus verschwindet. Gleich darauf kehrt Sie zurück mit einem Arm voll Bernsteinfarbener Schlüpfelixiere als Dankeschön!<br><br>\"Magische Tränke!\" haucht @Vikte.<br><br>\"Ach, diese alten Dinger?\" Trerezins Zunge zittert während sie nachdenkt. \"Wie wär's damit: Ich gebe euch den ganzen Stapel, wenn ihr versprecht, mich ab und zu besuchen zu kommen...\"<br><br>So lasst ihr die Aufgabenwälder hinter euch, um allen über die neuen Schlüpfelixieren zu berichten und natürlich über eure neue Freundin!",
"questAmberNotes": "Du sitzt mit @beffymaroo und @-Tyr- in der Taverne als @Vikte zur Tür hereinplatzt und aufgeregt von Gerüchten über eine neue Art von Magischem Schlüpfelixier erzählt, die in den Aufgabenwälder versteckt seien. Da Deine Tagesaufgaben bereits erledigt sind, beschliesst ihr drei ohne zu zögern, @Vikte bei der Suche zu helfen. Was kann ein kleines Abenteuer schon schaden?<br><br>Nach stundenlangem Marsch durch die Aufgabenwälder fängst Du an, den spontanen Aufbruch zur Jagd zu bereuen. Ihr seid gerade am umkehren als ihr einen überraschten Ausruf hört. Ihr dreht euch um und erblickt eine riesige Echse mit glänzenden, bernsteinfarbenen Schuppen, die sich um einen Baum windet, @Vikte in ihren Krallen haltend. @beffymaroo greift nach ihrem Schwert.<br><br>\"Wartet!\" ruft @-Tyr-. \"Das ist Trerezin! Sie ist nicht gefährlich, nur gefährlich anhänglich!\"",
@@ -693,7 +693,7 @@
"questWaffleText": "An die Waffe(l) gegen den Scherzkeks: Desaster-Frühstück!",
"questWaffleRageEffect": "`Fürchterliche Waffel setzt AHORNSUMPF ein!` Schmieriger saftiger Sirup lässt Deine Schläge und Sprüche stocken! Anstehender Schaden wird reduziert.",
"questWaffleCompletion": "Angeschlagen und reich bebuttert, aber trotzdem triumphierend, genießt Ihr den süßen Sieg über die fürchterliche Waffel, die in eine klebrig-schleimige Pfütze zusammensinkt.<br><br>\"Wow, dieses Monster habt Ihr gründlich eingeschmiert\", sagt Lady Glaciate beeindruckt.<br><br>\"Ein Zuckerschlecken!\" strahlt der April-Scherzkeks.<br><br>\"Trotzdem irgendwie schade,\" findet @beffymaroo. \"Die sah irgendwie lecker aus.\"<br><br>Der Scherzkeks zaubert einen Satz Schlüpfelixier-Flaschen aus seinem Cape, füllt sie mit der sirupartigen Masse der Waffel-Überreste und mischt eine Prise glitzernden Staub hinein. Farben wirbeln durch die Flüssigkeit neue Schlüpfelixiere! Er wirft sie Euch in die Arme. \"Das ganze Abenteuer hat mir Appetit gemacht. Wer kommt mit zum Frühstück?\"",
"jungleBuddiesNotes": "Beinhaltet 'Monströser Mandrill und die Albernen Affen', 'Das verschlafene Faultier' und 'Das Baumgewirr'.",
"jungleBuddiesNotes": "Beinhaltet Quests, um Eier für das Affen-Haustier, das Baumling-Haustier und das Faultier-Haustier zu erhalten: Monströser Mandrill und die Albernen Affen, Das Baumgewirr und Das verschlafene Faultier.",
"jungleBuddiesText": "\"Jungle Freunde\" Quest-Paket",
"questFluoriteUnlockText": "Schaltet den Kauf von Fluorit-Schlüpfelixieren auf dem Marktplatz frei",
"questFluoriteDropFluoritePotion": "Fluorit-Schlüpfelixier",
@@ -715,7 +715,7 @@
"questTurquoiseCollectSagittariusRunes": "Schütze-Runen",
"questTurquoiseCompletion": "Heiß und verschwitzt hält Dein Team endlich inne und macht eine verdiente Pause neben dem umgegrabenen Dreck und einem Haufen Runen und Edelsteine, die ihr gefunden habt.<br><br>“Unglaublich”, murmelt @QuartzFox. “Das wird Geschichte schreiben.”<br><br>“Lasst mich diese Materialien zur Habitica-Universität nehmen um sie zu analysieren”, sagt @gawrone. “Da müsste es viel zu studieren geben und auch einige türkise Elixiere für uns alle abwerfen! Wer weiß was wir hier sonst noch alles begraben finden könnten?”<br><br>@starsystemic stimmt ein: “Einfach bewundernswert, was man mit harter Arbeit erreichen kann!”",
"questTurquoiseNotes": "@gawrone rennt in Dein Zimmer mit ihrem Habiticaner-Diplom in der einen Hand und einem außerordentlich großen und staubigen, ledergebundenen Folianten in der anderen.<br><br>“Du wirst nie erraten, was ich entdeckt habe!”, sagen sie. “Die Blühenden Felder sind so fruchtbar weil sie früher mal von einem riesigen Ozean bedeckt waren. Man munkelt dass ein uraltes Volk den Boden diesen Ozeans in magischen Städten bewohnt hat. Ich habe mithilfe längst vergessen geglaubter Karten herausgefunden, wo das höchstwahrscheinlich war! Hol Deine Schaufel!”<br><br>Schon am nächsten Abend trefft ihr euch mit @QuartzFox und @starsystemic, um eine Party zu gründen und die Grabungen zu starten. Tief im Boden findet Ihr eine Rune neben einem Türkis!<br><br>“Grabt weiter!”, drängt @gawrone. “Wenn wir genug finden, können wir eines ihrer uralten Elixiere nachbrauen und somit Geschichte schreiben!”",
"sandySidekicksNotes": "Beinhaltet 'Das gutmütige Gürteltier', 'Die Schlange der Ablenkung' und 'Die eisige Arachnoide'.",
"sandySidekicksNotes": "Beinhaltet Quests, um Eier für das Spinnen-Haustier, das Gürteltier-Haustier und das Schlangen-Haustier zu erhalten: Die eisige Arachnoide, Das gutmütige Gürteltier und Die Schlange der Ablenkung.",
"sandySidekicksText": "\"Sandige Seelenverwandte\" Quest-Paket",
"questBlackPearlText": "Sternstunde - Ein Fall von Einfall",
"questBlackPearlNotes": "In letzter Zeit hast Du einfach keinen Schwung. Du vermisst deine Kreativität. Als @jjgame83 also vorschlägt zusammen zum Lively Lake zu gehen, ergreifst du die Chance für einen Tapetenwechsel. Während @QuarzFox das Picknick am Seeufer vorbereitet, siehst du etwas im flachen Wasser glitzern. Eine seltsame, schwarze Perle. <br><br>\"Ich wünschte, mir würde was neues einfallen\", seufzt Du.<br><br>Eine kalte Brise, scheinbar aus dem Nirgendwo, scheint deine Worte am Ufer entlang zu tragen und das Wasser kräuselt sich leicht. Der See wird schwarz wie Tinte, Sterne leuchten am Firmament auf und innerhalb eines Herzschlages wird der Tag zu tiefster Nacht.<br><br>\"Das sind keine guten Vorboten\", sagt @PixelStormArt.<br><br>Die Luft.. schmeckt nach Salz? Plötzlich bricht eine gigantische Masse an Fangarmen in einem Sprühregen aus Meeresschaum aus dem See hervor. Du kannst gerade eine Art Schnabel in der Mitte ausmachen, als dieser sich öffnet und dröhnend erschallt: \"HÜTET EUCH VOR ASTEROIDEE, DER EINFALL VON JENSEITS DER STERNE!\"<br><br>Ein Tentakel donnert nieder auf den Korb mit dem Picknick. Gute Idee oder nicht, jetzt ist Handeln gefragt.",
@@ -783,5 +783,9 @@
"questCrabText": "Die fummelnde Krabbe",
"questCrabBoss": "Fummelnde Krabbe",
"questGiraffeNotes": "Du schlenderst durch das hohe Gras der Sloenstedi Savanne und genießt einen netten Spaziergang in der Natur als Auszeit von deinen Aufgaben. Als du die hügelige Landschaft durchstreifst, fällt dir eine Ansammlung von Gegenständen in der Ferne auf. Es ist ein Stapel aus Musikinstrumenten, Kunstzubehör, elektronischer Ausrüstung und mehr! Du wagst dich näher für einen besseren Blick.<br><br>“Hey, was glaubst du, was du da machst?“ ruft eine Stimme hinter einer Akazie hervor. Eine große und imposante Giraffe, die eine modische Sonnenbrille, eine Gitarre und eine ausgefallene Kamera um ihren langen Hals trägt, taucht auf. „Das ist alles meine Ausrüstung, sei vorsichtig und berühre nichts!“<br><br>Du bemerkst Staub auf vielen der Gegenstände. „Wow, du hast echt eine Menge Hobbies!“ sagst du. „Kannst du mir einige Kunstwerke zeigen oder ein Lied auf der Gitarre spielen?“<br><br>Die Giraffe zieht die Mundwinkel herunter, als sie all ihr Zubehör anschaut. „Ich habe so viel von diesem Zeug, aber ich weiß nicht, wo ich anfangen soll! Warum gibst du mir nicht ein bisschen von deiner Motivation, um mir die produktive Energie zu verleihen, die ich brauche, um endlich starten zu können!“",
"questChameleonNotes": "Es ist ein schöner Tag in einer warmen, regnerischen Ecke der Aufgabenwälder. Du bist auf der Jagd nach Neuzugängen für deine Blattsammlung, als ein Ast vor dir ohne Vorwarnung seine Farbe ändert! Und dann bewegt er sich!<br><br>Rückwärts stolpernd realisierst du, dass dies überhaupt kein Ast ist, sondern ein großes Chamäleon! Jeder Teil seines Körpers wechselt andauernd seine Farbe, während seine Augen in unterschiedliche Richtungen zucken.<br><br>“Geht es dir gut?“ fragst du das Chamäleon.<br><br>“Ahhh, na ja,“ sagt es und wirkt ein wenig durcheinander. „Ich habe versucht, mich anzupassen… aber es ist so überwältigend… die Farben kommen und gehen ständig! Es ist schwer, sich auf nur eine zu konzentrieren….“<br><br>“Aha,“ sagst du, „Ich glaube, ich kann helfen. Wir schärfen deine Konzentration mit einer kleinen Herausforderung! Halte deine Farben bereit!“<br><br>“Die Wette gilt!“ erwidert das Chamäleon."
"questChameleonNotes": "Es ist ein schöner Tag in einer warmen, regnerischen Ecke der Aufgabenwälder. Du bist auf der Jagd nach Neuzugängen für deine Blattsammlung, als ein Ast vor dir ohne Vorwarnung seine Farbe ändert! Und dann bewegt er sich!<br><br>Rückwärts stolpernd realisierst du, dass dies überhaupt kein Ast ist, sondern ein großes Chamäleon! Jeder Teil seines Körpers wechselt andauernd seine Farbe, während seine Augen in unterschiedliche Richtungen zucken.<br><br>“Geht es dir gut?“ fragst du das Chamäleon.<br><br>“Ahhh, na ja,“ sagt es und wirkt ein wenig durcheinander. „Ich habe versucht, mich anzupassen… aber es ist so überwältigend… die Farben kommen und gehen ständig! Es ist schwer, sich auf nur eine zu konzentrieren….“<br><br>“Aha,“ sagst du, „Ich glaube, ich kann helfen. Wir schärfen deine Konzentration mit einer kleinen Herausforderung! Halte deine Farben bereit!“<br><br>“Die Wette gilt!“ erwidert das Chamäleon.",
"questGiraffeBoss": "Gear-affe",
"questGiraffeCompletion": "Nachdem du der Gear-affe mit ein bisschen grundlegender Organisation ihres Stapels geholfen hast, fühlt ihr euch beide energiegeladener und motivierter!<br><br>Sie nimmt ihre Gitarre und ein Heft mit Anfängerübungen und spielt ein paar Noten. \"Es fühlt sich gut an, einen Schritt in die richtige Richtung zu machen, selbst wenn es nur ein kleiner ist. Vielen Dank, dass du mir geholfen hast! Nimm diese hier, ich habe gehört, du hast einige Haustiere und diese Kameraden könnten eine nette Ergänzung sein!\"",
"questCrabDropCrabEgg": "Kabbe (Ei)",
"questCrabUnlockText": "Schaltet Krabbeneier zum Kauf auf dem Marktplatz frei."
}
+9 -1
View File
@@ -995,10 +995,18 @@
"backgroundMagicDoorInForestText": "Magic Door in the Forest",
"backgroundMagicDoorInForestNotes": "Dare to step through the Magic Door in the Forest.",
"backgrounds102024": "SET 124: Released September 2024",
"backgrounds102024": "SET 125: Released October 2024",
"backgroundSurroundedByGhostsText": "Surrounded by Ghosts",
"backgroundSurroundedByGhostsNotes": "Spend a spooky evening Surrounded by Ghosts.",
"backgrounds112024": "SET 126: Released November 2024",
"backgroundCastleHallWithHearthText": "Castle Hall with Hearth",
"backgroundCastleHallWithHearthNotes": "Bask in the warmth of a Castle Hall with a Hearth.",
"backgrounds122024": "SET 127: Released December 2024",
"backgroundFirstSnowForestText": "First Snow in the Forest",
"backgroundFirstSnowForestNotes": "Step into the First Snow in the Forest.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
+2 -1
View File
@@ -269,7 +269,7 @@
"questEggDogText": "Puppy",
"questEggDogMountText": "Dog",
"questEggDogAdjective": "a friendy",
"questEggDogAdjective": "a friendly",
"eggNotes": "Find a hatching potion to pour on this egg, and it will hatch into <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
@@ -335,6 +335,7 @@
"hatchingPotionRoseGold": "Rose Gold",
"hatchingPotionFungi": "Fungi",
"hatchingPotionKoi": "Koi",
"hatchingPotionGingerbread": "Gingerbread",
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> Pet.",
"premiumPotionUnlimitedNotes": "Not usable on Quest Pet eggs.",
+64 -3
View File
@@ -51,7 +51,7 @@
"webFaqAnswer40": "Gems are Habiticas in-app paid currency used to purchase Equipment, Avatar Customizations, Backgrounds, and more! Gems can be purchased in bundles or with Gold if youre a Habitica subscriber. You can also win Gems by being selected as the winner of a Challenge.",
"faqQuestion41": "What are Mystic Hourglasses, and how do I get them?",
"webFaqAnswer41": "Mystic Hourglasses are Habiticas exclusive Subscriber currency used in the Time Travelers Shop! Hourglasses are delivered on a set schedule based on your subscription plan.\n\nHourglass delivery schedule:\n * 1-Month subscribers get 1 Hourglass at the start of the month after the 3rd consecutive payment.\n * 3-Month subscribers get 1 Hourglass immediately after subscribing, then 1 more Hourglass at the start of the month after each renewal.\n * 6-Month subscribers get 2 Hourglasses immediately after subscribing, then 2 more Hourglasses at the start of the month after each renewal.\n * 12-Month subscribers get 4 Hourglasses immediately after subscribing, then 4 more Hourglasses at the start of the month after each renewal.",
"webFaqAnswer41": "Mystic Hourglasses are Habiticas exclusive Subscriber currency used in the Time Travelers Shop. Subscribers receive a Mystic Hourglass at the start of each month they have subscription benefits, along with a bunch of other perks. Be sure to check out our subscription options if youre interested in the special Backgrounds, Pets, Quests, and Equipment offered in the Time Travelers Shop!",
"faqQuestion42": "What can I do to increase accountability?",
"webFaqAnswer42": "One of the best ways to motivate yourself and hold yourself accountable for accomplishing your tasks is to join a Party! Partying with other Habitica players is a great way to take on Quests to receive Pets and Equipment, receive buffs from Party members Skills, and boost your motivation.\n\nAnother way to increase accountability is to join a Challenge. Challenges automatically add tasks related to a specific goal to your lists! They also add an element of competition against other Habitica players that may give you a motivation boost as you strive for the Gem prize. There are official Challenges created by the Habitica Team as well Challenges made by other players.",
@@ -198,7 +198,6 @@
"contactAdmin": "Contact <a href='mailto:admin@habitica.com'>admin@habitica.com</a>",
"contentReleaseChanges": "Content Release Changes",
"contentFaqTitle": "Habitica Content Release Change FAQ",
"contentFaqPara0": "Habitica has so much fun and engaging content to offer, and we want everyone to be able to enjoy it all! Changes are coming to make it easier for new players to get started on their collection as well as for veteran players to complete theirs!",
@@ -258,5 +257,67 @@
"contentAnswer70": "Backgrounds, Quests, Pets, and Mounts available in the Time Travelers Shop will remain available all year round.",
"contentAnswer71": "Stay tuned for further updates on planned improvements to the Time Travelers Shop experience.",
"contentFaqPara3": "If you have any questions not covered by the answers above, you can always contact our team at <%= mailto %>! Were excited for this new content release schedule and looking forward to even more projects in the future to help make Habitica better for all players."
"contentFaqPara3": "If you have any questions not covered by the answers above, you can always contact our team at <%= mailto %>! Were excited for this new content release schedule and looking forward to even more projects in the future to help make Habitica better for all players.",
"subscriptionBenefitsAdjustments": "Subscriber Benefit Adjustments",
"subscriptionBenefitsFaqTitle": "Subscriber Benefit Adjustments FAQ",
"subscriptionPara0": "Were making Habitica subscriptions better than ever with even more Mystic Hourglasses and Gems! These changes make it much easier to understand your subscription benefits.",
"subscriptionHeading0": "Changes to Mystic Hourglasses",
"subscriptionDetail00": "All subscribers, including those with gifted subscriptions, will receive 1 Mystic Hourglass at the start of each month they have subscriber benefits.",
"subscriptionDetail000": "Being subscribed for 12 months will earn you 12 Mystic Hourglasses instead of the previous 4.",
"subscriptionDetail001": "All subscribers will receive Mystic Hourglasses on the same schedule, matching the release schedule of the monthly Mystery Gear Sets.",
"subscriptionDetail002": "Subscribers will no longer need to wait until the month following their recurring payment to receive any Mystic Hourglasses.",
"subscriptionDetail003": "All new subscribers will receive 1 Mystic Hourglass immediately after purchase. This will count as the current months Mystic Hourglass delivery.",
"subscriptionDetail01": "New 12 month recurring subscriptions will get an initial one-time bonus of an extra 12 Mystic Hourglasses upon purchase.",
"subscriptionDetail010": "This will be in addition to the one monthly Mystic Hourglass all new subscribers receive after initial purchase.",
"subscriptionDetail011": "Current players with an active 12 month recurring subscription will receive this bonus on the day these changes go into effect.",
"subscriptionDetail012": "This bonus does not apply to gifted subscriptions.",
"subscriptionHeading1": "Changes to Subscriber Gems",
"subscriptionDetail10": "The amount of Gems subscribers can purchase with Gold in the Market will increase by 2 each month they have benefits until reaching a max of 50.",
"subscriptionDetail100": "New 1, 3, and 6 month subscriptions will now start at 24 Gems per month and that value will increase each month they have benefits.",
"subscriptionDetail101": "Any subscribers that currently have an odd number of Gems per month will have their Gem cap rounded up to the nearest even number.",
"subscriptionDetail102": "New 12 month subscriptions will immediately start at the max amount of Gems per month immediately, 50 Gems instead of the previous 45.",
"subscriptionDetail11": "The amount of Gems you can purchase each month for Gold will no longer be reset if your subscription lapses.",
"subscriptionDetail110": "If you raise the amount of Gems you can buy each month then cancel your subscription, you can pick back up at the same amount any time in the future, even if you purchase a lower subscription tier.",
"subscriptionHeading2": "Why are we making these changes?",
"subscriptionDetail20": "Under the current structure, it can be difficult to understand how many Mystic Hourglasses you would receive and when.",
"subscriptionDetail21": "The four subscription tiers were known to cause complications when upgrading or downgrading to different tiers.",
"subscriptionDetail22": "Gifted and recurring subscriptions had conflicting benefit experiences and rules that we wanted to simplify.",
"subscriptionDetail23": "Giving one Mystic Hourglass per month allows subscribers to enjoy the rotating items in the Time Travelers Shop.",
"subscriptionDetail24": "We wanted subscribers to have more than four chances per year to collect items from the Time Travelers Shop.",
"subscriptionDetail25": "We understand that finances change and we didnt want to punish subscribers for lapsed subscriptions by taking away benefits they had earned.",
"subscriptionHeading3": "Release day rewards",
"subscriptionPara1": "To help ease the transition to the new schedule, existing subscribers can expect some extra goodies on release day. We want to sincerely thank you for your continued support through this change!",
"subscriptionDetail30": "Players with recurring 1 month subscriptions or Group Plan subscriptions will receive 2 Mystic Hourglasses and 20 Gems.",
"subscriptionDetail31": "Players with recurring 3 or 6 month subscriptions will receive 4 Mystic Hourglasses and 20 Gems.",
"subscriptionDetail32": "Players with recurring 12 month subscriptions will receive the 12 Mystic Hourglass bonus noted above and 20 Gems.",
"subscriptionDetail33": "To receive these rewards, your account must have an active recurring subscription before November 19.",
"subscriptionDetail40": "Im a subscriber, when will I get my first regular Mystic Hourglass and Gem cap increase from the new schedule?",
"subscriptionDetail400": "For current subscribers, youll get your first Mystic Hourglass and +2 Gems added to your monthly cap on your first login of the month after release. This means if you happen to have logged in already in November, your first regular increase will happen in December.",
"subscriptionDetail41": "Will the price of subscriptions change when this is released?",
"subscriptionDetail410": "These changes will not affect the current price of subscriptions.",
"subscriptionDetail42": "If I dont log in for a month while subscribed, will I miss out on those benefits?",
"subscriptionDetail420": "Just like Mystery Gear Sets, you will not miss out on any Mystic Hourglasses or Gem cap increases if you dont log in while subscribed. The next time you log in, you will receive all benefits owed for each month you were subscribed.",
"subscriptionDetail43": "If I sign up for a recurring subscription then cancel, will I still get benefits?",
"subscriptionDetail430": "Canceling a recurring subscription will set a termination date for your benefits, but you will still have full access to all perks of a subscription before that date. That means you will still receive monthly Mystic Hourglasses and Gem cap increases at the start of each month you have access to those benefits.",
"subscriptionDetail44": "Im a current subscriber, how many Gems will I have available in the Market each month after the change?",
"subscriptionDetail440": "On the day these changes go into effect, current subscribers with an odd number of Gems per month will see these adjustments to their Gem cap:",
"subscriptionDetail4400": "If you currently have unlocked <%= initialNumber %> Gems per month, you will be set to <%= roundedNumber %>.",
"subscriptionDetail45": "Will purchasing extra gifted subscriptions get me more Mystic Hourglasses or a higher Gem cap faster?",
"subscriptionDetail450": "Since Mystic Hourglasses and raising the Gem cap is now a monthly benefit, purchasing multiple gifted subscriptions will not give more benefits at once.",
"subscriptionDetail451": "Each gifted subscription will add to the amount of months a player has subscription benefits, allowing them to continue receiving more Mystic Hourglasses and increases to their Gem cap each passing month.",
"subscriptionDetail46": "If I had a subscription in the past, can I unlock my old Gem cap if I resubscribe now?",
"subscriptionDetail460": "Since we used to reset the amount of Gems you could buy each month when your benefits ran out, players with lapsed subscription benefits will have to start fresh under this new system.",
"subscriptionDetail47": "I have a Group Plan subscription, how does this affect me?",
"subscriptionDetail470": "Group Plan subscribers benefits will behave the same as those for a 1 month recurring subscription. Youll receive a Mystic Hourglass at the start of each month and the amount of Gems you can purchase each month in the Market will increase by 2 until reaching 50.",
"subscriptionDetail48": "Are there any changes to other subscription benefits, like Mystery Gear Sets?",
"subscriptionDetail480": "These changes only affect Mystic Hourglasses and subscriber Gems. All other benefits will remain the same.",
"subscriptionPara2": "If you have any questions not covered by the answers above, you can always contact our team at <%= mailto %>.",
"subscriptionPara3": "We hope this new schedule will be more predictable, allow more access to the amazing stock of items in the Time Travelers Shop, and give even more motivation to make progress on your tasks each month!"
}
+51
View File
@@ -533,6 +533,15 @@
"weaponSpecialFall2024MageText": "Staff of the Underworld",
"weaponSpecialFall2024MageNotes": "Task steps will instantly become simplified with one touch of this shining weapon. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Fall 2024 Gear.",
"weaponSpecialWinter2025WarriorText": "Moose Warrior Axe",
"weaponSpecialWinter2025WarriorNotes": "A mighty axe for a mighty moose! Youll be unstoppable! Increases Strength by <%= str %>. Limited Edition Winter 2024-2025 Gear.",
"weaponSpecialWinter2025RogueText": "Snowflake Burst",
"weaponSpecialWinter2025RogueNotes": "Thump and dazzle those difficult tasks into submission! Youll be unstoppable! Increases Strength by <%= str %>. Limited Edition Winter 2024-2025 Gear.",
"weaponSpecialWinter2025HealerText": "Star Wand",
"weaponSpecialWinter2025HealerNotes": "What you need now are more lights and a glowing star to go on top! You'll be unstoppable! Increases Intelligence by <%= int %>. Limited Edition Winter 2024-2025 Gear.",
"weaponSpecialWinter2025MageText": "Northern Lights Display",
"weaponSpecialWinter2025MageNotes": "This stunning, colorful show provides the perfect backdrop! Youll be unstoppable! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
"weaponMystery201411Text": "Pitchfork of Feasting",
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
@@ -789,6 +798,8 @@
"weaponArmoireFunnyFoolBatonNotes": "With a wave of your baton you can deliver a punchline, redirect attention, or summon applause. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Funny Fool Set (Item 3 of 3)",
"weaponArmoireSpookyCandyBucketText": "Spooky Candy Bucket",
"weaponArmoireSpookyCandyBucketNotes": "With an epic costume like that, youre going to get so much candy! Good thing youve got this bottomless bucket to hold it all. Try not to snack on any until you get home. Increases Intelligence by <%= int %>. Enchanted Armoire: Fright Night Set (Item 2 of 2)",
"weaponArmoireStormKnightAxeText": "Storm Knight Axe",
"weaponArmoireStormKnightAxeNotes": "Gather your fury and strike a blow like thunder! Increases Strength by <%= str %>. Enchanted Armoire: Storm Knight Set (Item 3 of 3)",
"armor": "armor",
"armorCapitalized": "Armor",
@@ -1302,6 +1313,16 @@
"armorSpecialFall2024MageText": "Underworld Sorceror Armor",
"armorSpecialFall2024MageNotes": "Be one with the underworld and embrace the power of mages whove come before you in this armor. Increases Intelligence by <%= int %>. Limited Edition Fall 2024 Gear.",
"armorSpecialWinter2025WarriorText": "Moose Warrior Armor",
"armorSpecialWinter2025WarriorNotes": "Everyones going to step aside and make way for you when you wear this armor. Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
"armorSpecialWinter2025RogueText": "Snow Costume",
"armorSpecialWinter2025RogueNotes": "Although you look like youre covered in cold snow, you are toasty, warm, jolly, and happy when you wear this costume. Increases Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
"armorSpecialWinter2025HealerText": "Robe of String Lights",
"armorSpecialWinter2025HealerNotes": "Twinkle your way through your tasks. Just be careful—if one bulb goes out, they all go out. Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
"armorSpecialWinter2025MageText": "Aurora Cloak",
"armorSpecialWinter2025MageNotes": "Wonder, whimsy, enchantment, and splendor will fill your days when you dance in this cloak. Increases Intelligence by <%= int %>. Limited Edition Winter 2024-2025 Gear.",
"armorMystery201402Text": "Messenger Robes",
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
"armorMystery201403Text": "Forest Walker Armor",
@@ -1430,6 +1451,8 @@
"armorMystery202406Notes": "Haunt your enemies with style and flair! Confers no benefit. June 2024 Subscriber Item.",
"armorMystery202407Text": "Amiable Axolotl Suit",
"armorMystery202407Notes": "Glide through lakes and canals with your sweeping pink tail! Confers no benefit. July 2024 Subscriber Item.",
"armorMystery202412Text": "Candy Cane Cottontail Coat",
"armorMystery202412Notes": "A fun and fluffy look to keep you snug on a winter day. Confers no benefit. December 2024 Subscriber Item.",
"armorMystery301404Text": "Steampunk Suit",
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
@@ -1652,6 +1675,10 @@
"armorArmoireDragonKnightsArmorNotes": "Channel the strength and power of a dragon with this armor made of silver and shed scales. Increases Strength by <%= str %>. Enchanted Armoire: Dragon Knight Set (Item 2 of 3)",
"armorArmoireFunnyFoolCostumeText": "Funny Fool Costume",
"armorArmoireFunnyFoolCostumeNotes": "Dum-de-dum! Surely you jest. This colorful outfit looks amazing on you! Increases Strength by <%= str %>. Enchanted Armoire: Funny Fool Set (Item 2 of 3)",
"armorArmoireStormKnightArmorText": "Storm Knight Armor",
"armorArmoireStormKnightArmorNotes": "In this armor, you are nearly invincible. Your enemies will never see the storms end. Increases Perception by <%= per %>. Enchanted Armoire: Storm Knight Set (Item 2 of 3)",
"armorArmoireFestiveHelperOverallsText": "Festive Helper Overalls",
"armorArmoireFestiveHelperOverallsNotes": "Durable and comfortable, these overalls are great for working, playing, and assisting others. Plus, it has pockets! Increases Constitution by <%= con %>. Enchanted Armoire: Festive Helper Set (Item 2 of 2)",
"headgear": "helm",
"headgearCapitalized": "Headgear",
@@ -2159,6 +2186,15 @@
"headSpecialFall2024MageText": "Underworld Sorcerer Mask",
"headSpecialFall2024MageNotes": "Whether youre mysterious or whimsical, you wont be missed when you wear this! Increases Perception by <%= per %>. Limited Edition Fall 2024 Gear.",
"headSpecialWinter2025WarriorText": "Moose Warrior Helmet",
"headSpecialWinter2025WarriorNotes": "So, get this: now you look just like a moose. Wear those antlers with pride. Increases Strength by <%= str %>. Limited Edition Winter 2024-2025 Gear.",
"headSpecialWinter2025RogueText": "Snow Mask",
"headSpecialWinter2025RogueNotes": "There is definitely some magic in this hat, because it transforms you into a snow person. Just dont let the bunny get too close to your carrot nose. Increases Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
"headSpecialWinter2025HealerText": "Tangle of String Lights",
"headSpecialWinter2025HealerNotes": "Dont bother untangling these because they are already in the shape of a hat. Increases Intelligence by <%= int %>. Limited Edition Winter 2024-2025 Gear.",
"headSpecialWinter2025MageText": "Aurora Hat",
"headSpecialWinter2025MageNotes": "More than just a fancy fascinator, this hat makes you look like the aurora borealis itself. Increases Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
"headSpecialGaymerxText": "Rainbow Warrior Helm",
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
@@ -2328,6 +2364,10 @@
"headMystery202407Notes": "These magical gills will let you breathe underwater! Confers no benefit. July 2024 Subscriber Item.",
"headMystery202409Text": "Heliotrope Magus Hat",
"headMystery202409Notes": "More than just jaunty decorations, the enchanted sunflowers on this hat fill the wearer with powerful magic energy. Confers no benefit. September 2024 Subscriber Item.",
"headMystery202411Text": "Bristled Helm",
"headMystery202411Notes": "This helm is quite intimidating to your tasks when you dive in headfirst! Confers no benefit. November 2024 Subscriber Item.",
"headMystery202412Text": "Candy Cane Cottontail Hood",
"headMystery202412Notes": "Warm and cozy, just like a cup of minty hot cocoa on a winter night! Confers no benefit. December 2024 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
@@ -2530,6 +2570,10 @@
"headArmoireDragonKnightsHelmNotes": "With the fiery features on this helmet, dragons might mistake you for one of their own. Increases Intelligence by <%= int %>. Enchanted Armoire: Dragon Knight Set (Item 1 of 3)",
"headArmoireFunnyFoolCapText": "Funny Fool Cap",
"headArmoireFunnyFoolCapNotes": "The bells on this hat might make your opponents burst into giggles, but they just help you concentrate. Increases Constitution by <%= con %>. Enchanted Armoire: Funny Fool Set (Item 1 of 3)",
"headArmoireStormKnightHelmText": "Storm Knight Helm",
"headArmoireStormKnightHelmNotes": "Harness lightning through these antlers as you storm the castle. Increases Constitution by <%= con %>. Enchanted Armoire: Storm Knight Set (Item 1 of 3)",
"headArmoireFestiveHelperHatText": "Festive Helper Hat",
"headArmoireFestiveHelperHatNotes": "Holiday tip #27: have a helper hat handy. This one is big enough to keep an emergency toy underneath! Increases Intelligence by <%= int %>. Enchanted Armoire: Festive Helper Set (Item 1 of 2)",
"offhand": "off-hand item",
"offHandCapitalized": "Off-Hand Item",
@@ -2818,6 +2862,11 @@
"shieldSpecialFall2024HealerText": "Space Shield",
"shieldSpecialFall2024HealerNotes": "New tasks wanting your attention bounce right off until youve completed your current mission. Increases Constitution by <%= con %>. Limited Edition Fall 2024 Gear.",
"shieldSpecialWinter2025WarriorText": "Moose Warrior Shield",
"shieldSpecialWinter2025WarriorNotes": "Block out any unwanted distractions with this shield as strong as a moose. Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
"shieldSpecialWinter2025HealerText": "The Perfect Gift",
"shieldSpecialWinter2025HealerNotes": "The perfect gift is just waiting to be opened. What could be inside? Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
"shieldMystery201601Text": "Resolution Slayer",
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
"shieldMystery201701Text": "Time-Freezer Shield",
@@ -3177,6 +3226,8 @@
"bodyMystery202008Notes": "For now, your wings lie furled. But when you have concluded dispensing your wisdom, or you sight your prey in the grass, watch out! Confers no benefit. August 2020 Subscriber Item.",
"bodyMystery202107Text": "Far-Out Floaty Flamingo",
"bodyMystery202107Notes": "This trusty companion will never let you down and will always keep your spirits buoyant! Confers no benefit. July 2021 Subscriber Item.",
"bodyMystery202411Text": "Bristled Pauldrons",
"bodyMystery202411Notes": "The formidable spikes on these pauldrons are perfect for charging ahead with your to-do list. Confers no benefit. November 2024 Subscriber Item.",
"bodyArmoireCozyScarfText": "Cozy Scarf",
"bodyArmoireCozyScarfNotes": "This fine scarf will keep you warm as you go about your wintry business. Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Lamplighter's Set (Item 4 of 4).",
+4
View File
@@ -223,6 +223,10 @@
"fall2024UnderworldSorcerorMageSet": "Underworld Sorceror Set (Mage)",
"fall2024SpaceInvaderHealerSet": "Space Invader Set (Healer)",
"fall2024BlackCatRogueSet": "Black Cat Set (Rogue)",
"winter2025MooseWarriorSet": "Moose Warrior Set",
"winter2025AuroraMageSet": "Aurora Mage Set",
"winter2025StringLightsHealerSet": "String Lights Healer Set",
"winter2025SnowRogueSet": "Snow Rogue Set",
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION, GET ONE FREE!",
"winterPromoGiftDetails1": "Until January 6th only, when you gift somebody a subscription, you get the same subscription for yourself for free!",
"winterPromoGiftDetails2": "Please note that if you or your gift recipient already have a recurring subscription, the gifted subscription will only start after that subscription is cancelled or has expired. Thanks so much for your support! <3",
+1 -1
View File
@@ -98,7 +98,7 @@
"paymentYouSentSubscription": "You sent <strong><%- name %></strong><br> a <%= months %> month(s) Habitica subscription.",
"paymentSubBilling": "Your subscription will be billed <strong>$<%= amount %></strong> every <strong><%= months %> months</strong>.",
"groupsPaymentSubBilling": "Your next billing date is <strong><%= renewalDate %></strong>.",
"paymentSubBillingWithMethod": "Your subscription will be billed <strong>$<%= amount %></strong> every <strong><%= months %> months</strong> via <strong><%= paymentMethod %></strong>.",
"paymentSubBillingWithMethod": "Your subscription will be billed<br><strong>$<%= amount %>.00 USD</strong> every <strong><%= months %> months</strong> via <strong><%= paymentMethod %></strong>",
"paymentAutoRenew": "This subscription will auto-renew until it is canceled. If you need to cancel this subscription, you can do so from your settings.",
"groupsPaymentAutoRenew": "This subscription will auto-renew until it is canceled. If you need to cancel, you can do so from the Group Billing tab.",
"paymentCanceledDisputes": "Weve sent a cancelation confirmation to your email. If you dont see the email, please contact us to prevent future billing disputes.",
+3 -2
View File
@@ -186,8 +186,8 @@
"gemCapExtra": "Gem Cap Bonus",
"mysticHourglasses": "Mystic Hourglasses:",
"mysticHourglassesTooltip": "Mystic Hourglasses",
"nextHourglass": "Next Hourglass",
"nextHourglassDescription": "Subscribers receive Mystic Hourglasses within\nthe first three days of the month.",
"nextHourglass": "Next Mystic Hourglass Delivery",
"nextHourglassDescription": "Subscribers receive a Mystic Hourglass, a Mystery Gear Set, and Gems restocked in the Market within the first two days of the month",
"paypal": "PayPal",
"amazonPayments": "Amazon Payments",
"amazonPaymentsRecurring": "Ticking the checkbox below is necessary for your subscription to be created. It allows your Amazon account to be used for ongoing payments for <strong>this</strong> subscription. It will not cause your Amazon account to be automatically used for any future purchases.",
@@ -253,6 +253,7 @@
"transaction_release_mounts": "Released mounts",
"transaction_reroll": "Used Fortify Potion",
"transaction_subscription_perks": "<b>Subscription</b> perk",
"transaction_subscription_bonus": "<b>Subscription</b> bonus",
"transaction_admin_update_balance": "<b>Admin</b> given",
"transaction_admin_update_hourglasses": "<b>Admin</b> updated",
"connected": "Connected",
+37 -14
View File
@@ -7,12 +7,12 @@
"howManyGemsSend":"How many Gems would you like to send?",
"needToPurchaseGems": "Need to purchase Gems as a gift?",
"wantToSendOwnGems": "Want to send your own Gems?",
"buyGemsGold": "Buy Gems with Gold",
"buyGemsGold": "Free Monthly Gems",
"mustSubscribeToPurchaseGems": "Must subscribe to purchase gems with GP",
"reachedGoldToGemCapQuantity": "Your requested amount <%= quantity %> exceeds the amount you can buy for this month (<%= convCap %>). The full amount becomes available within the first three days of each month. Thanks for subscribing!",
"mysteryItem": "Exclusive monthly items",
"mysteryItemText": "Each month you will receive a unique cosmetic item for your avatar! Plus, for every three months of consecutive subscription, the Mysterious Time Travelers will grant you access to historic (and futuristic!) cosmetic items.",
"exclusiveJackalopePet": "Exclusive pet",
"exclusiveJackalopePet": "Special Pet",
"giftSubscription": "Want to gift the benefits of a subscription to someone else?",
"giftASubscription": "Gift a Subscription",
"giftSubscriptionText4": "Thanks for supporting Habitica!",
@@ -20,7 +20,7 @@
"groupPlans": "Group Plans",
"nowSubscribed": "You are now subscribed to Habitica!",
"cancelSub": "Cancel Subscription",
"cancelSubInfoGoogle": "Please go to the \"Account\" > \"Subscriptions\" section of the Google Play Store app to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
"cancelSubInfoGoogle": "To cancel your subscription or to view your subscription's termination date, please use the <a href='https://play.google.com/store/account/subscriptions'>Google Play Store</a>. Any leftover months of subscription credit will be added to your end date after cancellation.",
"cancelSubInfoApple": "Please follow <a href=\"https://support.apple.com/en-us/HT202039\">Apple's official instructions</a> to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
"cancelSubInfoGroupPlan": "Because you have a free subscription from a Group Plan, you cannot cancel it. It will end when you are no longer a member of the Group Plan. If you are the Group leader and want to cancel the Group Plan, you can do that from the Group Plans “Group Billing” tab.",
"cancelingSubscription": "Canceling the subscription",
@@ -167,12 +167,14 @@
"mysterySet202408": "Arcane Aegis Set",
"mysterySet202409": "Heliotrope Magus Set",
"mysterySet202410": "Candy Corn Fox Set",
"mysterySet202411": "Bristled Brawler Set",
"mysterySet202412": "Candy Cane Cottontail Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",
"mysterySet301704": "Pheasant Steampunk Set",
"mysterySetwondercon": "Wondercon",
"subUpdateCard": "Update Credit Card",
"subUpdateCard": "Edit Credit Card",
"subUpdateTitle": "Update",
"notEnoughHourglasses": "You don't have enough Mystic Hourglasses.",
"backgroundAlreadyOwned": "Background already owned.",
@@ -199,22 +201,24 @@
"choosePaymentMethod": "Choose your payment method",
"support": "Support",
"supportHabitica": "Support Habitica",
"subscribeTo": "Subscribe To",
"gemBenefitLeadin": "What can you buy with Gems?",
"gemBenefit1": "Unique and fashionable costumes for your avatar.",
"gemBenefit2": "Backgrounds to immerse your avatar in the world of Habitica!",
"gemBenefit3": "Exciting Quest chains that drop pet eggs.",
"gemBenefit4": "Reset your avatar's Stat Points and change its Class.",
"usuallyGems": "Usually <%= originalGems %>",
"subscriptionBenefit1": "Alexander the Merchant will now sell you Gems from the Market for 20 Gold each!",
"subscriptionBenefit3": "Discover even more items in Habitica with a 2x daily drop-cap.",
"subscriptionBenefit4": "Unique cosmetic item for you to decorate your avatar each month.",
"subscriptionBenefit5": "Receive the Royal Purple Jackalope pet when you become a new subscriber.",
"subscriptionBenefit6": "Earn Mystic Hourglasses to purchase items in the Time Travelers Shop!",
"subscriptionBenefit1": "Get up to 50 Gold-purchasable Gems in the Market to buy Quests, Customizations, Pets, and more!",
"subscriptionBenefit3": "Find double the Eggs, Hatching Potions, and Food each day to grow your Pet collection!",
"subscriptionBenefit4": "Stay decked out in the latest exclusive gear. Subscribe now to get <%= month %>s <%= currentMysterySetName %>!",
"subscriptionBenefit5": "Get the exclusive Royal Purple Jackalope when you subscribe today!",
"subscriptionBenefit6": "Never miss an item with 1 Mystic Hourglass a month to use in the Time Travelers Shop!",
"purchaseAll": "Purchase Set",
"gemsRemaining": "remaining",
"notEnoughGemsToBuy": "No more Gems available for purchase this month. More will become available within the first 3 days of each month.",
"subscribersReceiveBenefits": "Subscribers receive these useful benefits!",
"monthlyMysteryItems": "Monthly Mystery Items",
"subscribersReceiveBenefits": "Stay motivated with even more rewards when you subscribe",
"monthlyMysteryItems": "Limited Monthly Gear Sets",
"monthlyMysticHourglass": "Monthly Mystic Hourglass",
"doubleDropCap": "Double the Drops",
"youAreSubscribed": "You are subscribed to Habitica",
"dropCapReached": "You found all items for the day!",
@@ -225,15 +229,34 @@
"subscriptionCanceled": "Your subscription is canceled",
"subscriptionInactiveDate": "Your subscription benefits will become inactive on <br><strong><%= date %></strong>",
"subscriptionStats": "Subscription Stats",
"subMonths": "Sub Months",
"subMonths": "Months Subscribed",
"needToUpdateCard": "Need to update your card?",
"readyToResubscribe": "Are you ready to resubscribe?",
"cancelYourSubscription": "Cancel your subscription?",
"resubscribeToPickUp": "Resubscribe to pick up where you left off!",
"cancelYourSubscription": "Need to cancel your subscription?",
"cancelSubAlternatives": "If you're having technical problems or Habitica doesn't seem to be working out for you, please consider <a href='mailto:admin@habitica.com'>contacting us</a>. We want to help you get the most from Habitica.",
"sendAGift": "Send Gift",
"haveNonRecurringSub": "You have a non-recurring gift subscription.",
"switchToRecurring": "Switch to a recurring subscription?",
"recurringMonthly": "Recurring every month",
"recurringNMonthly": "Recurring every <%= length %> months",
"unlockNGems": "Unlock <strong><%= count %> Gems</strong> per month instantly",
"earn2Gems": "Earn <strong>+2 Gems</strong> every month you're subscribed",
"maxGemCap": "Max <strong>Gem Cap</strong>",
"monthlyGemsLabel": "Monthly Gems",
"continueGiftSubBenefits": "Want to continue your benefits? You can start a new subscription before your gifted one runs out to keep your benefits active.",
"subscriptionCreditConversion": "Starting a new subscription will convert any remaining months to credit that will be used after the recurring subscription is canceled.",
"monthlyGems": "Monthly Gems:"
"monthlyGems": "Monthly Gems:",
"subscriptionChangeAnnouncement": "<strong>Subscription benefits and the way they are sent out will be changing on November 19.</strong> <%= linkStart %>Click here</a> to read more about this change.",
"popular": "Popular",
"immediate12Hourglasses": "Get <strong>12 Mystic Hourglasses</strong> immediately after your first 12-month subscription!",
"subscribe": "Subscribe",
"selectPayment": "Select Payment",
"giftSubscriptionLeadText": "Choose the subscription you'd like to gift below! This purchase will not automatically renew.",
"oneMonthGift": "For 1 month",
"nMonthsGift": "For <%= months %> months",
"unlockNGemsGift": "They'll unlock <strong><%= count %> Gems</strong> per month instantly",
"earn2GemsGift": "They'll earn <strong>+2 Gems</strong> every month they're subscribed",
"maxGemCapGift": "They'll have the max <strong>Gem Cap</strong>",
"subscribeAgainContinueHourglasses": "Subscribe again to continue receiving Mystic Hourglasses"
}
+16 -1
View File
@@ -867,5 +867,20 @@
"backgroundMonstrousCaveNotes": "Gaze into the maw of the Monstrous Cave.",
"backgroundJackOLanternStacksText": "Jack O'Lantern Stacks",
"backgroundJackOLanternStacksNotes": "Admire a field of Jack OLantern Stacks.",
"backgrounds062024": "Set 121: Released June 2024"
"backgrounds062024": "Set 121: Released June 2024",
"backgroundShellGateText": "Shell Gate",
"backgroundShellGateNotes": "March through the decorated coral of a Shell Gate.",
"backgrounds072024": "SET 122: Released July 2024",
"backgroundRiverBottomText": "River Bottom",
"backgroundRiverBottomNotes": "Explore a River Bottom.",
"backgrounds092024": "SET 124: Released September 2024",
"backgroundMagicDoorInForestText": "Magic Door in the Forest",
"backgroundMagicDoorInForestNotes": "Dare to step through the Magic Door in the Forest.",
"backgrounds102024": "SET 124: Released September 2024",
"backgroundSurroundedByGhostsText": "Surrounded by Ghosts",
"backgroundSurroundedByGhostsNotes": "Spend a spooky evening Surrounded by Ghosts.",
"monthlyBackgrounds": "Monthly Backgrounds",
"backgrounds082024": "SET 123: Released August 2024",
"backgroundSavannaText": "Hazy Grasslands",
"backgroundSavannaNotes": "Hike through Hazy Grasslands."
}
+7 -2
View File
@@ -2,7 +2,7 @@
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <a href='https://habitica.com/static/community-guidelines' target='_blank'>Community Guidelines</a> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= hrefBlankCommunityManagerEmail %>!",
"profile": "Profile",
"avatar": "Customise Avatar",
"editAvatar": "Edit Avatar",
"editAvatar": "Customise Avatar",
"noDescription": "This Habitican hasn't added a description.",
"noPhoto": "This Habitican hasn't added a photo.",
"other": "Other",
@@ -186,5 +186,10 @@
"notEnoughGold": "Not enough gold.",
"chatCastSpellPartyTimes": "<%= username %> casts <%= spell %> for the party <%= times %> times.",
"chatCastSpellUserTimes": "<%= username %> casts <%= spell %> on <%= target %> <%= times %> times.",
"nextReward": "Next Log In Reward"
"nextReward": "Next Log In Reward",
"titleFacialHair": "Facial Hair",
"titleHaircolor": "Hair Colours",
"titleHairbase": "Hair Styles",
"customizations": "Customisations",
"skins": "Skins"
}
+19 -3
View File
@@ -211,7 +211,7 @@
"hatchingPotionGlow": "Glow-in-the-Dark",
"hatchingPotionFrost": "Frost",
"hatchingPotionIcySnow": "Icy Snow",
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> pet.",
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> Pet.",
"foodMeat": "Meat",
"foodMeatThe": "the Meat",
"foodMeatA": "Meat",
@@ -339,7 +339,7 @@
"foodPieRed": "Red Cherry Pie",
"foodPieRedThe": "the Red Cherry Pie",
"foodPieRedA": "a slice of Red Cherry Pie",
"premiumPotionUnlimitedNotes": "Not usable on quest pet eggs.",
"premiumPotionUnlimitedNotes": "Not usable on Quest Pet eggs.",
"hatchingPotionAurora": "Aurora",
"hatchingPotionAmber": "Amber",
"hatchingPotionShadow": "Shadow",
@@ -375,5 +375,21 @@
"hatchingPotionPorcelain": "Porcelain",
"hatchingPotionVirtualPet": "Virtual Pet",
"hatchingPotionPinkMarble": "Pink Marble",
"hatchingPotionTeaShop": "Tea Shop"
"hatchingPotionTeaShop": "Tea Shop",
"questEggRaccoonText": "Raccoon",
"questEggRaccoonMountText": "Raccoon",
"questEggRaccoonAdjective": "a ravenous",
"questEggDogText": "Puppy",
"questEggDogMountText": "Dog",
"questEggDogAdjective": "a friendly",
"questEggGiraffeText": "Giraffe",
"questEggGiraffeMountText": "Giraffe",
"questEggGiraffeAdjective": "a towering",
"questEggChameleonText": "Chameleon",
"questEggChameleonMountText": "Chameleon",
"questEggChameleonAdjective": "a chaotic",
"hatchingPotionKoi": "Koi",
"questEggCrabText": "Crab",
"questEggCrabMountText": "Crab",
"questEggCrabAdjective": "a fiddling"
}
+14 -3
View File
@@ -1,12 +1,11 @@
{
"frequentlyAskedQuestions": "Frequently Asked Questions",
"webFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most Gold and find the most item drops, and they can help their party do the same. Finally, Healers can heal themselves and their party members. If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click \"Opt Out\" and re-enable it later under Settings.",
"iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help.",
"commonQuestions": "Common Questions",
"faqQuestion25": "What are the different task types?",
"webFaqAnswer25": "Habitica uses three different task types to accommodate your needs: Habits, Dailies, and To Dos.\n\nHabits can be positive or negative and represent something you may want to track multiple times per day, or on an unset schedule. Positive Habits will provide you with rewards, like Gold and Experience (Exp), while Negative Habits will cause you to lose health points (HP).\n\nDailies are repeated tasks you want to complete on a more structured schedule. E.g. Once per day, three times a week, or four times a month. Missing Dailies causes you to lose HP, but the more difficult they are, the better the rewards!\n\nTo Dos are one-off tasks that provide rewards after you complete them. To Dos can have a due date, but you wont lose HP if you miss it.\n\nPick the task type that best fits what you want to achieve!",
"webFaqAnswer25": "Habitica uses three different task types to accommodate your needs: Habits, Dailies, and To Dos.\n\nHabits can be positive or negative and represent something you may want to track multiple times per day, or on an unset schedule. Positive Habits will provide you with rewards, like Gold and Experience (Exp), while Negative Habits will cause you to lose health points (HP).\n\nDailies are repeated tasks you want to complete on a more structured schedule. For example, once per day, three times a week, or four times a month. Missing Dailies causes you to lose HP, but the more difficult they are, the better the rewards!\n\nTo Dos are one-off tasks that provide rewards after you complete them. To Dos can have a due date, but you wont lose HP if you miss it.\n\nPick the task type that best fits what you want to achieve!",
"faqQuestion26": "What are some sample tasks?",
"faqQuestion27": "Why do tasks change colour?",
"faqQuestion29": "How do I recover HP?",
@@ -17,5 +16,17 @@
"faqQuestion46": "How do I report a bug?",
"faqQuestion65": "Are Group Plans supported on the mobile apps?",
"parties": "Parties",
"faqQuestion28": "Can I pause my Dailies if I need a break?"
"faqQuestion28": "Can I pause my Dailies if I need a break?",
"webFaqAnswer26": "Positive Habits (Behaviours you want to encourage; should have a plus button)\n\n * Take vitamins\n * Floss teeth\n * One hour of studying\n\nNegative Habits (Behaviours you want to limit or avoid; should have a minus button)\n\n * Smoking\n * Doom scrolling\n * Biting nails\n\nDual Habits (Habits that involve a positive vs. negative option; should have both plus and minus buttons)\n\n * Drink water vs. drink soda\n * Study vs. procrastinate\n\nSample Dailies (Tasks you want to repeat on a regular schedule)\n\n * Wash dishes\n * Water plants\n * 30 minutes of physical activity\n\nSample To Dos (Tasks you only need to do once)\n\n * Schedule appointment\n * Organise closet\n * Finish essay",
"webFaqAnswer27": "The colour of a task is a visual representation of the tasks value. All tasks start as yellow for neutral. Blue is better, and red is worse. Heres how each task type determines the tasks value:\n\nHabits become more blue or red based on whether you tap the plus or minus button. Positive and negative Habits degrade to yellow over time if you dont complete them. Dual Habits only change colour based on your inputs.\n\nDailies change colour based on how often they are completed, becoming more blue as theyre completed or more red if theyre missed.\n\nTo Dos gradually get more red the longer they stay incomplete.\n\nThe more red the task, the more Gold and Experience youll earn for completing it, so be sure to take on even your toughest tasks!",
"webFaqAnswer28": "Yes! The “Pause Damage” button can be found in Settings. It will prevent you from losing HP for missed Dailies. This is helpful if you are on vacation, need a rest, or for any other reason you might need a break. If you are participating in a Quest, your own pending progress will be paused, but you will still take damage from your Party members missed Dailies.\n\nTo pause specific Dailies, you can edit the scheduling to make it due every 0 days until youre ready to restart it.",
"webFaqAnswer29": "You can recover 15 HP by purchasing a Health Potion from your Rewards column for 25 Gold. Additionally, you will always recover full HP when you level up!",
"faqQuestion30": "What happens when I run out of HP?",
"webFaqAnswer30": "If your HP reaches zero, youll lose one level, all of your Gold, and a piece of Equipment that can be repurchased.",
"faqQuestion31": "Why did I lose HP when interacting with a non-negative task?",
"webFaqAnswer31": "If you complete a task and lose HP when you shouldnt have, you encountered a delay while the server was syncing changes made on other platforms. For example, if you use Gold, Mana, or lose HP on the mobile app and then complete a task on the website, the server is simply confirming everything is in sync.",
"faqQuestion32": "When can I choose a class?",
"webFaqAnswer32": "There are four classes in Habitica: Warrior, Mage, Rogue, and Healer. All players start as the Warrior class until they reach level 10. Once you reach level 10, youll be given the choice between selecting a new class or continuing as a Warrior.\n\nEach class has different Equipment and Skills. If you don't want to choose a class, you can select \"Opt Out.\" If you choose to opt out, you can always enable the Class System from Settings later.",
"faqQuestion33": "What is the blue bar that appears after level 10?",
"webFaqAnswer33": "After you unlock the Class System, you also unlock Skills that require Mana to be cast. Mana is determined by your INT stat and can be adjusted by Skills and Equipment."
}
+4 -1
View File
@@ -882,5 +882,8 @@
"backgroundMagicDoorInForestNotes": "Atrévete a atravesar un extraño Portal Mágico en medio del Bosque.",
"backgroundSurroundedByGhostsText": "Rodeado de Fantasmas",
"backgroundSurroundedByGhostsNotes": "Pasa una noche espeluznante rodeado de fantasmas.",
"backgrounds102024": "CONJUNTO 124: Publicado en Septiembre 2024"
"backgrounds102024": "CONJUNTO125: Publicado en Octubre 2024",
"backgrounds112024": "CONJUNTO 126: Publicado en Noviembre 2024",
"backgroundCastleHallWithHearthText": "Salón de Castillo con Chimenea",
"backgroundCastleHallWithHearthNotes": "Deléitate de la calidez de este salón del castillo con chimenea."
}
+1 -1
View File
@@ -391,5 +391,5 @@
"questEggRaccoonAdjective": "uno voraz",
"questEggDogText": "Cachorro",
"questEggDogMountText": "Perro",
"questEggDogAdjective": "un amigo"
"questEggDogAdjective": "un amistoso"
}
+56 -2
View File
@@ -1,6 +1,5 @@
{
"frequentlyAskedQuestions": "Preguntas Frecuentes",
"webFaqAnswer7": "En el nivel 10, puedes elegir si te conviertes en Guerrero, Mago, Pícaro o Sanador. (Todos los jugadores comienzan como Guerreros por defecto). Cada Clase tiene diferentes opciones de equipación, diferentes Habilidades que pueden lanzar a partir del nivel 11 y diferentes ventajas. Los Guerreros pueden hacer daño a los Jefes con facilidad, aguantar más daño de sus tareas y ayudar a hacer más resistente al equipo. Los Magos pueden también dañar a los Jefes con facilidad, así como subir rápidamente de nivel y recuperar Maná para su equipo. Los pícaros ganan más oro y encuentran más objetos de botín, y pueden ayudar a su equipo a hacer lo mismo. Finalmente, los Sanadores pueden curarse a sí mismos y a los miembros de su equipo. Si no quieres elegir una Clase de forma inmediata -- por ejemplo, todavía estás comprando todo el equipamiento para tu clase actual -- puedes hacer click en \"Renunciar\" y reabrirlo más tarde en Ajustes.",
"iosFaqStillNeedHelp": "Si tienes alguna pregunta que no aparezca en la lista o en las [preguntas frecuentes de la Wiki](https://habitica.fandom.com/wiki/FAQ), ¡usa la opción de Hacer una Pregunta en [LINK NEEDED]! Estaremos encantados de ayudar.",
"androidFaqStillNeedHelp": "Si tienes alguna pregunta que no esté en la lista o en las [preguntas frecuentes de la Wiki](https://habitica.fandom.com/wiki/FAQ), ¡usa la opción de Hacer una Pregunta en [LINK NEEDED]! Estaremos encantados de ayudar.",
"webFaqStillNeedHelp": "Si tienes una pregunta que no está en esta lista o en la [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), ¡usa la opción de Hacer una Pregunta en [LINK NEEDED]! Estaremos encantados de ayudar.",
@@ -187,5 +186,60 @@
"contentAnswer51": "Los artículos para personalizar que ya poseas (tanto los estándar como los que haya comprado) serán accesibles desde la actual sección de Personalización del Personaje.",
"contentAnswer52": "Esperamos que este cambio ayude a los jugadores neófitos a elegir entre los artículos de personalización que posean cuando editen la apariencia de su avatar mientras adquieren y se familiarizan con la experiencia de adquirir otros artículos disponibles para su compra.",
"contentFaqPara3": "¡Si tienes cualquier pregunta que no se haya respondido hasta ahora, siempre puedes ponerte en contacto con nuestro equipo en <%= mailto %>! Estamos muy ilusionados con este nuevo calendario de publicación de contenido y incluso esperamos con ansia trabajar en nuevos proyectos en el futuro para hacer una Habitica cada vez mejor para todos los jugadores.",
"contentAnswer62": "Las Pociones de Eclosión Mágicas del Día de San Valentín están ahora disponibles en el calendario mensual."
"contentAnswer62": "Las Pociones de Eclosión Mágicas del Día de San Valentín están ahora disponibles en el calendario mensual.",
"subscriptionBenefitsAdjustments": "Ajustes en los Beneficios de Suscriptor",
"subscriptionBenefitsFaqTitle": "Ajustes en los Beneficios de Suscriptor Preguntas frecuentes",
"subscriptionHeading0": "Cambios en los Relojes de Arena místicos",
"subscriptionDetail00": "Todos los suscriptores, incluyendo aquellos que hayan recibido una suscripción como regalo, recibirán 1 Reloj de arena Místico como beneficio al principio de cada mes en el que estén suscritos.",
"subscriptionDetail002": "Los suscriptores ya no tendrán que esperar hasta el mes de renovación del pago de su suscripción para recibir cualquier cantidad de Relojes de Arena místicos.",
"subscriptionDetail01": "Las nuevas suscripciones anuales obtendrán de una vez como bono inicial los 12 Relojes de Arena místicos que corresponderían a la compra.",
"subscriptionDetail010": "Esto será además de el Reloj de arena Místico mensual que todos los nuevos suscriptores reciben después de su compra inicial.",
"subscriptionDetail012": "Este bono no aplica a las suscripciones de regalo.",
"subscriptionHeading1": "Cambios en las Gemas por Suscriptor",
"subscriptionDetail10": "La cantidad de Gemas que los suscriptores pueden comprar por Oro en el Mercado se incrementará en 2 por cada mes hasta alcanzar la cantidad máxima de 50.",
"subscriptionDetail101": "A cualquier suscriptor que actualmente tenga un número extraño de Gemas por mes se le redondeará hacia arriba su capacidad de Gemas hasta alcanzar un número par.",
"subscriptionDetail102": "Las nuevas suscripciones anuales recibirán inmediatamente la cantidad máxima de Gemas por mes, 50 Gemas al mes en vez de las 45 previas.",
"subscriptionDetail11": "La cantidad de Gemas que podrás comprar por Oro cada mes no se volverá a resetear cuando tu suscripción caduque.",
"subscriptionHeading2": "¿Por qué estamos implementando estos cambios?",
"subscriptionDetail20": "En la estructura de juego actual, puede ser complicado ver cuántos Relojes de Arena místicos recibes y cuándo.",
"subscriptionDetail21": "Los cuatro diferentes periodos de suscripción causan algunas complicaciones cuando se cambian períodos más o menos largos.",
"subscriptionDetail24": "Queríamos que los suscriptores tuvieran más de cuatro oportunidades al año de coleccionar los artículos de la Tienda de los Viajeros del Tiempo.",
"subscriptionHeading3": "Día de Publicación de la Recompensas",
"subscriptionPara1": "Para facilitar la transición al nuevo formato, los suscriptores actuales pueden esperar que se les concedan algunas cosas extra el día de publicación de las recompensas. ¡Queremos de todo corazón agradeceros el apoyo constante a pesar de los cambios!",
"subscriptionDetail30": "Los jugadores con una suscripción recurrente de 1 mes o una suscripción de Plan de Grupo recibirán 2 Relojes de Arena místicos y 20 Gemas.",
"subscriptionDetail32": "Los jugadores con una suscripción recurrente de 12 meses recibirán un bono de 12 Relojes de arena Místicos como se ha dicho más arriba y 20 Gemas.",
"subscriptionDetail33": "Para recibir estas recompensas, tu cuenta debe de estar activa en una suscripción recurrente antes del 19 de Noviembre.",
"subscriptionDetail41": "¿Cambiará el precio de las suscripciones cuando empiece el nuevo formato?",
"subscriptionDetail410": "No, estos cambios no afectarán al precio actual de las suscripciones.",
"subscriptionDetail42": "Si no entro en Habitica durante todo el mes mientras estoy suscrito, ¿perderé todos los beneficios?",
"subscriptionDetail420": "Así como sucede con los Conjuntos de Equipamiento Misteriosos, no vas a perder ningún Reloj de Arena místico o incremento de la capacidad de Gemas si no entras en Habitica mientras estás suscrito. La próxima vez que te conectes recibirás todos los beneficios que deberías haber recibido por cada uno de los meses que estuviste suscrito.",
"subscriptionDetail43": "Si me doy de alta en una suscripción recurrente y la cancelo, ¿aún obtendré beneficios?",
"subscriptionDetail430": "Al cancelar una suscripción recurrente pondrás una fecha final a tus beneficios pero aún tendrás acceso a todos estos antes de la fecha final. Esto significa que aún recibirás Relojes de Arena místicos y aumento en la capacidad de Gemas a principio de cada mes que tengas estos beneficios.",
"subscriptionDetail44": "Si actualmente soy un suscriptor, ¿cuántas Gemas tendré disponibles en el Mercado cada mes después del cambio?",
"subscriptionDetail440": "El día en que los cambios se implementen, los suscriptores actuales con un número extraño de Gemas por mes verán los siguientes ajustes en su capacidad de Gemas:",
"subscriptionDetail4400": "Si hasta ahora habías desbloqueado <%= initialNumber %> de Gemas por mes, a partir de ese punto tendrás <%= roundedNumber %>.",
"subscriptionDetail45": "¿Comprar una suscripción de regalo extra puede darme más Relojes de Arena místicos o puede ayudarme a elevar la capacidad de Gemas más deprisa?",
"subscriptionDetail46": "Si tuve una suscripción en el pasado, ¿puedo desbloquear mi antiguo máximo de capacidad de Gemas cuando me vuelva a suscribir?",
"subscriptionDetail460": "Dado que solíamos restablecer la cantidad de gemas que podías comprar cada mes cuando se agotaban tus beneficios, los jugadores con beneficios de suscripción vencidos tendrán que comenzar de nuevo con este nuevo sistema.",
"subscriptionDetail47": "Si tengo una suscripción de Plan Grupal, ¿cómo va a afectarme?",
"subscriptionDetail48": "¿Hay algunos cambios en los beneficios de suscripción, por ejemplo en los Conjuntos de Equipación Misteriosos?",
"subscriptionDetail480": "Los cambios solo van a afectar a los Relojes de Arena místicos y las Gemas de suscriptor. El resto de beneficios permanecerán igual.",
"subscriptionPara2": "Si tienes cualquier pregunta que no se haya contestado más arriba, siempre puedes ponerte en contacto con nuestro equipo usando <%= mailto %>.",
"subscriptionPara0": "¡Estamos haciendo que las suscripciones a Habitica mejoren al ofrecer más Relojes de Arena místicos y Gemas! Estos cambios harán que os sea más fácil ver cuanto os beneficia una suscripción.",
"subscriptionDetail000": "Estar suscrito por 12 meses conllevará la adquisición de 12 Relojes de Arena místicos en vez de los 4 que se obtenían previamente.",
"subscriptionDetail003": "Todos los nuevos suscriptores recibirán 1 Reloj de arena Místico inmediatamente tras la compra. Esto cuenta como la adquisición del Reloj de arena Místico mensual.",
"subscriptionDetail011": "Los jugadores que actualmente tienen una suscripción anual de 12 meses activa recibirán este bono en el día en que estos cambios empiecen a tener efecto.",
"subscriptionDetail001": "Todos los suscriptores recibirán Relojes de Arena místicos en la misma fecha, coincidiendo con la fecha de publicación de el Conjunto de Equipamiento Misterioso del mes.",
"subscriptionDetail100": "Los nuevas suscripciones de 1, 3 y 6 meses empezarán ahora con 24 Gemas por mes y se irán incrementando por cada mes que se disfrute de beneficios.",
"subscriptionDetail110": "Si alcanzas una cantidad de Gemas determinada que puedes comprar cada mes, cuando canceles tu suscripción, podrás obtener la misma cantidad de Gemas que alcanzaste cuando vuelvas a suscribirte en el futuro, incluso si esta vez te suscribes por menos meses.",
"subscriptionDetail22": "Las suscripciones de regalo o las recurrentes tenían algunos conflictos con relación a los beneficios y las normas y queríamos simplificarlo.",
"subscriptionDetail23": "Entregar un Reloj de arena Místico al mes permite a los suscriptores disfrutar de los artículos periódicos en la Tienda de los Viajeros del Tiempo.",
"subscriptionDetail25": "Entendemos que la situación económica es cambiante y no queríamos castigar a los suscriptores quitándoles los beneficios que ya habían obtenido cuando cancelaran sus suscripciones por un periodo de tiempo.",
"subscriptionDetail31": "Los jugadores con una suscripción recurrente de 3 o 6 meses recibirán 4 Relojes de Arena místicos y 20 Gemas.",
"subscriptionDetail40": "Soy un suscriptor, ¿cuándo recibiré mi primer Reloj de arena Místico y capacidad de Gemas en el nuevo formato?",
"subscriptionDetail450": "Ya que los Relojes de Arena místicos y elevar la capacidad de Gemas mensual es a partir de ahora un beneficio mensual, comprar múltiples suscripciones de regalo no te dará más beneficios.",
"subscriptionDetail400": "Para los actuales suscriptores, recibiréis vuestro primer Reloj de arena Místico y +2 Gemas añadidas a vuestra capacidad mensual, la primera vez que entréis en Habitica después de su publicación. Esto significa que si resulta que ya estabais dados de alta en Noviembre, vuestro incremento mensual será para Diciembre.",
"subscriptionDetail451": "Cada suscripción de regalo se añadirá a la cantidad de meses que un jugador tiene beneficios de suscriptor, permitiendo así que este reciba más Relojes de Arena místicos y incrementar su capacidad de Gemas por cada mes.",
"subscriptionDetail470": "Los beneficios de los suscriptores de Plan de Grupo se comportarán de la misma manera que las suscripciones recurrentes de 1 mes. Recibirás un Reloj de arena Místico al empezar el mes y la cantidad de Gemas que podrás comprar cada mes en el Mercado se incrementará en 2 hasta alcanzar las 50.",
"subscriptionPara3": "¡Esperamos que este nuevo formato sea más intuitivo, permita un mayor acceso a los artículos de la Tienda de los Viajeros del TIempo, y os ayude a estar más motivados a progresar en vuestras tareas mensuales!"
}
+11 -1
View File
@@ -3199,5 +3199,15 @@
"backMystery202410Text": "Cola de Caramelo de Maíz",
"backMystery202410Notes": "Esta cola se anima ante la mención de golosinas espeluznantes. No otorga ningún beneficio. Artículo de Suscriptor Octubre 2024.",
"headAccessoryMystery202410Text": "Orejas de Caramelo de Maíz",
"headAccessoryMystery202410Notes": "¿Es ese el sonido de los truco o trato en tu puerta? No otorga ningún beneficio. Artículo de Suscriptor Octubre 2024."
"headAccessoryMystery202410Notes": "¿Es ese el sonido de los truco o trato en tu puerta? No otorga ningún beneficio. Artículo de Suscriptor Octubre 2024.",
"headArmoireStormKnightHelmText": "Yelmo de Caballero Llamatormentas",
"bodyMystery202411Notes": "Los devastadores pinchos de estas hombreras son perfectos para salir adelante con tu lista de tareas pendientes. No otorga ningún beneficio. Artículo de Suscriptor Noviembre 2024.",
"weaponArmoireStormKnightAxeText": "Hacha de Caballeros Llamatormentas",
"weaponArmoireStormKnightAxeNotes": "¡Reúne toda tu furia y lanza un golpe atronador! Aumenta la fuerza en <%= str %>. Armario Encantado: Conjunto Caballero Llamatormentas (Artículo 3 de 3)",
"armorArmoireStormKnightArmorText": "Armadura de Caballero Llamatormentas",
"armorArmoireStormKnightArmorNotes": "Con esta armadura, serás casi invencible. Tus enemigos nunca verán el fin a la furiosa tormenta que arremeterá contra ellos. Aumenta la percepcion en <%= per %>. Armario Encantado: Conjunto Caballero Llamatormentas (Artista 2 de 3)",
"headMystery202411Text": "Yelmo Erizado",
"headMystery202411Notes": "¡Este yelmo resulta bastante intimidante para tus tareas cuando te lanzas hacia ellas de cabeza! No otorga ningún beneficio. Artículo de Suscriptor Noviembre 2024.",
"headArmoireStormKnightHelmNotes": "En pleno asedio a un castillo utiliza las antenas de este yelmo para llamar el rayo de la tormenta y embestir las murallas exteriores. Aumenta la Constitución en <%= con %>. Armario Encantado: Conjunto Caballero Llamatormentas (Artículo 1 de 3)",
"bodyMystery202411Text": "Hombreras Erizadas"
}
+1 -1
View File
@@ -117,7 +117,7 @@
"paymentAutoRenew": "Esta suscripción se renovará automáticamente hasta que sea cancelada. Si necesitas cancelar está suscripción, puedes hacerlo desde tus Configuraciones.",
"paymentCanceledDisputes": "Hemos enviado una confirmación de cancelación a tu correo electrónico. Si no ves el correo, por favor contáctanos para prevenir futuros problemas de facturación.",
"cannotUnpinItem": "Este objeto no puede desanclarse.",
"paymentSubBillingWithMethod": "Tu suscripción será cobrada <strong>$<%= amount %></strong> cada <strong><%= months %> meses</strong> por medio de <strong><%= paymentMethod %></strong>.",
"paymentSubBillingWithMethod": "Tu suscripción se facturará <br><strong>$<%= amount %>.00 USD</strong> cada <strong><%= months %> meses</strong> a través de <strong><%= paymentMethod %></strong>",
"invalidUnlockSet": "Este conjunto de artículos es inválido y no puede ser desbloqueado.",
"nMonthsSubscriptionGift": "<%= nMonths %> mes(es) de suscripción (Regalo)",
"nGemsGift": "<%= nGems %> Gemas (Regalo)",
+3 -1
View File
@@ -235,5 +235,7 @@
"mysterySet202407": "Conjunto de Ajolote Afable",
"mysterySet202408": "Conjunto Égida Arcana",
"mysterySet202409": "Conjunto de Mago Heliotropo de Jardín",
"mysterySet202410": "Conjunto de Zorro Caramelo de Maíz"
"mysterySet202410": "Conjunto de Zorro Caramelo de Maíz",
"mysterySet202411": "Conjunto de Luchador Erizado",
"subscriptionChangeAnnouncement": "<strong>Los beneficios de suscriptor y la forma en que se envían cambiarán el 19 de Noviembre. </strong> <%= linkStart %>Pulsa aquí </a>para leer más acerca de este cambio."
}
@@ -764,5 +764,10 @@
"backgroundByACampfireNotes": "Disfruta de la luz de la fogata.",
"backgroundByACampfireText": "Por una fogata",
"backgroundRimeIceText": "Hielo Escarchado",
"backgroundRimeIceNotes": "Admira el brillante Hielo Escachado."
"backgroundRimeIceNotes": "Admira el brillante Hielo Escachado.",
"backgroundMangroveForestNotes": "Explore la orilla del manglar.",
"backgroundLeafyTreeTunnelText": "Túnel de árboles frondosos",
"backgroundLeafyTreeTunnelNotes": "deambule a través del túnel de arboles frondosos.",
"backgroundSpringtimeShowerText": "Ducha primaveral",
"backgroundSpringtimeShowerNotes": "Mire una ducha primaveral florida."
}
+115 -109
View File
@@ -213,7 +213,7 @@
"backgroundStormyRooftopsNotes": "Grimpez sur des toits orageux.",
"backgroundWindyAutumnText": "Automne venteux",
"backgroundWindyAutumnNotes": "Pourchassez les feuilles pendant un automne venteux.",
"incentiveBackgrounds": "Arrière-Plans de Base",
"incentiveBackgrounds": "Arrière-Plans Standards",
"backgroundVioletText": "Violet",
"backgroundVioletNotes": "Un arrière-plan violet vibrant.",
"backgroundBlueText": "Bleu",
@@ -671,7 +671,7 @@
"backgrounds022022": "Ensemble 93 : sorti en février 2022",
"backgroundWinterWaterfallText": "Chutes d'eau hivernales",
"backgroundOrangeGroveText": "Orangeraie",
"backgroundOrangeGroveNotes": "Baladez-vous dans une orangeraie parfumée.",
"backgroundOrangeGroveNotes": "Baladez-vous dans une Orangeraie parfumée.",
"backgroundIridescentCloudsText": "Nuages iridescents",
"backgroundIridescentCloudsNotes": "Flottez sur des nuages iridescents.",
"backgrounds032022": "Ensemble 94 : sorti en mars 2022",
@@ -697,12 +697,12 @@
"backgroundOnACastleWallText": "Sur le mur d'un château",
"backgroundEnchantedMusicRoomNotes": "Jouez dans une salle de musique enchantée.",
"backgrounds072022": "Ensemble 98 : sorti en juillet 2022",
"backgroundBioluminescentWavesText": "Vagues bioluminescentes",
"backgroundBioluminescentWavesNotes": "Admirez la lueur des vagues bioluminescentes.",
"backgroundUnderwaterCaveText": "Grotte sous-marine",
"backgroundUnderwaterCaveNotes": "Explorez une grotte sous-marine.",
"backgroundUnderwaterStatuesText": "Jardin de statues sous-marin",
"backgroundUnderwaterStatuesNotes": "Essayez de ne pas cligner des yeux dans un jardin de statues sous-marin.",
"backgroundBioluminescentWavesText": "Vagues Bioluminescentes",
"backgroundBioluminescentWavesNotes": "Admirez la lueur des vagues Bioluminescentes.",
"backgroundUnderwaterCaveText": "Grotte Sous-marine",
"backgroundUnderwaterCaveNotes": "Explorez une Grotte Sous-marine.",
"backgroundUnderwaterStatuesText": "Jardin de Statues Sous-marin",
"backgroundUnderwaterStatuesNotes": "Essayez de ne pas cligner des yeux dans un Jardin de Statues Sous-marin.",
"backgrounds062022": "Ensemble 97 : sorti en juin 2022",
"backgroundBeachWithDunesText": "Plage avec des dunes",
"backgroundBeachWithDunesNotes": "Explorez une plage avec des dunes.",
@@ -710,104 +710,104 @@
"backgroundMountainWaterfallNotes": "Admirez une cascade en montagne.",
"backgroundSailboatAtSunsetText": "Voilier au coucher du soleil",
"backgroundSailboatAtSunsetNotes": "Appréciez la beauté d'un voilier au coucher du soleil.",
"backgroundRainbowEucalyptusText": "Eucalyptus arc-en-ciel",
"backgroundMessyRoomNotes": "Ranger une chambre en désordre.",
"backgroundRainbowEucalyptusText": "Eucalyptus Arc-en-ciel",
"backgroundMessyRoomNotes": "Ranger une Chambre en Désordre.",
"backgrounds082022": "Ensemble 99 : sorti en août 2022",
"backgroundRainbowEucalyptusNotes": "Admirez une forêt d'eucalyptus arc-en-ciel.",
"backgroundByACampfireNotes": "Prélassez-vous à la lueur d'un feu de camp.",
"backgroundMessyRoomText": "Chambre en désordre",
"backgroundByACampfireText": "En bordure d'un feu de camp",
"backgroundRainbowEucalyptusNotes": "Admirez une Forêt d'Eucalyptus Arc-en-ciel.",
"backgroundByACampfireNotes": "Prélassez-vous à la lueur d'un Feu de Camp.",
"backgroundMessyRoomText": "Chambre en Désordre",
"backgroundByACampfireText": "En bordure d'Un Feu de Camp",
"backgrounds092022": "Ensemble 100 : sorti en septembre 2022",
"backgroundTheatreStageText": "Scène de théâtre",
"backgroundTheatreStageNotes": "Jouez sur une scène de théâtre.",
"backgroundAutumnPicnicText": "Pique-nique automnal",
"backgroundOldPhotoText": "Vieille photo",
"backgroundAutumnPicnicNotes": "Appréciez un pique-nique automnal.",
"backgroundOldPhotoNotes": "Prenez la pose sur une vieille photo.",
"backgroundTheatreStageText": "Scène de Théâtre",
"backgroundTheatreStageNotes": "Jouez sur une Scène de Théâtre.",
"backgroundAutumnPicnicText": "Pique-nique Automnal",
"backgroundOldPhotoText": "Vieille Photo",
"backgroundAutumnPicnicNotes": "Appréciez un Pique-nique Automnal.",
"backgroundOldPhotoNotes": "Prenez la pose sur une Vieille Photo.",
"backgrounds112022": "Ensemble 102 : sorti en novembre 2022",
"backgroundAmongGiantMushroomsNotes": "Émerveillez-vous parmi les champignons géants.",
"backgroundAmongGiantMushroomsText": "Parmi les champignons géants",
"backgroundMistyAutumnForestText": "Forêt automnale brumeuse",
"backgroundMistyAutumnForestNotes": "Baladez-vous dans une forêt automnale brumeuse.",
"backgroundAutumnBridgeText": "Pont en automne",
"backgroundAutumnBridgeNotes": "Admirez la beauté d'un pont en automne.",
"backgroundAmongGiantMushroomsNotes": "Émerveillez-vous parmi les Champignons Géants.",
"backgroundAmongGiantMushroomsText": "Parmi les Champignons Géants",
"backgroundMistyAutumnForestText": "Forêt Automnale Brumeuse",
"backgroundMistyAutumnForestNotes": "Baladez-vous dans une Forêt Automnale Brumeuse.",
"backgroundAutumnBridgeText": "Pont en Automne",
"backgroundAutumnBridgeNotes": "Admirez la beauté d'un Pont en Automne.",
"backgrounds102022": "Ensemble 101 : sorti en octobre 2022",
"backgroundSpookyRuinsText": "Ruines terrifiantes",
"backgroundSpookyRuinsNotes": "Explorez des ruines terrifiantes.",
"backgroundMaskMakersWorkshopText": "Atelier de fabrication de masques",
"backgroundMaskMakersWorkshopNotes": "Essayez un nouveau visage dans l'atelier de fabrication de masques.",
"backgroundCemeteryGateText": "Porte de cimetière",
"backgroundCemeteryGateNotes": "Hantez la porte d'un cimetière.",
"backgroundSpookyRuinsText": "Ruines Terrifiantes",
"backgroundSpookyRuinsNotes": "Explorez des Ruines Terrifiantes.",
"backgroundMaskMakersWorkshopText": "Atelier de Fabrication de Masques",
"backgroundMaskMakersWorkshopNotes": "Essayez un nouveau visage dans l'Atelier de Fabrication de Masques.",
"backgroundCemeteryGateText": "Porte du Cimetière",
"backgroundCemeteryGateNotes": "Hantez la Porte du Cimetière.",
"backgrounds122022": "Ensemble 103 : sorti en décembre 2022",
"backgroundBranchesOfAHolidayTreeText": "Branches d'un sapin de Noël",
"backgroundBranchesOfAHolidayTreeNotes": "Batifoles sur les branches d'un sapin de Noël.",
"backgroundInsideACrystalText": "L'intérieur d'un cristal",
"backgroundInsideACrystalNotes": "Surveillez depuis l'intérieur d'un cristal.",
"backgroundSnowyVillageText": "Village enneigé",
"backgroundSnowyVillageNotes": "Admirez un village enneigé.",
"backgroundBranchesOfAHolidayTreeText": "Branches d'un Sapin de Noël",
"backgroundBranchesOfAHolidayTreeNotes": "Batifoles sur les Branches d'un Sapin de Noël.",
"backgroundInsideACrystalText": "L'intérieur d'un Cristal",
"backgroundInsideACrystalNotes": "Surveillez depuis l'Intérieur d'un Cristal.",
"backgroundSnowyVillageText": "Village Enneigé",
"backgroundSnowyVillageNotes": "Admirez un Village Enneigé.",
"backgrounds012023": "Ensemble 104 : sorti en janvier 2023",
"backgroundRimeIceText": "Glace givrée",
"backgroundRimeIceNotes": "Admirez de la glace givrée scintillante.",
"backgroundSnowyTempleText": "Temple enneigé",
"backgroundSnowyTempleNotes": "Contemplez un temple enneigé serein.",
"backgroundWinterLakeWithSwansText": "Lac d'hiver avec des cygnes",
"backgroundWinterLakeWithSwansNotes": "Profitez de la nature près d'un lac d'hiver avec des cygnes.",
"eventBackgrounds": "Arrière-plans événementiels",
"backgroundBirthdayBashText": "Fête d'anniversaire",
"backgroundRimeIceText": "Glace Givrée",
"backgroundRimeIceNotes": "Admirez de la Glace Givrée scintillante.",
"backgroundSnowyTempleText": "Temple Enneigé",
"backgroundSnowyTempleNotes": "Contemplez un Temple Enneigé serein.",
"backgroundWinterLakeWithSwansText": "Lac d'Hiver avec des Cygnes",
"backgroundWinterLakeWithSwansNotes": "Profitez de la nature près d'un Lac d'Hiver avec des Cygnes.",
"eventBackgrounds": "Arrière-plans Événementiels",
"backgroundBirthdayBashText": "Fête d'Anniversaire",
"backgroundBirthdayBashNotes": "Habitica fait une fête d'anniversaire, et tout le monde est invité !",
"backgrounds022023": "Ensemble 105 : sorti en février 2023",
"backgroundInFrontOfFountainText": "Devant une fontaine",
"backgroundInFrontOfFountainNotes": "Baladez-vous devant une fontaine.",
"backgroundGoldenBirdcageText": "Cage à oiseau dorée",
"backgroundGoldenBirdcageNotes": "Cachez-vous dans une cage à oiseau dorée.",
"backgroundFancyBedroomText": "Chambre fantaisiste",
"backgroundFancyBedroomNotes": "Amusez-vous dans une chambre fantaisiste.",
"backgroundOldTimeyBasketballCourtNotes": "Faites des tirs sur un vieux terrain de basket.",
"backgroundJungleWateringHoleText": "Point d'eau dans la jungle",
"backgroundInFrontOfFountainText": "Devant une Fontaine",
"backgroundInFrontOfFountainNotes": "Baladez-vous devant une Fontaine.",
"backgroundGoldenBirdcageText": "Cage à Oiseau Dorée",
"backgroundGoldenBirdcageNotes": "Cachez-vous dans une Cage à Oiseau Dorée.",
"backgroundFancyBedroomText": "Chambre Raffinée",
"backgroundFancyBedroomNotes": "Amusez-vous dans une Chambre Raffinée.",
"backgroundOldTimeyBasketballCourtNotes": "Faites des tirs sur un Vieux Terrain de Basket.",
"backgroundJungleWateringHoleText": "Point d'Eau dans la Jungle",
"backgroundMangroveForestText": "Mangrove",
"backgrounds032023": "Ensemble 106 : sorti en mars 2023",
"backgroundOldTimeyBasketballCourtText": "Vieux terrain de basket",
"backgroundJungleWateringHoleNotes": "Arrêtez vous pour vous désaltérer à un point d'eau dans la jungle.",
"backgroundMangroveForestNotes": "Explorez les abords d'une mangrove.",
"backgroundInAPaintingText": "Dans une peinture",
"backgroundFlyingOverHedgeMazeText": "Survolant un labyrinthe de haies",
"backgroundInAPaintingNotes": "Profitez d'activités créatives dans une peinture.",
"backgroundFlyingOverHedgeMazeNotes": "Émerveillez-vous en survolant un labyrinthe de haies.",
"backgroundLeafyTreeTunnelText": "Tunnel d'arbre feuillu",
"backgroundSpringtimeShowerText": "Douche de printemps",
"backgroundOldTimeyBasketballCourtText": "Vieux Terrain de Basket",
"backgroundJungleWateringHoleNotes": "Arrêtez vous pour vous désaltérer à un Point d'Eau dans la Jungle.",
"backgroundMangroveForestNotes": "Explorez les abords d'une Mangrove.",
"backgroundInAPaintingText": "Dans une Peinture",
"backgroundFlyingOverHedgeMazeText": "Survolant un Labyrinthe de Haies",
"backgroundInAPaintingNotes": "Profitez d'activités créatives Dans une Peinture.",
"backgroundFlyingOverHedgeMazeNotes": "Émerveillez-vous en Survolant un Labyrinthe de Haies.",
"backgroundLeafyTreeTunnelText": "Tunnel de l'Arbre Feuillu",
"backgroundSpringtimeShowerText": "Douche de Printemps",
"backgrounds042023": "Ensemble 107 : sorti en avril 2023",
"backgroundSpringtimeShowerNotes": "Regardez une douche printanière florale.",
"backgroundUnderWisteriaText": "Sous la glycine",
"backgroundUnderWisteriaNotes": "Relaxez-vous sous la glycine.",
"backgroundSpringtimeShowerNotes": "Regardez une Douche de Printemps Florale.",
"backgroundUnderWisteriaText": "Sous la Glycine",
"backgroundUnderWisteriaNotes": "Relaxez-vous sous la Glycine.",
"backgrounds052023": "Ensemble 108 : sorti en mai 2023",
"backgroundCretaceousForestNotes": "Imprégnez-vous de l'ancienne verdure d'une forêt du crétacé.",
"backgroundCretaceousForestNotes": "Imprégnez-vous de l'ancienne verdure d'une Forêt du Crétacé.",
"backgrounds062023": "Ensemble 109 : sorti en juin 2023",
"backgroundInAnAquariumText": "Dans un aquarium",
"backgroundInAnAquariumNotes": "Nagez paisiblement avec les poissons dans un aquarium.",
"backgroundInsideAdventurersHideoutText": "Dans la cachette d'une aventurière",
"backgroundCraterLakeText": "Lac de cratère",
"backgroundCraterLakeNotes": "Admirez un magnifique lac de cratère.",
"backgroundLeafyTreeTunnelNotes": "Promenez-vous dans un tunnel d'arbre feuillu.",
"backgroundInAnAquariumText": "Dans un Aquarium",
"backgroundInAnAquariumNotes": "Nagez paisiblement avec les poissons Dans un Aquarium.",
"backgroundInsideAdventurersHideoutText": "Dans la Cachette de l'Aventurière",
"backgroundCraterLakeText": "Lac de Cratère",
"backgroundCraterLakeNotes": "Admirez un magnifique Lac de Cratère.",
"backgroundLeafyTreeTunnelNotes": "Promenez-vous dans le Tunnel de l'Arbre Feuillu.",
"backgroundCretaceousForestText": "Forêt du Crétacé",
"backgroundInsideAdventurersHideoutNotes": "Planifiez votre voyage dans la cachette d'une aventurière.",
"backgroundColorfulCoralText": "Corail coloré",
"backgroundRockGardenText": "Jardin de rocaille",
"backgroundRockGardenNotes": "Détendez-vous dans un jardin de rocaille.",
"backgroundInsideAdventurersHideoutNotes": "Planifiez votre voyage Dans la Cachette de l'Aventurière.",
"backgroundColorfulCoralText": "Coraux Colorés",
"backgroundRockGardenText": "Jardin de Rocaille",
"backgroundRockGardenNotes": "Détendez-vous dans un Jardin de Rocaille.",
"backgrounds072023": "Ensemble 110 : sorti Juillet 2023",
"backgroundColorfulCoralNotes": "Plongez parmi les coraux colorés.",
"backgroundColorfulCoralNotes": "Plongez parmi les Coraux Colorés.",
"backgrounds082023": "Ensemble 111 : sorti août 2023",
"backgroundBonsaiCollectionText": "Collection de bonsaïs",
"backgroundBonsaiCollectionNotes": "Admirez une magnifique collection de bonsaïs.",
"backgroundOnAPaddlewheelBoatText": "Sur un Bateau à roues à aubes",
"backgroundOnAPaddlewheelBoatNotes": "Voyage sur un Bateau à roues à aubes.",
"backgroundBoardwalkIntoSunsetText": "Promenade au Coucher de soleil",
"backgroundBonsaiCollectionText": "Collection de Bonsaïs",
"backgroundBonsaiCollectionNotes": "Admirez une magnifique Collection de Bonsaïs.",
"backgroundOnAPaddlewheelBoatText": "Sur un Bateau à Roues à Aubes",
"backgroundOnAPaddlewheelBoatNotes": "Voyage sur un Bateau à Roues à Aubes.",
"backgroundBoardwalkIntoSunsetText": "Promenade au Coucher du Soleil",
"backgroundDreamyIslandText": "Île de Rêve",
"backgroundDreamyIslandNotes": "Appréciez le décor d'une Île de Rêve.",
"backgroundBoardwalkIntoSunsetNotes": "Balade sur un Promenade au Coucher de soleil.",
"backgrounds092023": "Ensemble 112 : Sorti en Septembre 2023",
"backgroundBoardwalkIntoSunsetNotes": "Balade sur un Promenade au Coucher du Soleil.",
"backgrounds092023": "Ensemble 112 : sorti en Septembre 2023",
"backgroundMovingDayText": "Jour de Déménagement",
"backgroundMovingDayNotes": "Faites vos cartons pour le Jour du Déménagement.",
"backgroundCoveredBridgeInAutumnText": "Pont automnal couvert",
"backgroundCoveredBridgeInAutumnText": "Pont Couvert en Automne",
"backgroundCoveredBridgeInAutumnNotes": "Traverser un Pont Couvert en Automne.",
"backgroundBaobabForestText": "Forêt de Baobab",
"backgroundBaobabForestNotes": "Observez avec émerveillement la Forêt de Baobab.",
@@ -815,24 +815,24 @@
"backgroundMonstrousCaveText": "Cave Monstrueuse",
"backgroundMonstrousCaveNotes": "Plongez votre regard dans la gueule de la Cave Monstrueuse.",
"backgroundJackOLanternStacksText": "Tas de Citrouilles d'Halloween",
"backgrounds102023": "Ensemble 113 : Sortie Octobre 2023",
"backgrounds102023": "Ensemble 113 : sorti en octobre 2023",
"backgroundJackOLanternStacksNotes": "Admirez un champ de Tas de Citrouilles d'Halloween.",
"backgroundSpectralCandleRoomText": "Salle des Bougies Spectrales",
"backgroundGiantCatText": "Chat Géant",
"backgroundBarrelCellarText": "Cellier de Tonneaux",
"backgroundAutumnTreeTunnelText": "Tunnel d'Arbres d'Automne",
"backgroundAutumnTreeTunnelNotes": "Appréciez la beauté d'un Tunnel d'Arbres d'Automne.",
"backgrounds112023": "Ensemble 114 : Sorti en Novembre 2023",
"backgrounds112023": "Ensemble 114 : sorti en novembre 2023",
"backgroundGiantCatNotes": "Faites une sieste avec un Chat Géant.",
"backgroundBarrelCellarNotes": "Recherchez des délices culinaires dans un Cellier à Tonneaux.",
"backgroundHolidayTreeForestText": "Forêt de l'Arbre des Fêtes",
"backgroundHolidayTreeForestNotes": "Décorez un Arbre des Fêtes dans une Forêt.",
"backgroundHolidayTreeForestText": "Forêt de Sapins de Noël",
"backgroundHolidayTreeForestNotes": "Décorez un Sapin de Noël dans une Forêt.",
"backgroundIceSculptureFestivalText": "Festival de Sculpture de Glace",
"backgroundWinterFullMoonText": "Pleine Lune d'Hiver",
"backgroundWinterFullMoonText": "Pleine Lune Hivernale",
"backgroundWinterFullMoonNotes": "Admirez la Pleine Lune Hivernale.",
"backgrounds122023": "Ensemble 115 : Sorti en Décembre 2023",
"backgrounds122023": "Ensemble 115 : sorti en décembre 2023",
"backgroundIceSculptureFestivalNotes": "Visitez un Festival de Sculpture de Glace.",
"backgrounds012024": "Ensemble 116 : Sorti en Janvier 2024",
"backgrounds012024": "Ensemble 116 : sorti en janvier 2024",
"backgroundWinterMountainRangeText": "Chaîne de Montagne Hivernale",
"backgroundWinterMountainRangeNotes": "Escalader une Chaîne de Montagne Hivernale.",
"backgroundFrozenBluePondText": "Lagon Bleu Gelé",
@@ -842,45 +842,51 @@
"backgroundColorfulStreetText": "Rue Colorée",
"backgroundSwanBoatText": "Bateau-Cygne",
"backgroundSwanBoatNotes": "Faire une balade en Bateau-Cygne.",
"backgroundHeartTreeTunnelText": "Tunnel de l'Arbre Coeur",
"backgrounds022024": "SET 117 : Sorti en Février 2024",
"backgroundHeartTreeTunnelText": "Tunnel de l'Arbre Cœur",
"backgrounds022024": "Ensemble 117 : sorti en février 2024",
"backgroundColorfulStreetNotes": "En train de voir une Rue Colorée.",
"backgroundHeartTreeTunnelNotes": "Dériver au travers du Tunnel de l'Arbre Coeur.",
"backgrounds032024": "Ensemble 118 : Sortie Mars 2024",
"backgroundHeartTreeTunnelNotes": "Dériver au travers du Tunnel de l'Arbre Cœur.",
"backgrounds032024": "Ensemble 118 : sorti en mars 2024",
"backgroundFloweringForestText": "Forêt en Fleur",
"backgroundFloweringForestNotes": "Inspirez profondément le parfum d'un Forêt en Fleur.",
"backgroundRainyRainforestText": "Forêt Tropicale sous la Pluie",
"backgroundRainyRainforestNotes": "Appréciez une averse rafraîchissante dans une Forêt Tropicale sous la Pluie.",
"backgroundDogParkText": "Parc Canin",
"backgroundDogParkNotes": "Folâtrer gaiement au Parc Canin.",
"backgrounds042024": "Ensemble 119 : Sortie Avril 2024",
"backgroundForestSunsetText": "Crépuscule sur la Forêt",
"backgroundForestSunsetNotes": "Laissez-vous enchanter par la lueur de ce Crépuscule forestier.",
"backgrounds042024": "Ensemble 119 : sorti en avril 2024",
"backgroundForestSunsetText": "Crépuscule Forestier",
"backgroundForestSunsetNotes": "Laissez-vous enchanter par la lueur de ce Crépuscule Forestier.",
"backgroundWallFloweringVinesText": "Mur de Vignes en Fleur",
"backgroundWallFloweringVinesNotes": "Baladez-vous près d'un mur de Vignes en Fleur.",
"backgroundContainerGardenText": "Jardin de Cultivation",
"backgroundContainerGardenNotes": "Salissez-vous les mains dans ce Jardin de Cultivation.",
"backgroundDragonsBackText": "À dos de Dragon",
"backgroundDragonsBackNotes": "Parcourez les cieux sur le Dos d'un Dragon.",
"backgroundDragonsBackNotes": "Parcourez les cieux à Dos de Dragon.",
"backgroundMaypoleText": "Arbre de Mai",
"backgroundMaypoleNotes": "Dansez autour d'un bel Arbre de Mai.",
"backgroundPottersStudioNotes": "Créez des œuvres d'art dans le Studio de Poti·er·ère.",
"backgroundPottersStudioText": "Studio de Poti·er·ère",
"backgrounds052024": "Ensemble 120 : Sorti en Mai 2024",
"backgrounds062024": "Ensemble 121 : Sorti Juin 2024",
"backgrounds052024": "Ensemble 120 : sorti en mai 2024",
"backgrounds062024": "Ensemble 121 : sorti en juin 2024",
"backgroundShellGateText": "Portail de Coquillages",
"backgrounds072024": "Ensemble 122 : Sorti Juillet 2024",
"backgrounds072024": "Ensemble 122 : sorti en juillet 2024",
"backgroundRiverBottomText": "Fond de Rivière",
"backgroundRiverBottomNotes": "Explorez le Fond d'une Rivière.",
"monthlyBackgrounds": "Arrière-plans Mensuels",
"backgroundShellGateNotes": "Passez sous les coraux ornant un Portail de Coquillages.",
"backgrounds082024": "Ensemble 123 : Sorti Août 2024",
"backgrounds082024": "Ensemble 123 : sorti en août 2024",
"backgroundSavannaText": "Pâturage sous la Brume",
"backgroundSavannaNotes": "Randonnez à travers des Pâturages sous la Brume.",
"backgroundMagicDoorInForestText": "Porte Magique dans la Forêt",
"backgroundMagicDoorInForestNotes": "Osez franchir la Porte Magique pour entrer dans la Forêt.",
"backgrounds092024": "Ensemble 124 : Sortie septembre 2024",
"backgroundMagicDoorInForestNotes": "Osez franchir la Porte Magique dans la Forêt.",
"backgrounds092024": "Ensemble 124 : sorti en septembre 2024",
"backgroundSurroundedByGhostsText": "Entouré·e de Fantômes",
"backgrounds102024": "Ensemble 124 : Sortie Septembre 2024",
"backgroundSurroundedByGhostsNotes": "Passez une soirée Entouré·e de Fantômes qui vous donnera la chair de poule."
"backgrounds102024": "Ensemble 125 : sortie en octobre 2024",
"backgroundSurroundedByGhostsNotes": "Passez une soirée Entouré·e de Fantômes qui vous donneront la chair de poule.",
"backgrounds112024": "Ensemble 125 : sorti en novembre 2024",
"backgroundCastleHallWithHearthText": "Âtre dans le Hall du Château",
"backgroundCastleHallWithHearthNotes": "Prélassez-vous dans la chaleur de l'Âtre du le Hall du Château.",
"backgroundFirstSnowForestText": "Première Neige dans la Forêt",
"backgroundFirstSnowForestNotes": "Avancez sous la Première Neige dans la Forêt.",
"backgrounds122024": "Ensemble 127 : sorti en décembre 2024"
}
+3 -3
View File
@@ -386,9 +386,9 @@
"questEggCrabText": "Crabe",
"questEggCrabMountText": "Crabe",
"questEggCrabAdjective": "bouineux",
"questEggRaccoonText": "Raton Laveur",
"questEggRaccoonMountText": "Raton Laveur",
"questEggRaccoonAdjective": "vorace",
"questEggRaccoonText": "Raton laveur",
"questEggRaccoonMountText": "Raton laveur",
"questEggRaccoonAdjective": "un affamé",
"questEggDogText": "Chiot",
"questEggDogMountText": "Chien",
"questEggDogAdjective": "amical"
+56 -2
View File
@@ -1,6 +1,5 @@
{
"frequentlyAskedQuestions": "Questions fréquentes",
"webFaqAnswer7": "Au niveau 10, vous pourrez choisir de devenir un Guerrier, un Mage, un Voleur ou un Guérisseur. (Tous les joueurs commencent comme Guerrier par défaut.) Chaque classe a différentes options d'équipement, différentes compétences qu'elles peuvent utiliser après le niveau 11, et différents avantages. Les guerriers peuvent facilement infliger des dégâts aux boss, supportent plus de dégâts de leurs tâches et rendent leur équipe plus forte. Les mages peuvent aussi facilement infliger des dégâts aux boss, ainsi que gagner rapidement des niveaux et rendre du mana à leur équipe. Les voleurs gagnent le plus d'or et trouvent le plus de butin, et ils peuvent aider leur équipe à faire pareil. Enfin, les guérisseurs peuvent se soigner et soigner les membres de leur équipe. Si vous ne voulez pas immédiatement choisir une classe par exemple, pour faire en sorte de d'abord recueillir tout l'équipement de votre classe actuelle vous pouvez cliquer sur \"Ne pas choisir\" et reprendre le choix plus tard dans les paramètres.",
"iosFaqStillNeedHelp": "Si vous avez une question qui n'est pas dans cette liste ou dans la [FAQ du Wiki](https://habitica.fandom.com/fr/wiki/FAQ), utilisez le formulaire \"Poser une question\"[LINK NEEDED]! Nous serons ravi·e·s de vous aider.",
"androidFaqStillNeedHelp": "Si vous avez une question qui n'est pas dans cette liste ni dans la [FAQ du Wiki](https://habitica.fandom.com/fr/wiki/FAQ), utilisez le formulaire Poser une Question [LINK NEEDED] ! Nous serons heureux de vous aider.",
"webFaqStillNeedHelp": "Si vous avez une question qui n'est traitée ni ici, ni dans la [FAQ du wiki](https://habitica.fandom.com/fr/wiki/FAQ), utilisez le formulaire \"Poser une question\" [LINK NEEDED]! Nous serons ravi·e·s de pouvoir vous aider.",
@@ -187,5 +186,60 @@
"contentAnswer62": "Les Potions Magiques d'Éclosion de la St. Valentin apparaîtront désormais dans le planning mensuel.",
"contentAnswer51": "Les Personnalisations que vous possédez (de base et acquises) seront disponibles depuis le menu de Personnalisation d'Avatar actuel.",
"contentAnswer70": "Les Arrière-Plans, Quêtes, Familiers et Montures présents dans la Boutique des Voyageu·r·se·s Temporel·le·s resteront disponibles tout au long de l'année.",
"contentFaqPara3": "Si vous avez des questions auxquelles vous n'avez pas trouvé de réponse ci-dessus, vous pouvez contacter notre équipe à <%= mailto %> ! Nous sommes très enthousiastes de voir ce nouveau planning de contenu apparaître et avons hâte de développer toujours plus de projets qui permettront à Habitica de s'améliorer pour tou·te·s les joueu·r·se·s."
"contentFaqPara3": "Si vous avez des questions auxquelles vous n'avez pas trouvé de réponse ci-dessus, vous pouvez contacter notre équipe à <%= mailto %> ! Nous sommes très enthousiastes de voir ce nouveau planning de contenu apparaître et avons hâte de développer toujours plus de projets qui permettront à Habitica de s'améliorer pour tou·te·s les joueu·r·se·s.",
"subscriptionHeading0": "Changements liés aux Sabliers Mystiques",
"subscriptionHeading1": "Changements liés aux Gemmes d'Abonnement",
"subscriptionHeading2": "Pourquoi effectuons-nous ces changements ?",
"subscriptionBenefitsAdjustments": "Ajustements des Avantages Abonnement",
"subscriptionBenefitsFaqTitle": "FAQ Ajustements des Avantages Abonnement",
"subscriptionDetail000": "Être abonné·e durant 12 mois vous fera gagner 12 Sabliers Mystiques à la place de 4 précédemment.",
"subscriptionDetail002": "Les abonné·e·s n'auront plus besoin d'attendre jusqu'au mois suivant leur paiement récurrent pour recevoir des Sabliers Mystiques.",
"subscriptionDetail003": "Tou·te·s les nouveau·elle·s abonné·e·s recevront un Sablier Mystique immédiatement après leur achat. Cela comptera comme la livraison de Sablier Mystique du mois actuel.",
"subscriptionDetail01": "Les nouvel·le·s abonné·e·s d'abonnements récurrents de 12 mois recevront un bonus initial unique de 12 Sabliers Mystiques supplémentaires lors de l'achat.",
"subscriptionDetail010": "Ce sera en addition du Sablier Mystique mensuel que tou·te·s abonné·e·s reçoivent après leur achat initial.",
"subscriptionDetail011": "Les joueu·r·se·s qui ont actuellement un abonnement récurrent de 12 mois actif recevront ce bonus le jour où ces changements auront lieu.",
"subscriptionDetail012": "Ce bonus ne s'applique pas aux abonnements offerts.",
"subscriptionDetail10": "La quantité de Gemmes que les abonné·e·s peuvent acheter avec de l'Or au Marché va augmenter de 2 chaque mois qu'il·elle·s auront les avantages jusqu'à atteindre un maximum de 50.",
"subscriptionDetail100": "Les nouveaux abonnements de 1, 3 et 6 mois commenceront maintenant à 24 Gemmes par mois et cette valeur augmentera chaque mois où il·elle·s auront les avantages.",
"subscriptionDetail101": "Les joueu·r·se·s ayant actuellement un nombre impair de Gemmes par mois verront leur limite de Gemmes être arrondie au nombre pair le plus proche.",
"subscriptionDetail11": "La quantité de Gemmes que vous pouvez acheter chaque mois avec de l'Or ne sera plus réinitialisée si votre abonnement prend fin.",
"subscriptionDetail001": "Tou·te·s les abonné·e·s recevront des Sabliers Mystiques de la même manière, correspondant au calendrier de sortie mensuel des Ensembles d'Équipements Mystère.",
"subscriptionDetail110": "Si vous augmentez la quantité de Gemmes que vous pouvez acheter chaque mois puis annulez votre abonnement, vous pourrez sélectionner à nouveau la même quantité n'importe quand à l'avenir, même si vous achetez un palier d'abonnement inférieur.",
"subscriptionDetail20": "Sous la structure actuelle, il peut être difficile de comprendre combien de Sabliers Mystiques vous allez recevoir et quand.",
"subscriptionDetail21": "Les quatre paliers d'abonnement posaient problème lorsqu'un·e joueu·r·euse passait à un palier supérieur ou inférieur.",
"subscriptionDetail22": "Les abonnements offerts et récurrents ont eu des expériences et des règles contradictoires concernant leurs bénéfices que nous voulions simplifier.",
"subscriptionDetail24": "Nous souhaitions que les abonné·e·s aient plus que quatre chances par an de collecter des items de la boutique des Voyageurs Temporels.",
"subscriptionHeading3": "Récompenses du jour de sortie",
"subscriptionPara1": "Pour faciliter la transition vers le nouveau calendrier, les abonné·e·s existant·e·s peuvent s'attendre à quelques avantages supplémentaires le jour de la sortie. Nous tenons à vous remercier sincèrement pour votre soutien continu tout au long de ce changement !",
"subscriptionDetail32": "Les joueu·r·se·s disposant d'abonnements récurrents de 12 mois recevront le bonus de 12 Sabliers Mystiques mentionné ci-dessus et 20 Gemmes.",
"subscriptionDetail33": "Pour recevoir ces récompenses, votre compte doit avoir un abonnement récurrent actif avant le 19 novembre.",
"subscriptionDetail40": "Je suis un·e abonné·e, quand recevrai-je mon premier Sablier Mystique et ma limite de Gemmes augmentée du nouveau calendrier ?",
"subscriptionDetail400": "Pour les abonné·e·s actuel·le·s, vous obtiendrez votre premier Sablier Mystique et +2 Gemmes ajoutées à votre limite mensuelle lors de votre première connexion du mois suivant la sortie. Cela signifie que si vous vous êtes déjà connecté·e en novembre, votre première augmentation régulière se produira en décembre.",
"subscriptionDetail41": "Le prix des abonnements va-t-il changer lors de cette sortie ?",
"subscriptionDetail410": "Ces changements naffecteront pas le prix actuel des abonnements.",
"subscriptionDetail43": "Si je m'inscris à un abonnement récurrent puis que je l'annule, est-ce que je bénéficierai toujours des avantages ?",
"subscriptionDetail44": "Je suis déjà abonné·e, combien de Gemmes aurai-je de disponibles au Marché chaque mois après le changement ?",
"subscriptionDetail440": "Le jour où ces changements entreront en vigueur, les abonné·e·s actuel·le·s disposant d'un nombre impair de Gemmes par mois verront ces ajustements à leur limite de Gemmes :",
"subscriptionDetail4400": "Si vous avez actuellement débloqué <%= initialNumber %> Gemmes par mois, vous aurez <%= roundedNumber %> Gemmes.",
"subscriptionDetail45": "Est-ce que acheter des abonnements offerts supplémentaires me permettra-t-il d'obtenir plus de Sabliers Mystiques ou une limite de Gemmes plus élevée plus rapidement ?",
"subscriptionDetail450": "Étant donné que les Sabliers Mystiques et l'augmentation de la limite de Gemmes sont désormais un avantage mensuel, l'achat de plusieurs abonnements offerts ne donnera pas plus d'avantages à la fois.",
"subscriptionDetail46": "Si j'avais un abonnement dans le passé, puis-je débloquer mon ancienne limite de Gemmes si je me réabonne maintenant ?",
"subscriptionDetail460": "Puisque la quantité de Gemmes que vous pouviez acheter était réinitialisée chaque mois lorsque vos avantages étaient épuisés, les joueu·r·se·s dont les avantages d'abonnement ont expiré devront prendre un nouveau départ dans le cadre de ce nouveau système.",
"subscriptionDetail47": "J'ai un abonnement à une Offre de Groupe, comment cela m'affecte-t-il ?",
"subscriptionPara0": "Nous rendons les abonnements à Habitica mieux que jamais avec encore plus de Sabliers Mystiques et de Gemmes ! Ces changements permettent de comprendre beaucoup plus facilement les avantages de l'abonnement.",
"subscriptionDetail00": "Tout·e·s abonné·e·s, incluant celles et ceux qui se sont vus offerts un abonnement, recevront 1 Sablier Mystique au début de chaque mois où il·elle·s auront les avantages.",
"subscriptionDetail102": "Les nouveaux abonnements de 12 mois commenceront immédiatement à la quantité maximum de Gemmes par mois, 50 Gemmes à la place de 45 précédemment.",
"subscriptionDetail23": "Donner un Sablier Mystique par mois permet aux abonné·e·s de profiter des objets rotatifs de la boutique des Voyageurs temporels.",
"subscriptionDetail25": "Nous comprenons que les finances changent et nous ne voulions pas punir les abonné·e·s d'abonnements expirés en leur reprennant les avantages perçus.",
"subscriptionDetail30": "Les joueu·r·se·s disposant d'un abonnement récurrent d'1 mois ou d'une Offre de Groupe recevront 2 Sabliers Mystiques et 20 Gemmes.",
"subscriptionDetail31": "Les joueu·r·se·s disposant d'abonnements récurrents de 3 ou 6 mois recevront 4 Sabliers Mystiques et 20 Gemmes.",
"subscriptionDetail42": "Si je ne me connecte pas pendant un mois alors que je suis abonné·e, est-ce que je vais manquer ces avantages ?",
"subscriptionDetail430": "L'annulation d'un abonnement récurrent définira une date de résiliation pour tes avantages, mais vous aurez toujours un accès complet à tous les avantages de votre abonnement avant cette date. Cela signifie que vous continuerez à recevoir vos Sabliers Mystiques mensuels et vos augmentations de limite de Gemmes au début de chaque mois d'abonnement.",
"subscriptionDetail420": "Tout comme pour les Ensembles d'Équipements Mystère, vous ne manquerez aucun Sablier Mystique ni augmentation de Limite de Gemmes si vous ne vous connectez pas en étant abonné·e. La prochaine fois que vous vous connecterez, vous recevrez tous les avantages dus pour chaque mois d'abonnement.",
"subscriptionDetail451": "Chaque abonnement offert augmentera le nombre de mois pendant lesquels un·e joueu·r·se bénéficie des avantages de l'abonnement, lui permettant de continuer à recevoir plus de Sabliers Mystiques et d'augmenter sa limite de Gemmes chaque mois qui passe.",
"subscriptionDetail48": "Y aura-t-il d'autres changements aux avantages d'abonnements, comme les Ensembles d'Équipement Mystère ?",
"subscriptionDetail480": "Ces changements n'affecteront que les Sabliers Mystiques et les Gemmes d'abonnement. Les autres avantages ne changeront pas.",
"subscriptionPara2": "Si vous avez d'autres questions que celles évoquées ci-dessus, vous pouvez contacter notre équipe à l'adresse <%= mailto %>.",
"subscriptionPara3": "Nous espérons que ce nouveau calendrier permettra une meilleure anticipation, ainsi qu'un plus grand accès au stock fabuleux de la Boutique des Voyageu·r·se·s Temporel·le·s, et encouragera toujours plus la motivation de faire des progrès sur vos tâches chaque mois !",
"subscriptionDetail470": "Les avantages liés aux Offres de Groupe ne changeront pas pour les abonnements récurrents d'1 mois. Vous recevrez un Sablier Mystique au début de chaque mois et le nombre de Gemmes que vous pourrez acheter tous les mois au Marché augmentera de 2 jusqu'à atteindre la limite de 50."
}
+12 -2
View File
@@ -2714,7 +2714,7 @@
"shieldSpecialFall2022WarriorNotes": "DES BONBONS OU DES GROAR ! Augmente la constitution de <%= con %>. Objet en édition limitée de l'automne 2022.",
"shieldSpecialFall2022HealerText": "Œil gauche du voyeur",
"shieldSpecialFall2022HealerNotes": "Deuxième œil, regardez ce costume et tremblez. Augmente la constitution de <%= con %>. Objet en édition limitée de l'automne 2022.",
"eyewearArmoireJewelersEyeLoupeNotes": "Cette loupe oculaire magnifie ce sur quoi vous travaillez pour que vous puissiez en voir tous les détails. Augmente la perception de <%= per %>. Armoire enchantée : ensemble de bijouterie (objet 2 de 4).",
"eyewearArmoireJewelersEyeLoupeNotes": "Cette loupe oculaire grossit ce sur quoi vous travaillez pour que vous puissiez en voir tous les détails. Augmente la perception de <%= per %>. Armoire enchantée : ensemble de bijouterie (objet 2 sur 4).",
"eyewearArmoireTragedyMaskNotes": "Hélas ! Voici un lourd masque pour ton pauvre avatar, qui se pavane, s'agite et exprime le malheur et la tristesse sur la scène. Augmente l'intelligence de <%= int %>. Armoire enchantée : ensemble de masques de théâtre (objet 2 de 2).",
"eyewearArmoireJewelersEyeLoupeText": "Loupe oculaire de joaillerie",
"headSpecialWinter2023RogueNotes": "Les tentations des gens de vous \"déballer\" les cheveux vous donneront des occasions de pratiquer vos esquives. Augmente la perception de <%= per %>. Équipement en édition limitée de l'hiver 2022-2023.",
@@ -3199,5 +3199,15 @@
"backMystery202410Text": "Queue Candy Corn",
"backMystery202410Notes": "Cette queue se redresse en entendant parler de friandises effrayantes. Ne confère aucun bonus. Équipement d'Abonnement Octobre 2024.",
"headAccessoryMystery202410Text": "Oreilles Candy Corn",
"headAccessoryMystery202410Notes": "Serait-ce le son de farceu·r·se·s costumé·e·s à votre porte ? Ne confère aucun bonus. Équipement d'Abonnement Octobre 2024."
"headAccessoryMystery202410Notes": "Serait-ce le son de farceu·r·se·s costumé·e·s à votre porte ? Ne confère aucun bonus. Équipement d'Abonnement Octobre 2024.",
"weaponArmoireStormKnightAxeText": "Hache du Chevalier de la Tempête",
"armorArmoireStormKnightArmorText": "Armure du Chevalier de la Tempête",
"armorArmoireStormKnightArmorNotes": "Dans cette armure, vous êtes quasi invincible. Vos ennemi·e·s ne verront jamais la fin de la tempête. Augmente la Perception de <%= per %>. Armoire Enchantée : Ensemble Chevalier de la Tempête (Objet 3 sur 3)",
"weaponArmoireStormKnightAxeNotes": "Accumulez votre furie et faites éclater votre coup comme du tonnerre ! Augmente la Force de <%= str %>. Armoire Enchantée : Ensemble Chevalier de la Tempête. (Objet 3 sur 3)",
"headMystery202411Notes": "Ce heaume va sacrément intimider vos tâches quand vous foncerez dedans la tête la première ! Ne confère aucun bonus. Équipement d'Abonnement Novembre 2024.",
"headArmoireStormKnightHelmNotes": "Domptez les éclairs grâce à ces ramures électrisantes. Augmente la Constitution de <%= con %>. Armoire Enchantée : Ensemble Chevalier de la Tempête (Objet 1 sur 3)",
"bodyMystery202411Notes": "Les piquants impressionnants de ces épaulières sont parfaits pour foncer tête baissée dans votre liste de choses à faires. Ne confère aucun bonus. Équipement d'abonnement Novembre 2024.",
"headMystery202411Text": "Heaume Hérissé",
"headArmoireStormKnightHelmText": "Heaume du Chevalier de la Tempête",
"bodyMystery202411Text": "Épaulières Hérissées"
}
+1 -1
View File
@@ -117,7 +117,7 @@
"paymentAutoRenew": "Cet abonnement se renouvellera automatiquement jusqu'à son annulation. Si vous devez annuler cet abonnement, vous pouvez le faire depuis les paramètres.",
"paymentCanceledDisputes": "Nous avons envoyé la confirmation d'annulation à votre adresse email. Si vous ne recevez pas cet email, veuillez nous contacter pour éviter de futurs problèmes de facturation.",
"cannotUnpinItem": "Cet objet ne peut pas être désépinglé.",
"paymentSubBillingWithMethod": "Votre abonnement sera facturé <strong><%= amount %></strong> tous les <strong><%= months %> mois</strong> via <strong><%= paymentMethod %></strong>.",
"paymentSubBillingWithMethod": "Votre abonnement sera facturé<br><strong>$<%= amount %>.00 USD</strong> tous les <strong><%= months %> mois</strong> via <strong><%= paymentMethod %></strong>.",
"invalidUnlockSet": "Cet ensemble d'objets est invalide et ne peux être débloqué.",
"nMonthsSubscriptionGift": "<%= nMonths %> mois d'abonnement (cadeau)",
"nGemsGift": "<%= nGems %> gemmes (cadeau)",

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