Compare commits

..

64 Commits

Author SHA1 Message Date
Hafiz 08ff95d015 Challenge participants spacing & text sizing fix 2025-08-06 12:15:43 -05:00
Hafiz ec91b674f1 g1g1 width auto sizing w/padding 2025-08-06 11:33:38 -05:00
Fiz ae4130b108 Add backend support for Hydra mount (#15482)
* chore: update time travelers shop to display seasonal backgrounds

* chore: update time travelers banner (note CSS borken rn)

* chore: fix borken CSS and update logic in shop

* chore: added isSubscribed function, not working

* chore: isSubscribed working but no bg for subscribers

* chore: logic and css updates

* chore: update habitica-images

* chore: add check for trinket

* chore: more time traveler shop logicking

* Add backend support for Hydra mount

- Add Dragon-Hydra to special mounts in stable.js
  - Configure as contributor level 7 reward with canFind: true
  - Add GIF format support for mount sprites
  - Enable admin panel granting capability

* Fix Vue template errors in timeTravelers component

* Fix duplicate template block in timeTravelers component

* add CSS for Hydra mount GIF sprites

Added CSS rules for Mount_Head_Dragon-Hydra and Mount_Body_Dragon-Hydra GIF sprites

* Remove the separate Hydra mount dimension declaration

---------

Co-authored-by: CuriousMagpie <eilatan@gmail.com>
2025-08-05 15:12:44 -05:00
Kalista Payne ad0614282e 5.38.1 2025-08-05 14:31:05 -05:00
Weblate 5a7704aed7 Translated using Weblate (Chinese (Traditional))
Currently translated at 17.1% (42 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 16.7% (41 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 16.3% (40 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Japanese)

Currently translated at 98.8% (425 of 430 strings)

Translated using Weblate (French)

Currently translated at 99.4% (184 of 185 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 15.9% (39 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (268 of 268 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3385 of 3385 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (3379 of 3385 strings)

Translated using Weblate (Polish)

Currently translated at 95.5% (128 of 134 strings)

Translated using Weblate (Japanese)

Currently translated at 94.7% (254 of 268 strings)

Translated using Weblate (Polish)

Currently translated at 94.0% (126 of 134 strings)

Translated using Weblate (Japanese)

Currently translated at 98.6% (424 of 430 strings)

Translated using Weblate (Japanese)

Currently translated at 98.3% (423 of 430 strings)

Translated using Weblate (Japanese)

Currently translated at 92.5% (798 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 92.4% (797 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 90.6% (781 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 91.9% (3112 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 91.9% (3111 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 94.0% (174 of 185 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 15.5% (38 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 91.6% (3104 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 93.5% (173 of 185 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (279 of 280 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Japanese)

Currently translated at 89.2% (769 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Japanese)

Currently translated at 94.4% (253 of 268 strings)

Translated using Weblate (Japanese)

Currently translated at 91.8% (170 of 185 strings)

Translated using Weblate (Japanese)

Currently translated at 97.9% (421 of 430 strings)

Translated using Weblate (Japanese)

Currently translated at 91.6% (3104 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 93.6% (251 of 268 strings)

Translated using Weblate (Japanese)

Currently translated at 90.8% (168 of 185 strings)

Translated using Weblate (Japanese)

Currently translated at 82.4% (202 of 245 strings)

Translated using Weblate (French)

Currently translated at 100.0% (268 of 268 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3385 of 3385 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 15.1% (37 of 245 strings)

Translated using Weblate (French)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Japanese)

Currently translated at 91.3% (3092 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 92.5% (248 of 268 strings)

Translated using Weblate (Japanese)

Currently translated at 92.5% (248 of 268 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Korean)

Currently translated at 22.8% (56 of 245 strings)

Translated using Weblate (Korean)

Currently translated at 47.7% (128 of 268 strings)

Translated using Weblate (Croatian)

Currently translated at 45.1% (121 of 268 strings)

Translated using Weblate (Korean)

Currently translated at 71.9% (620 of 862 strings)

Translated using Weblate (Croatian)

Currently translated at 70.6% (609 of 862 strings)

Translated using Weblate (Croatian)

Currently translated at 75.0% (6 of 8 strings)

Translated using Weblate (Korean)

Currently translated at 67.6% (291 of 430 strings)

Translated using Weblate (Korean)

Currently translated at 52.8% (1788 of 3385 strings)

Translated using Weblate (Croatian)

Currently translated at 50.3% (1706 of 3385 strings)

Translated using Weblate (Croatian)

Currently translated at 51.7% (134 of 259 strings)

Translated using Weblate (Czech)

Currently translated at 92.8% (130 of 140 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 86.9% (233 of 268 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Danish)

Currently translated at 92.1% (105 of 114 strings)

Translated using Weblate (Czech)

Currently translated at 89.4% (102 of 114 strings)

Translated using Weblate (Czech)

Currently translated at 83.5% (112 of 134 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 71.6% (308 of 430 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Serbian)

Currently translated at 84.4% (49 of 58 strings)

Translated using Weblate (Bulgarian)

Currently translated at 51.4% (144 of 280 strings)

Translated using Weblate (Swedish)

Currently translated at 66.5% (286 of 430 strings)

Translated using Weblate (Serbian)

Currently translated at 65.5% (282 of 430 strings)

Translated using Weblate (Slovak)

Currently translated at 65.5% (282 of 430 strings)

Translated using Weblate (Romanian)

Currently translated at 66.7% (287 of 430 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Danish)

Currently translated at 66.0% (284 of 430 strings)

Translated using Weblate (Czech)

Currently translated at 69.7% (300 of 430 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (3377 of 3385 strings)

Translated using Weblate (Swedish)

Currently translated at 54.1% (1834 of 3385 strings)

Translated using Weblate (Serbian)

Currently translated at 50.6% (1714 of 3385 strings)

Translated using Weblate (Slovak)

Currently translated at 50.0% (1695 of 3385 strings)

Translated using Weblate (Romanian)

Currently translated at 60.5% (2050 of 3385 strings)

Translated using Weblate (Hebrew)

Currently translated at 38.4% (1301 of 3385 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3385 of 3385 strings)

Translated using Weblate (Danish)

Currently translated at 54.0% (1829 of 3385 strings)

Translated using Weblate (Czech)

Currently translated at 59.6% (2020 of 3385 strings)

Translated using Weblate (Swedish)

Currently translated at 75.6% (140 of 185 strings)

Translated using Weblate (Serbian)

Currently translated at 73.5% (136 of 185 strings)

Translated using Weblate (Slovak)

Currently translated at 84.8% (157 of 185 strings)

Translated using Weblate (Romanian)

Currently translated at 78.9% (146 of 185 strings)

Translated using Weblate (Portuguese)

Currently translated at 82.1% (152 of 185 strings)

Translated using Weblate (Italian)

Currently translated at 91.8% (170 of 185 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Danish)

Currently translated at 77.2% (143 of 185 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.7% (242 of 245 strings)

Translated using Weblate (Czech)

Currently translated at 75.1% (139 of 185 strings)

Translated using Weblate (Bulgarian)

Currently translated at 74.5% (138 of 185 strings)

Translated using Weblate (Czech)

Currently translated at 8.1% (20 of 245 strings)

Translated using Weblate (Swedish)

Currently translated at 72.0% (621 of 862 strings)

Translated using Weblate (Serbian)

Currently translated at 65.1% (562 of 862 strings)

Translated using Weblate (Slovak)

Currently translated at 66.9% (577 of 862 strings)

Translated using Weblate (Romanian)

Currently translated at 77.7% (670 of 862 strings)

Translated using Weblate (Portuguese)

Currently translated at 70.0% (604 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 67.1% (579 of 862 strings)

Translated using Weblate (Italian)

Currently translated at 86.8% (749 of 862 strings)

Translated using Weblate (Indonesian)

Currently translated at 86.0% (742 of 862 strings)

Translated using Weblate (Hebrew)

Currently translated at 66.1% (570 of 862 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.0% (845 of 862 strings)

Translated using Weblate (Danish)

Currently translated at 69.9% (603 of 862 strings)

Translated using Weblate (Czech)

Currently translated at 69.7% (601 of 862 strings)

Translated using Weblate (Bulgarian)

Currently translated at 66.3% (572 of 862 strings)

Translated using Weblate (Serbian)

Currently translated at 74.0% (305 of 412 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Danish)

Currently translated at 90.0% (371 of 412 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Swedish)

Currently translated at 53.6% (139 of 259 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Danish)

Currently translated at 62.1% (161 of 259 strings)

Translated using Weblate (Bulgarian)

Currently translated at 54.0% (140 of 259 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 82.8% (222 of 268 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 99.4% (184 of 185 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.3% (241 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 91.3% (3092 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 88.4% (237 of 268 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Japanese)

Currently translated at 82.4% (202 of 245 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Japanese)

Currently translated at 87.3% (234 of 268 strings)

Translated using Weblate (Japanese)

Currently translated at 86.4% (160 of 185 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (913 of 914 strings)

Translated using Weblate (German)

Currently translated at 100.0% (268 of 268 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (German)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (German)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (German)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (German)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3385 of 3385 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (268 of 268 strings)

Translated using Weblate (Russian)

Currently translated at 88.5% (248 of 280 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (3379 of 3385 strings)

Translated using Weblate (German)

Currently translated at 100.0% (862 of 862 strings)

Co-authored-by: Ayaka Booker <ayakabooker@gmail.com>
Co-authored-by: Chaotic Lawful <habitica@eusebius.fr>
Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
Co-authored-by: Lio Zam <zerofux@web.de>
Co-authored-by: Mika <isekai.chr@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Vera <verasmolinap@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Zhi Hao Li <zhihaoli000@gmail.com>
Co-authored-by: Zuz Q <zuzannakunik@gmail.com>
Co-authored-by: innnko <ayakabooker@gmail.com>
Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
Co-authored-by: 潘致翰 <happyq0908@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
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/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/da/
Translate-URL: https://translate.habitica.com/projects/habitica/content/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/death/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/front/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/front/da/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/it/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/da/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
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/gear/he/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ro/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/da/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ro/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/da/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/da/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ro/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/da/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/en_GB/
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/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/cs/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2025-08-05 13:02:45 +02:00
Fiz 2feadd6125 Merge pull request #15483 from HabitRPG/kalista/category-content
Add Challenge categories to content API
2025-07-31 12:38:01 -05:00
Kalista Payne efe0b3cd9e 5.38.0 2025-07-28 14:15:00 -05:00
Kalista Payne 96731da380 5.37.3 2025-07-28 14:06:45 -05:00
Weblate 0c5dd5d8b5 Merge branch 'origin/develop' into Weblate. 2025-07-28 21:03:29 +02:00
Weblate 2f943a22e6 Translated using Weblate (German)
Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (German)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (German)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (German)

Currently translated at 98.6% (850 of 862 strings)

Translated using Weblate (German)

Currently translated at 99.8% (3373 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.8% (3373 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.8% (3373 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.5% (3361 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.5% (3361 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.5% (3361 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.4% (3360 of 3377 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (185 of 185 strings)

Translated using Weblate (Polish)

Currently translated at 67.1% (579 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 67.1% (579 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (German)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (German)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (German)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (German)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 14.2% (35 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 13.8% (34 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 13.0% (32 of 245 strings)

Translated using Weblate (Hebrew)

Currently translated at 2.0% (5 of 245 strings)

Translated using Weblate (Hebrew)

Currently translated at 66.1% (570 of 862 strings)

Translated using Weblate (Portuguese)

Currently translated at 54.1% (1830 of 3377 strings)

Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
Co-authored-by: Remigiusz Haziak <haziakremigiusz@gmail.com>
Co-authored-by: Uwe B <hbtca@tunixgut.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Wellinton Cardoso <wmcardoso1@hotmail.com>
Co-authored-by: cloudzzy <truskawka412@gmail.com>
Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/de/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/he/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Npc
Translation: Habitica/Questscontent
2025-07-28 21:03:17 +02:00
Phillip Thelen 666184d7e4 Fix 500 when deleting a very old group plan account (#15481) 2025-07-28 09:50:38 -05:00
Phillip Thelen 17d22dda3f enforce x-client header (#15476) 2025-07-22 14:00:51 -05:00
Natalie d1a18c121d August 2025 Content Build (#15460)
* chore: 2025-08 content build

* chore: fix typos

* fix(string): degender the news

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-07-21 17:59:40 -05:00
Kalista Payne 836d7f3991 5.37.2 2025-07-21 09:01:59 -05:00
Weblate ace9c3c46a Translated using Weblate (English (United Kingdom))
Currently translated at 82.7% (221 of 267 strings)

Translated using Weblate (Polish)

Currently translated at 67.0% (578 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 67.0% (578 of 862 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 62.6% (57 of 91 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 71.4% (185 of 259 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 69.1% (179 of 259 strings)

Translated using Weblate (German)

Currently translated at 98.3% (181 of 184 strings)

Translated using Weblate (German)

Currently translated at 98.9% (191 of 193 strings)

Translated using Weblate (German)

Currently translated at 99.3% (3354 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.3% (3354 of 3377 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Japanese)

Currently translated at 89.0% (768 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 12.6% (31 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 12.6% (31 of 245 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.3% (181 of 184 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 78.7% (193 of 245 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 96.7% (237 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 86.8% (749 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 99.3% (905 of 911 strings)

Translated using Weblate (German)

Currently translated at 99.2% (3352 of 3377 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 12.2% (30 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 82.0% (201 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.2% (3350 of 3377 strings)

Translated using Weblate (Russian)

Currently translated at 88.9% (2994 of 3367 strings)

Translated using Weblate (Russian)

Currently translated at 88.8% (2991 of 3367 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 67.5% (175 of 259 strings)

Translated using Weblate (German)

Currently translated at 99.1% (3348 of 3377 strings)

Translated using Weblate (Japanese)

Currently translated at 85.8% (158 of 184 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Japanese)

Currently translated at 81.6% (200 of 245 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 86.3% (787 of 911 strings)

Translated using Weblate (Japanese)

Currently translated at 79.1% (194 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 88.9% (767 of 862 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3346 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3346 of 3377 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 94.6% (390 of 412 strings)

Translated using Weblate (Japanese)

Currently translated at 91.5% (3090 of 3377 strings)

Translated using Weblate (Japanese)

Currently translated at 85.3% (228 of 267 strings)

Translated using Weblate (Japanese)

Currently translated at 88.8% (766 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Japanese)

Currently translated at 77.5% (190 of 245 strings)

Translated using Weblate (Ukrainian)

Currently translated at 87.6% (234 of 267 strings)

Translated using Weblate (Ukrainian)

Currently translated at 57.6% (1946 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3345 of 3377 strings)

Translated using Weblate (German)

Currently translated at 98.3% (181 of 184 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3345 of 3377 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3345 of 3377 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.3% (427 of 430 strings)

Translated using Weblate (Polish)

Currently translated at 32.6% (80 of 245 strings)

Translated using Weblate (Ukrainian)

Currently translated at 87.6% (234 of 267 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.6% (266 of 267 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.6% (266 of 267 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (845 of 845 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Ukrainian)

Currently translated at 98.8% (425 of 430 strings)

Translated using Weblate (Ukrainian)

Currently translated at 57.6% (1946 of 3377 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.8% (107 of 114 strings)

Translated using Weblate (Ukrainian)

Currently translated at 57.5% (1944 of 3377 strings)

Translated using Weblate (Polish)

Currently translated at 66.8% (576 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 59.3% (54 of 91 strings)

Translated using Weblate (Polish)

Currently translated at 89.8% (240 of 267 strings)

Translated using Weblate (Polish)

Currently translated at 87.4% (376 of 430 strings)

Translated using Weblate (Polish)

Currently translated at 52.3% (1769 of 3377 strings)

Translated using Weblate (Ukrainian)

Currently translated at 55.9% (137 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 28.5% (70 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 66.8% (576 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 59.3% (54 of 91 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Polish)

Currently translated at 96.4% (110 of 114 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.6% (258 of 259 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 91.8% (395 of 430 strings)

Translated using Weblate (German)

Currently translated at 98.9% (3343 of 3377 strings)

Translated using Weblate (Ukrainian)

Currently translated at 55.5% (136 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 58.2% (53 of 91 strings)

Translated using Weblate (Korean)

Currently translated at 80.1% (730 of 911 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Polish)

Currently translated at 88.4% (229 of 259 strings)

Translated using Weblate (Polish)

Currently translated at 97.3% (401 of 412 strings)

Translated using Weblate (Polish)

Currently translated at 85.3% (221 of 259 strings)

Translated using Weblate (German)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (German)

Currently translated at 99.7% (909 of 911 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 87.5% (798 of 911 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Swedish)

Currently translated at 4.8% (12 of 245 strings)

Translated using Weblate (Swedish)

Currently translated at 1.2% (3 of 245 strings)

Translated using Weblate (Swedish)

Currently translated at 94.6% (53 of 56 strings)

Translated using Weblate (Swedish)

Currently translated at 77.6% (104 of 134 strings)

Translated using Weblate (Swedish)

Currently translated at 86.2% (50 of 58 strings)

Translated using Weblate (Swedish)

Currently translated at 66.5% (286 of 430 strings)

Translated using Weblate (Swedish)

Currently translated at 81.8% (199 of 243 strings)

Translated using Weblate (Swedish)

Currently translated at 51.6% (47 of 91 strings)

Translated using Weblate (Swedish)

Currently translated at 91.4% (43 of 47 strings)

Translated using Weblate (Swedish)

Currently translated at 66.2% (285 of 430 strings)

Translated using Weblate (Swedish)

Currently translated at 76.0% (140 of 184 strings)

Translated using Weblate (Swedish)

Currently translated at 53.6% (139 of 259 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hebrew)

Currently translated at 78.9% (90 of 114 strings)

Translated using Weblate (Hebrew)

Currently translated at 66.4% (89 of 134 strings)

Translated using Weblate (Hebrew)

Currently translated at 56.2% (242 of 430 strings)

Translated using Weblate (Hebrew)

Currently translated at 38.5% (1301 of 3377 strings)

Translated using Weblate (Hebrew)

Currently translated at 90.5% (220 of 243 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Hebrew)

Currently translated at 66.1% (570 of 862 strings)

Translated using Weblate (Hebrew)

Currently translated at 98.4% (190 of 193 strings)

Translated using Weblate (Hebrew)

Currently translated at 58.6% (152 of 259 strings)

Translated using Weblate (Dutch)

Currently translated at 37.5% (92 of 245 strings)

Translated using Weblate (French)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Dutch)

Currently translated at 37.1% (91 of 245 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Hebrew)

Currently translated at 75.0% (6 of 8 strings)

Translated using Weblate (Hebrew)

Currently translated at 87.2% (212 of 243 strings)

Translated using Weblate (Hebrew)

Currently translated at 75.0% (138 of 184 strings)

Translated using Weblate (Hebrew)

Currently translated at 88.8% (48 of 54 strings)

Translated using Weblate (Hebrew)

Currently translated at 66.1% (570 of 862 strings)

Translated using Weblate (Hebrew)

Currently translated at 57.1% (52 of 91 strings)

Translated using Weblate (Hebrew)

Currently translated at 98.4% (190 of 193 strings)

Translated using Weblate (Hebrew)

Currently translated at 96.3% (106 of 110 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3377 of 3377 strings)

Co-authored-by: Adrielle Marques <adrielle.marques3030@gmail.com>
Co-authored-by: Aleksander Mieciek <alex.mieciek@gmail.com>
Co-authored-by: AlexFad <2077505931@qq.com>
Co-authored-by: Alexandre Le Mercier <alexandre.le.mercier@ulb.be>
Co-authored-by: Ana <taranaana75@gmail.com>
Co-authored-by: Andrea <goffopaguro@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Eddy Nottingham <habitica.com.scone566@simplelogin.com>
Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jezz <lorraly@gmail.com>
Co-authored-by: Jezzica Israelsson <lorraly@gmail.com>
Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
Co-authored-by: Maximiliano Guerra <guguloco2006@gmail.com>
Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
Co-authored-by: Pasquale Bosso <protagora87@gmail.com>
Co-authored-by: Remigiusz Haziak <haziakremigiusz@gmail.com>
Co-authored-by: Ri Vargas <goldenhaitang@gmail.com>
Co-authored-by: Sara Olson <sara@habitica.com>
Co-authored-by: Sonia <sophishport@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Uwe B <hbtca@tunixgut.de>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: gongxueyan <1264752231@qq.com>
Co-authored-by: haru kake <hebey27020@bulmp3.com>
Co-authored-by: luckycccc <806009164@qq.com>
Co-authored-by: Ірина <ira.chipsa@gmail.com>
Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
Co-authored-by: 污染源 <polluter979@qq.com>
Co-authored-by: 김수연 <dus28232@naver.com>
Co-authored-by: ? <importantdata78@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/he/
Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
Translate-URL: https://translate.habitica.com/projects/habitica/character/he/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/he/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/death/he/
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/he/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/front/he/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/he/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/he/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/he/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/he/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/he/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/he/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/he/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/he/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Death
Translation: Habitica/Defaulttasks
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Loginincentives
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
2025-07-21 11:58:35 +02:00
Fiz 068640311e Reload window after changing password (#15474)
* Reload window after changing password

* Shows password change success message

Displays a success snackbar after a user successfully changes their password. This provides visual confirmation to the user that the password update was successful.
The success message is displayed only once after the page reloads.

* lint fix trailing spaces
2025-07-16 13:07:28 -05:00
Fiz f26d2a59ae add InvalidCredentialsError with language-agnostic code (#15472)
* add InvalidCredentialsError with language-agnostic code and update backend & web logout logic

* error.code in API error responses

Updated the error handler to serialize responseErr.code as the JSON error field, falling back to responseErr.name when no code is set.

* fix(lint): whitespace and missing def

* fix(lint): missed one

* add InvalidCredentialsError case for bad token

Add test verifying that auth middleware throws InvalidCredentialsError with code "invalid_credentials" and correct translated message when the API token is invalid.

* fix(test): user fields implicitly required

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-07-15 09:49:11 -05:00
Phillip Thelen 03c7e9172e fix double submit for pw reset (#15473) 2025-07-14 16:14:20 -05:00
negue 6fdc072ec3 reset the ApiToken on password changes/resets (#15433)
* reset the ApiToken on password changes/resets

* fix/add tests

* fix(typo): test grammar

* update new API Token Strings, removed unused one

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-07-01 12:30:34 -05:00
Kalista Payne e68661c04b 5.37.1 2025-07-01 11:54:42 -05:00
Weblate 4f567592ea Translated using Weblate (Italian)
Currently translated at 84.6% (237 of 280 strings)

Translated using Weblate (Swedish)

Currently translated at 52.0% (139 of 267 strings)

Translated using Weblate (German)

Currently translated at 99.6% (266 of 267 strings)

Translated using Weblate (Swedish)

Currently translated at 94.6% (53 of 56 strings)

Translated using Weblate (Swedish)

Currently translated at 92.3% (12 of 13 strings)

Translated using Weblate (Swedish)

Currently translated at 86.8% (99 of 114 strings)

Translated using Weblate (Swedish)

Currently translated at 74.6% (100 of 134 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Swedish)

Currently translated at 66.0% (284 of 430 strings)

Translated using Weblate (Swedish)

Currently translated at 75.5% (139 of 184 strings)

Translated using Weblate (Swedish)

Currently translated at 72.0% (621 of 862 strings)

Translated using Weblate (Swedish)

Currently translated at 47.2% (43 of 91 strings)

Translated using Weblate (Swedish)

Currently translated at 87.2% (41 of 47 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (Spanish)

Currently translated at 99.9% (3375 of 3377 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 10.2% (25 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (3372 of 3377 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 7.7% (19 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 94.6% (390 of 412 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 93.2% (125 of 134 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (French)

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (3369 of 3377 strings)

Translated using Weblate (German)

Currently translated at 98.9% (3341 of 3377 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 5.7% (14 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 83.8% (223 of 266 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 92.5% (124 of 134 strings)

Translated using Weblate (Portuguese)

Currently translated at 54.1% (1829 of 3377 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese)

Currently translated at 53.5% (1808 of 3377 strings)

Translated using Weblate (Italian)

Currently translated at 28.1% (69 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Polish)

Currently translated at 52.3% (1768 of 3377 strings)

Translated using Weblate (Polish)

Currently translated at 52.3% (1768 of 3377 strings)

Translated using Weblate (Polish)

Currently translated at 52.3% (1768 of 3377 strings)

Translated using Weblate (Polish)

Currently translated at 61.4% (172 of 280 strings)

Translated using Weblate (Polish)

Currently translated at 52.3% (1768 of 3377 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3377 of 3377 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Polish)

Currently translated at 32.2% (79 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 94.4% (389 of 412 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (French)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Italian)

Currently translated at 92.3% (170 of 184 strings)

Translated using Weblate (Italian)

Currently translated at 27.3% (67 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Polish)

Currently translated at 99.1% (241 of 243 strings)

Translated using Weblate (Polish)

Currently translated at 96.2% (234 of 243 strings)

Translated using Weblate (Polish)

Currently translated at 96.2% (234 of 243 strings)

Translated using Weblate (Polish)

Currently translated at 86.5% (231 of 267 strings)

Translated using Weblate (Polish)

Currently translated at 94.6% (89 of 94 strings)

Translated using Weblate (Polish)

Currently translated at 91.3% (222 of 243 strings)

Translated using Weblate (Polish)

Currently translated at 30.6% (75 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 30.6% (75 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Polish)

Currently translated at 84.2% (225 of 267 strings)

Translated using Weblate (Polish)

Currently translated at 84.2% (225 of 267 strings)

Translated using Weblate (Polish)

Currently translated at 84.2% (225 of 267 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 99.1% (241 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 99.1% (241 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 96.2% (234 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 96.2% (234 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 93.4% (227 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 93.4% (227 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Russian)

Currently translated at 88.8% (2992 of 3367 strings)

Translated using Weblate (Russian)

Currently translated at 88.8% (2992 of 3367 strings)

Translated using Weblate (Russian)

Currently translated at 88.8% (2992 of 3367 strings)

Translated using Weblate (Italian)

Currently translated at 86.3% (2907 of 3367 strings)

Translated using Weblate (Russian)

Currently translated at 71.8% (176 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 70.2% (172 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Russian)

Currently translated at 66.9% (164 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (911 of 911 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Italian)

Currently translated at 22.0% (54 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 22.0% (54 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (167 of 167 strings)

Co-authored-by: Bartosz Babik <kotka-wali0h@icloud.com>
Co-authored-by: Goldy <mariesipova314@gmail.com>
Co-authored-by: Jackal <qwerty70244@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jan P <jankrzpow@gmail.com>
Co-authored-by: Jezzica Israelsson <lorraly@gmail.com>
Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
Co-authored-by: Kernis <kerhsing.wang@gmail.com>
Co-authored-by: LaiYi <lysinexxin@163.com>
Co-authored-by: Nicolas Samuel Reuter <nicolasreuter1@gmail.com>
Co-authored-by: Nik <doni.della.morte5619@gmail.com>
Co-authored-by: Pasquale Bosso <protagora87@gmail.com>
Co-authored-by: R. J <ricardo@pinho.org>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Sugo Gangotti <giacomo@ergonomia.it>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Svetlana <shkulepo@rambler.ru>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Val <3qes0hnzh@mozmail.com>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Zuz Q <zuzannakunik@gmail.com>
Co-authored-by: fitria nabila <fitria3nabila@gmail.com>
Co-authored-by: konhi <hello.konhi@gmail.com>
Co-authored-by: razil <boss.razmarin@gmail.com>
Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
Co-authored-by: ? <importantdata78@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/it/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt/
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/backgrounds/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/id/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/it/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/character/it/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/it/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/content/it/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/it/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/front/it/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
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/gear/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/it/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/it/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/it/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
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/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hant/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Spells
Translation: Habitica/Subscriber
2025-07-01 05:18:55 +02:00
Kalista Payne 63c9b7a894 fix(groups): add missing markModified 2025-06-26 18:08:57 -05:00
Kalista Payne eaec39188e chore(subproj): update habitica-images 2025-06-26 17:55:24 -05:00
Natalie ba6940eb81 chore: update time travelers shop to display seasonal backgrounds (#15445)
* chore: update time travelers shop to display seasonal backgrounds

* chore: update time travelers banner (note CSS borken rn)

* chore: fix borken CSS and update logic in shop

* chore: added isSubscribed function, not working

* chore: isSubscribed working but no bg for subscribers

* chore: logic and css updates

* chore: add check for trinket

* chore: more time traveler shop logicking

* chore(git): heckin habitica-images

* refactor(style): indents/readability

* refactor(style): one more line break

* refactor(style): still more indents

* refactor(style): I wonder if lint can help with this stuff

* refactor(style): tighten up

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-06-25 15:12:23 -05:00
Kalista Payne f8a3e4d673 perf(groups): use simplest possible query for cron script (#15457) 2025-06-25 14:56:50 -05:00
Phillip Thelen 2727da6f6c Correctly define components (#15458) 2025-06-25 14:56:29 -05:00
Kalista Payne fa97852e38 5.37.0 2025-06-21 08:57:40 -05:00
Weblate 2c7da25a25 Translated using Weblate (Dutch)
Currently translated at 35.1% (86 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (French)

Currently translated at 100.0% (267 of 267 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 79.6% (212 of 266 strings)

Translated using Weblate (French)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.5% (406 of 412 strings)

Translated using Weblate (French)

Currently translated at 96.1% (177 of 184 strings)

Co-authored-by: Alexandre Le Mercier <alexandre.le.mercier@ulb.be>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: LaiYi <lysinexxin@163.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/
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/zh_Hant/
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Subscriber
2025-06-21 15:07:30 +02:00
Natalie 9a072e3e76 chore: update grand gala start dates (#15435)
* chore: update grand gala start date

* chore: update test cases for new gala dates

* chore(sales): adjust promo dates

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-06-19 18:05:38 -05:00
Natalie 823b339d27 chore: July 2025 content build (#15449)
* chore: July 2025 content build

* chore: add release dates to armoire

* fix(sprites): correct Cryptid typo

* fix(grammar): missing comma

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-06-17 13:34:57 -05:00
Kalista Payne fe98d9485d 5.36.6 2025-06-17 13:06:00 -05:00
Weblate 407e1bb560 Translated using Weblate (Italian)
Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 98.8% (898 of 908 strings)

Translated using Weblate (Italian)

Currently translated at 90.1% (82 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 86.3% (2907 of 3367 strings)

Translated using Weblate (German)

Currently translated at 99.1% (3340 of 3367 strings)

Translated using Weblate (Italian)

Currently translated at 84.6% (77 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 20.4% (50 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 72.5% (66 of 91 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 86.5% (786 of 908 strings)

Translated using Weblate (French)

Currently translated at 88.5% (163 of 184 strings)

Translated using Weblate (German)

Currently translated at 99.1% (3338 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 86.4% (159 of 184 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (184 of 184 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Spanish)

Currently translated at 95.6% (176 of 184 strings)

Translated using Weblate (Italian)

Currently translated at 18.3% (45 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 86.4% (159 of 184 strings)

Translated using Weblate (German)

Currently translated at 86.4% (159 of 184 strings)

Translated using Weblate (Polish)

Currently translated at 29.7% (73 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 28.9% (71 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Polish)

Currently translated at 28.9% (71 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 96.3% (106 of 110 strings)

Translated using Weblate (Dutch)

Currently translated at 30.6% (75 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3336 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3367 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (3361 of 3367 strings)

Translated using Weblate (Italian)

Currently translated at 17.9% (44 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.5% (3353 of 3367 strings)

Translated using Weblate (Italian)

Currently translated at 17.5% (43 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.2% (3343 of 3367 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.7% (429 of 430 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.5% (406 of 412 strings)

Translated using Weblate (Korean)

Currently translated at 96.4% (110 of 114 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Korean)

Currently translated at 22.8% (56 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3334 of 3367 strings)

Translated using Weblate (Korean)

Currently translated at 13.0% (32 of 245 strings)

Translated using Weblate (Korean)

Currently translated at 9.7% (24 of 245 strings)

Translated using Weblate (Korean)

Currently translated at 7.3% (18 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.2% (3341 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.0% (3334 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.0% (3334 of 3367 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 92.7% (382 of 412 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.7% (3325 of 3367 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.7% (3324 of 3367 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 85.4% (776 of 908 strings)

Translated using Weblate (Polish)

Currently translated at 87.5% (7 of 8 strings)

Translated using Weblate (Polish)

Currently translated at 52.5% (1768 of 3367 strings)

Translated using Weblate (Polish)

Currently translated at 66.4% (573 of 862 strings)

Translated using Weblate (German)

Currently translated at 98.9% (3332 of 3367 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.5% (406 of 412 strings)

Translated using Weblate (German)

Currently translated at 98.9% (3330 of 3367 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (842 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.5% (406 of 412 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.3% (405 of 412 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.6% (3322 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (266 of 266 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (280 of 280 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.1% (3305 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.1% (3305 of 3367 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3367 of 3367 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3367 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (845 of 845 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Dutch)

Currently translated at 28.5% (70 of 245 strings)

Translated using Weblate (Dutch)

Currently translated at 97.8% (46 of 47 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.9% (3297 of 3367 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (239 of 245 strings)

Co-authored-by: Alexandre Le Mercier <alexandre.le.mercier@ulb.be>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Dawid Wodyk <dawid.wodykk@gmail.com>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jan P <jankrzpow@gmail.com>
Co-authored-by: LaiYi <lysinexxin@163.com>
Co-authored-by: Nik <doni.della.morte5619@gmail.com>
Co-authored-by: Pasquale Bosso <protagora87@gmail.com>
Co-authored-by: Saalima Aaseman <aaseman.bio@gmail.com>
Co-authored-by: Sam Hou <samhou777@outlook.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: helianlouchen <helianlouchen@gmail.com>
Co-authored-by: luckycc <806009164@qq.com>
Co-authored-by: luckycccc <806009164@qq.com>
Co-authored-by: sein <tjdgp0132n@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/it/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
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/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Spells
Translation: Habitica/Subscriber
2025-06-17 12:58:03 +02:00
Kalista Payne 98a6535dc3 fix(content): don't filter out the thing we want 2025-06-16 16:43:56 -05:00
Kalista Payne 9948e8ee44 fix(mobile): provide Challenge categories via API 2025-06-16 16:43:24 -05:00
Phillip Thelen bce07ec357 wait for vue router to be ready (#15456)
* wait for vue router to be ready

* fix(lint): whitespace

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-06-16 11:48:37 -05:00
Kalista Payne 836807aa1e Update static features pages (#15451)
* update images on static features page

* small layout changes

* Update feature texts

* layout tweaks

* refactor(client): move to Vite by @phillipthelen

* update images on static features page

* make text more comfortable to read

* update capitalization

* fix(whitespace): add EOF CR

---------

Co-authored-by: Phillip Thelen <phillip@habitica.com>
2025-06-12 13:11:16 -05:00
Phillip Thelen ebbcbef6d5 Fix deploying static files to S3 (#15450)
* upload all image types to s3

* fix __dirname not existing
2025-06-12 10:24:24 -05:00
Kalista Payne ccc6c9867f refactor(client): move to Vite by @phillipthelen 2025-06-11 19:20:11 -05:00
Natalie 20d31ed8c8 fix: pw reset screen logo color (#15442)
* fix: pw reset screen logo color

* fix: habitica logo svg color on password reset page
2025-05-29 14:55:57 -05:00
Kalista Payne 39ff6cbe05 5.36.5 2025-05-29 11:57:45 -05:00
Natalie 1bf2efa885 fix: correct Soft White Suit's stats interpolation (#15431)
* update armorArmoireBasketballUniformNotes to correct stat display

* correct typo in Puppy pet adjective

* fix: fix Soft White Suit's stats interpolation

---------

Co-authored-by: Sabe Jones <sabe@habitica.com>
2025-05-29 11:56:54 -05:00
Weblate 4b45a6389c Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.0% (404 of 412 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (German)

Currently translated at 98.8% (3329 of 3367 strings)

Translated using Weblate (Ukrainian)

Currently translated at 55.1% (135 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 96.9% (258 of 266 strings)

Translated using Weblate (German)

Currently translated at 98.8% (3329 of 3367 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (842 of 862 strings)

Translated using Weblate (German)

Currently translated at 98.8% (3327 of 3367 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3367 of 3367 strings)

Translated using Weblate (German)

Currently translated at 98.7% (3325 of 3367 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.0% (404 of 412 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 99.3% (902 of 908 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (239 of 245 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (842 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.0% (404 of 412 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Italian)

Currently translated at 84.4% (363 of 430 strings)

Translated using Weblate (Italian)

Currently translated at 70.3% (64 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 80.8% (215 of 266 strings)

Translated using Weblate (Italian)

Currently translated at 94.7% (127 of 134 strings)

Translated using Weblate (Italian)

Currently translated at 98.2% (57 of 58 strings)

Translated using Weblate (Italian)

Currently translated at 84.1% (362 of 430 strings)

Translated using Weblate (Italian)

Currently translated at 69.2% (63 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 94.0% (126 of 134 strings)

Translated using Weblate (Italian)

Currently translated at 83.7% (360 of 430 strings)

Translated using Weblate (Italian)

Currently translated at 64.8% (59 of 91 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.5% (841 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.5% (841 of 862 strings)

Translated using Weblate (German)

Currently translated at 98.3% (848 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.5% (841 of 862 strings)

Translated using Weblate (German)

Currently translated at 100.0% (280 of 280 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (266 of 266 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3367 of 3367 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3367 of 3367 strings)

Translated using Weblate (German)

Currently translated at 99.2% (278 of 280 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.7% (3292 of 3367 strings)

Translated using Weblate (French)

Currently translated at 100.0% (266 of 266 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (266 of 266 strings)

Translated using Weblate (German)

Currently translated at 100.0% (266 of 266 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (280 of 280 strings)

Translated using Weblate (French)

Currently translated at 99.6% (3354 of 3367 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3367 of 3367 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.5% (841 of 862 strings)

Translated using Weblate (German)

Currently translated at 100.0% (908 of 908 strings)

Co-authored-by: AlexFad <2077505931@qq.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Giu <gcapogna28@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Marie Blosse--Gilbin <mbgil@hotmail.fr>
Co-authored-by: Sam Hou <samhou777@outlook.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: wangtongxue <wangtongxue123456@outlook.com>
Co-authored-by: Анна <antarinel+habitica@gmail.com>
Co-authored-by: Юрий Артамонов <zilberstein2211@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/it/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
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/gear/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/it/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/es/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/it/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
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/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/it/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translation: Habitica/Backgrounds
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Questscontent
Translation: Habitica/Spells
Translation: Habitica/Subscriber
2025-05-29 18:55:30 +02:00
Phillip Thelen 5ba7d2395e Optimize database access for some use cases (#15444)
* optimize query when listing challenge tasks

* Optimize query for checking if user is party leader
2025-05-28 21:52:07 -05:00
dependabot[bot] 972f23e235 chore(deps): bump http-proxy-middleware in /website/client (#15427)
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.6 to 2.0.9.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.6...v2.0.9)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-version: 2.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 16:01:41 -04:00
dependabot[bot] 9f599b0c8e chore(deps): bump @babel/runtime from 7.23.9 to 7.26.10 (#15410)
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.23.9 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 15:57:08 -04:00
dependabot[bot] b937c2df0b chore(deps): bump @babel/helpers in /website/client (#15407)
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.23.6 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 15:56:47 -04:00
dependabot[bot] 9c4396027a chore(deps): bump @babel/runtime-corejs2 in /website/client (#15406)
Bumps [@babel/runtime-corejs2](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs2) from 7.23.6 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime-corejs2)

---
updated-dependencies:
- dependency-name: "@babel/runtime-corejs2"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 15:56:11 -04:00
dependabot[bot] 2bab20d032 chore(deps): bump prismjs from 1.29.0 to 1.30.0 (#15403)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.29.0 to 1.30.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.29.0...v1.30.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 15:55:59 -04:00
dependabot[bot] cb2ee670e3 chore(deps-dev): bump axios from 1.7.4 to 1.8.2 (#15401)
Bumps [axios](https://github.com/axios/axios) from 1.7.4 to 1.8.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.4...v1.8.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 15:55:41 -04:00
dependabot[bot] b65d23d535 chore(deps): bump serialize-javascript in /website/client (#15395)
Bumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/yahoo/serialize-javascript/releases)
- [Commits](https://github.com/yahoo/serialize-javascript/compare/v6.0.1...v6.0.2)

---
updated-dependencies:
- dependency-name: serialize-javascript
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 15:55:20 -04:00
Kalista Payne 007cdf0ca2 5.36.4 2025-05-19 17:21:35 -05:00
Weblate 1e4799bac6 Merge branch 'origin/develop' into Weblate. 2025-05-20 00:15:13 +02:00
Weblate 47222445ad Translated using Weblate (Ukrainian)
Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (280 of 280 strings)

Translated using Weblate (French)

Currently translated at 100.0% (280 of 280 strings)

Translated using Weblate (Spanish)

Currently translated at 99.6% (279 of 280 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (840 of 862 strings)

Translated using Weblate (German)

Currently translated at 99.8% (907 of 908 strings)

Translated using Weblate (Dutch)

Currently translated at 79.3% (219 of 276 strings)

Translated using Weblate (Dutch)

Currently translated at 28.1% (69 of 245 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (840 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.5% (402 of 412 strings)

Translated using Weblate (Dutch)

Currently translated at 91.5% (377 of 412 strings)

Translated using Weblate (Dutch)

Currently translated at 85.2% (774 of 908 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Slovak)

Currently translated at 63.4% (106 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Slovak)

Currently translated at 2.0% (5 of 245 strings)

Translated using Weblate (French)

Currently translated at 100.0% (908 of 908 strings)

Translated using Weblate (Russian)

Currently translated at 64.4% (158 of 245 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.0% (837 of 862 strings)

Translated using Weblate (German)

Currently translated at 97.9% (844 of 862 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.3% (401 of 412 strings)

Translated using Weblate (Portuguese)

Currently translated at 95.3% (393 of 412 strings)

Translated using Weblate (Slovak)

Currently translated at 45.6% (413 of 905 strings)

Translated using Weblate (Slovak)

Currently translated at 50.8% (85 of 167 strings)

Translated using Weblate (Russian)

Currently translated at 99.1% (113 of 114 strings)

Translated using Weblate (Russian)

Currently translated at 64.0% (157 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 64.0% (157 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 62.0% (152 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 62.0% (152 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 60.8% (149 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 60.8% (149 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 60.4% (148 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 60.4% (148 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 60.0% (147 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 60.0% (147 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 57.9% (142 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 57.9% (142 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 56.7% (139 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 56.7% (139 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 56.3% (138 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 56.3% (138 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 53.8% (132 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 53.8% (132 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 53.4% (131 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 53.4% (131 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 48.9% (120 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 48.9% (120 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 48.5% (119 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 48.5% (119 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 46.9% (115 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 45.3% (111 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 45.3% (111 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 45.3% (111 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 45.3% (111 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 44.4% (109 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.9% (3324 of 3325 strings)

Translated using Weblate (Russian)

Currently translated at 44.4% (109 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 44.4% (109 of 245 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.8% (107 of 114 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.7% (429 of 430 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.1% (820 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (902 of 905 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.1% (820 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.1% (820 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.1% (820 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.8% (107 of 114 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.6% (3114 of 3325 strings)

Translated using Weblate (Portuguese)

Currently translated at 53.9% (1793 of 3325 strings)

Translated using Weblate (Dutch)

Currently translated at 78.1% (2600 of 3325 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.5% (242 of 243 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.1% (820 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.6% (398 of 412 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (902 of 905 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (113 of 114 strings)

Translated using Weblate (Italian)

Currently translated at 87.3% (2903 of 3325 strings)

Translated using Weblate (Italian)

Currently translated at 17.1% (42 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 99.0% (408 of 412 strings)

Translated using Weblate (Italian)

Currently translated at 92.7% (102 of 110 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.0% (3292 of 3325 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.7% (3285 of 3325 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.7% (3285 of 3325 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.1% (3262 of 3325 strings)

Co-authored-by: Andrea <goffopaguro@gmail.com>
Co-authored-by: Artem StolyROV <stolyarov11303@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: David Kaya <david@kaya.sk>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Irina  Shcherbinina <cat3dcat007@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Mencius <beautyalinap@gmail.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Nikita Maximov <ruvemaximus@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Tom <tompsognathus@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: V Aar <v.vanderaar@gmail.com>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: razil <boss.razmarin@gmail.com>
Co-authored-by: Волкозмей <klippiky@gmail.com>
Co-authored-by: Данила Мальцев <maltsev-danila@inbox.ru>
Co-authored-by: Татьяна Куклева <klippiky@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
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/backgrounds/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/it/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/content/it/
Translate-URL: https://translate.habitica.com/projects/habitica/content/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/es/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/it/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
2025-05-20 00:15:02 +02:00
Kalista Payne 126b382da1 fix(logging): don't spam empty error events 2025-05-19 17:07:42 -05:00
Kalista Payne ec78831a81 fix(script): don't use extremely costly regex 2025-05-19 17:05:09 -05:00
Natalie 9bfb2afd9c June 2025 content build (#15437)
* chore: June 2025 content build

* chore: typo fixing

* chore: corrections to summer 2025 mage armor, spritesheet

* fix(css): rebuild spritesmith-main

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-05-13 16:10:25 -05:00
Kalista Payne 389124b83f 5.36.3 2025-05-07 12:03:54 -05:00
Weblate eb25330296 Merge branch 'origin/develop' into Weblate. 2025-05-07 19:00:50 +02:00
Phillip Thelen 29892ff5e3 Allow an email to be passed to forgot-password page (#15436) 2025-05-07 11:46:47 -05:00
Weblate 99a31b322a Translated using Weblate (Chinese (Simplified))
Currently translated at 97.9% (3257 of 3325 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.8% (3255 of 3325 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.7% (3250 of 3325 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 95.9% (235 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.5% (841 of 845 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 53.8% (49 of 91 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Ukrainian)

Currently translated at 54.2% (133 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 43.2% (106 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 43.2% (106 of 245 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 94.7% (108 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 70.5% (2347 of 3325 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (German)

Currently translated at 99.9% (3322 of 3325 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3325 of 3325 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (862 of 862 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 88.0% (759 of 862 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 88.0% (759 of 862 strings)

Co-authored-by: Catherine Liang <catherine.cy.liang@gmail.com>
Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Maya B <maya.bl@icloud.com>
Co-authored-by: Mencius <beautyalinap@gmail.com>
Co-authored-by: Nazar Paruna <nazarparuna@gmail.com>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Анна <antarinel+habitica@gmail.com>
Co-authored-by: Татьяна Куклева <klippiky@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/character/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/content/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Settings
2025-05-07 15:56:59 +02:00
Kalista Payne 1884c6c751 5.36.2 2025-05-06 12:24:15 -05:00
Natalie 9456477953 fix: correct party modal sort dropdown display (#15432) 2025-05-06 12:05:36 -05:00
Kalista Payne e3512a2bdd 5.36.1 2025-04-30 10:38:05 -05:00
Kalista Payne 6ce3f84458 fix(css): add missing Cryptid references 2025-04-30 10:35:54 -05:00
607 changed files with 9480 additions and 12430 deletions
+1 -1
View File
@@ -9,4 +9,4 @@
}
]
]
}
}
-11
View File
@@ -1,11 +0,0 @@
import gulp from 'gulp';
import nodemon from 'gulp-nodemon';
import pkg from '../package.json';
gulp.task('nodemon', done => {
nodemon({
script: pkg.main,
});
done();
});
-6
View File
@@ -49,12 +49,6 @@ function integrationTestCommand (testDir) {
}
/* Test task definitions */
gulp.task('test:nodemon', gulp.series(done => {
process.env.PORT = TEST_SERVER_PORT; // eslint-disable-line no-process-env
process.env.NODE_DB_URI = TEST_DB_URI; // eslint-disable-line no-process-env
done();
}, 'nodemon'));
gulp.task('test:prepare:mongo', cb => {
const mongooseOptions = getDefaultConnectionOptions();
const connectionUrl = getDevelopmentConnectionUrl(TEST_DB_URI);
-1
View File
@@ -21,7 +21,6 @@ if (process.env.NODE_ENV === 'production') { // eslint-disable-line no-process-e
require('./gulp/gulp-build'); // eslint-disable-line global-require
require('./gulp/gulp-console'); // eslint-disable-line global-require
require('./gulp/gulp-sprites'); // eslint-disable-line global-require
require('./gulp/gulp-start'); // eslint-disable-line global-require
require('./gulp/gulp-tests'); // eslint-disable-line global-require
require('./gulp/gulp-transifex-test'); // eslint-disable-line global-require
require('gulp').task('default', gulp.series('test')); // eslint-disable-line global-require
+1 -1
View File
@@ -37,7 +37,7 @@ let consoleStamp = require('console-stamp');
consoleStamp(console);
// Initialize configuration
require('../../website/server/libs/api-v3/setupNconf')();
require('../../website/server/libs/api-v3/setupNconf').default();
let MONGODB_OLD = nconf.get('MONGODB_OLD');
let MONGODB_NEW = nconf.get('MONGODB_NEW');
+1 -1
View File
@@ -32,7 +32,7 @@ let moment = require('moment');
consoleStamp(console);
// Initialize configuration
require('../../website/server/libs/api-v3/setupNconf')();
require('../../website/server/libs/api-v3/setupNconf').default();
let MONGODB_OLD = nconf.get('MONGODB_OLD');
let MONGODB_NEW = nconf.get('MONGODB_NEW');
+1 -1
View File
@@ -6,7 +6,7 @@ require('@babel/register'); // eslint-disable-line import/no-extraneous-dependen
function setUpServer () {
const nconf = require('nconf'); // eslint-disable-line global-require, no-unused-vars
const mongoose = require('mongoose'); // eslint-disable-line global-require, no-unused-vars
const setupNconf = require('../website/server/libs/setupNconf'); // eslint-disable-line global-require
const setupNconf = require('../website/server/libs/setupNconf').default; // eslint-disable-line global-require
setupNconf();
+131 -459
View File
@@ -1,12 +1,12 @@
{
"name": "habitica",
"version": "5.36.0",
"version": "5.38.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "habitica",
"version": "5.36.0",
"version": "5.38.1",
"hasInstallScript": true,
"dependencies": {
"@babel/core": "^7.22.10",
@@ -43,7 +43,6 @@
"gulp-babel": "^8.0.0",
"gulp-filter": "^7.0.0",
"gulp-imagemin": "^7.1.0",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.13.0",
"habitica-markdown": "^3.0.0",
"helmet": "^4.6.0",
@@ -55,12 +54,12 @@
"merge-stream": "^2.0.0",
"method-override": "^3.0.0",
"moment": "^2.29.4",
"moment-recur": "^1.0.7",
"moment-recur": "git://github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"mongoose": "^8.9.5",
"morgan": "^1.10.0",
"nconf": "^0.12.1",
"node-gcm": "^1.0.5",
"nodemon": "^2.0.20",
"nodemon": "^3.1.9",
"on-headers": "^1.0.2",
"passport": "^0.5.3",
"passport-facebook": "^3.0.0",
@@ -87,7 +86,7 @@
"xml2js": "^0.6.2"
},
"devDependencies": {
"axios": "^1.7.4",
"axios": "^1.8.2",
"chai": "^4.3.7",
"chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0",
@@ -151,14 +150,6 @@
"node": ">=4"
}
},
"node_modules/@babel/code-frame/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/code-frame/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -542,14 +533,6 @@
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -1699,9 +1682,10 @@
"integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
},
"node_modules/@babel/runtime": {
"version": "7.23.9",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz",
"integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
"version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
"integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@@ -1786,231 +1770,6 @@
"node": ">=10.0.0"
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
"integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
"cpu": [
"arm"
],
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
"integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
"integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
"integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
"integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
"integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
"integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
"integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
"cpu": [
"arm"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
"integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
"integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
"cpu": [
"ia32"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
"integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
"cpu": [
"loong64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
"integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
"cpu": [
"mips64el"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
"integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
"cpu": [
"ppc64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
"integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
"cpu": [
"riscv64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
"integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
"cpu": [
"s390x"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
@@ -2026,96 +1785,6 @@
"node": ">=12"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
"integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
"integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
"integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
"integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
"integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
"cpu": [
"ia32"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
"integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -4170,6 +3839,14 @@
"node": ">=6"
}
},
"node_modules/apidoc/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/apidoc/node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -4200,6 +3877,41 @@
"node": ">=10"
}
},
"node_modules/apidoc/node_modules/nodemon": {
"version": "2.0.22",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
"integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^3.2.7",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2",
"pstree.remy": "^1.1.8",
"semver": "^5.7.1",
"simple-update-notifier": "^1.0.7",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
},
"bin": {
"nodemon": "bin/nodemon.js"
},
"engines": {
"node": ">=8.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nodemon"
}
},
"node_modules/apidoc/node_modules/nodemon/node_modules/semver": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"bin": {
"semver": "bin/semver"
}
},
"node_modules/apidoc/node_modules/semver": {
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
@@ -4214,6 +3926,36 @@
"node": ">=10"
}
},
"node_modules/apidoc/node_modules/simple-update-notifier": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
"integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
"dependencies": {
"semver": "~7.0.0"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/apidoc/node_modules/simple-update-notifier/node_modules/semver": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/apidoc/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/apidoc/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -4787,10 +4529,11 @@
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
},
"node_modules/axios": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
"integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
"dev": true,
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
@@ -6193,7 +5936,7 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"devOptional": true,
"dev": true,
"dependencies": {
"file-uri-to-path": "1.0.0"
}
@@ -7013,15 +6756,6 @@
"node": ">=4"
}
},
"node_modules/coa/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"optional": true,
"engines": {
"node": ">=4"
}
},
"node_modules/coa/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -7115,6 +6849,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
"engines": {
"node": ">=0.1.90"
}
@@ -8993,14 +8728,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-config-habitrpg/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/eslint-config-habitrpg/node_modules/ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -10507,7 +10234,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"devOptional": true
"dev": true
},
"node_modules/filename-reserved-regex": {
"version": "2.0.0",
@@ -11593,24 +11320,6 @@
"node": ">=0.10.0"
}
},
"node_modules/glob-watcher/node_modules/fsevents": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2",
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"dependencies": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
},
"engines": {
"node": ">= 4.0"
}
},
"node_modules/glob-watcher/node_modules/glob-parent": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
@@ -12300,16 +12009,6 @@
"node": ">=8"
}
},
"node_modules/gulp-nodemon": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/gulp-nodemon/-/gulp-nodemon-2.5.0.tgz",
"integrity": "sha512-vXfaP72xo2C6XOaXrNcLEM3QqDJ1x21S3x97U4YtzN2Rl2kH57++aFkAVxe6BafGRSTxs/xVfE/jNNlCv5Ym2Q==",
"dependencies": {
"colors": "^1.2.1",
"gulp": "^4.0.0",
"nodemon": "^2.0.2"
}
},
"node_modules/gulp.spritesmith": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/gulp.spritesmith/-/gulp.spritesmith-6.13.0.tgz",
@@ -12542,6 +12241,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
@@ -15335,15 +15042,6 @@
"node": "*"
}
},
"node_modules/mocha/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/mocha/node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -15407,9 +15105,10 @@
}
},
"node_modules/moment-recur": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/moment-recur/-/moment-recur-1.0.7.tgz",
"integrity": "sha512-jpBQn6H62gCnEYjtYdLfK/VdPZHEXo1t8RrVItHVVS67SRvByyJBNBa3WQSGTe+8H0smcYO/79FYTA9LGMVdQw==",
"version": "1.0.8",
"resolved": "git+ssh://git@github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"integrity": "sha512-LaqXV3izeVQjG0EKAEQQWdneMiff5JR6oBKcfgl0uFOTeaFzLKG62psk7r2VE7RTBdhYigt6KNaLZR7GdWPEIA==",
"license": "Unlicense",
"dependencies": {
"moment": "<3.0.0"
}
@@ -15949,7 +15648,7 @@
"version": "2.18.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
"integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==",
"devOptional": true
"dev": true
},
"node_modules/nanomatch": {
"version": "1.2.13",
@@ -16313,17 +16012,17 @@
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
},
"node_modules/nodemon": {
"version": "2.0.22",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
"integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
"integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^3.2.7",
"debug": "^4",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2",
"pstree.remy": "^1.1.8",
"semver": "^5.7.1",
"simple-update-notifier": "^1.0.7",
"semver": "^7.5.3",
"simple-update-notifier": "^2.0.0",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
@@ -16332,35 +16031,22 @@
"nodemon": "bin/nodemon.js"
},
"engines": {
"node": ">=8.10.0"
"node": ">=10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nodemon"
}
},
"node_modules/nodemon/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/nodemon/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/nodemon/node_modules/semver": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"bin": {
"semver": "bin/semver"
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/nodemon/node_modules/supports-color": {
@@ -18200,9 +17886,10 @@
}
},
"node_modules/prismjs": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
"integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
"license": "MIT",
"engines": {
"node": ">=6"
}
@@ -19213,15 +18900,6 @@
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true
},
"node_modules/run-rs/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/run-rs/node_modules/mongodb": {
"version": "3.6.12",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.12.tgz",
@@ -19746,22 +19424,25 @@
}
},
"node_modules/simple-update-notifier": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
"integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
"integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dependencies": {
"semver": "~7.0.0"
"semver": "^7.5.3"
},
"engines": {
"node": ">=8.10.0"
"node": ">=10"
}
},
"node_modules/simple-update-notifier/node_modules/semver": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/sinon": {
@@ -20790,15 +20471,6 @@
"node": ">=4"
}
},
"node_modules/svgo/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"optional": true,
"engines": {
"node": ">=4"
}
},
"node_modules/svgo/node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+5 -8
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.36.0",
"version": "5.38.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.22.10",
@@ -38,7 +38,6 @@
"gulp-babel": "^8.0.0",
"gulp-filter": "^7.0.0",
"gulp-imagemin": "^7.1.0",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.13.0",
"habitica-markdown": "^3.0.0",
"helmet": "^4.6.0",
@@ -50,12 +49,11 @@
"merge-stream": "^2.0.0",
"method-override": "^3.0.0",
"moment": "^2.29.4",
"moment-recur": "^1.0.7",
"moment-recur": "git://github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"mongoose": "^8.9.5",
"morgan": "^1.10.0",
"nconf": "^0.12.1",
"node-gcm": "^1.0.5",
"nodemon": "^2.0.20",
"on-headers": "^1.0.2",
"passport": "^0.5.3",
"passport-facebook": "^3.0.0",
@@ -100,15 +98,14 @@
"test:sanity": "nyc --silent --no-clean mocha test/sanity --recursive",
"test:common": "nyc --silent --no-clean mocha test/common --recursive",
"test:content": "nyc --silent --no-clean mocha test/content --recursive",
"test:nodemon": "gulp test:nodemon",
"coverage": "nyc report --reporter=html --report-dir coverage/results; open coverage/results/index.html",
"sprites": "gulp sprites:compile",
"client:dev": "cd website/client && npm run serve",
"client:build": "cd website/client && npm run build",
"client:unit": "cd website/client && npm run test:unit",
"start": "gulp nodemon",
"start": "node --watch ./website/server/index.js",
"start:simple": "node ./website/server/index.js",
"debug": "gulp nodemon --inspect",
"debug": "node --watch --inspect ./website/server/index.js",
"mongo:dev": "run-rs -v 5.0.23 -l ubuntu1804 --keep --dbpath mongodb-data --number 1 --quiet",
"mongo:test": "run-rs -v 5.0.23 -l ubuntu1804 --keep --dbpath mongodb-data-testing --number 1 --quiet",
"postinstall": "git config --global url.\"https://\".insteadOf git:// && gulp build && cd website/client && npm install",
@@ -116,7 +113,7 @@
"heroku-postbuild": ".heroku/report_deploy.sh"
},
"devDependencies": {
"axios": "^1.7.4",
"axios": "^1.8.2",
"chai": "^4.3.7",
"chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0",
+2 -3
View File
@@ -71,15 +71,14 @@ async function deleteHabiticaData (user, email) {
}
async function processEmailAddress (email) {
const emailRegex = new RegExp(`^${email}$`, 'i');
const localUsers = await User.find(
{ 'auth.local.email': emailRegex },
{ 'auth.local.email': email },
{ _id: 1, apiToken: 1, auth: 1 },
).exec();
const socialUsers = await User.find(
{
'auth.local.email': { $not: emailRegex },
'auth.local.email': { $ne: email },
$or: [
{ 'auth.facebook.emails.value': email },
{ 'auth.google.emails.value': email },
+11 -6
View File
@@ -8,7 +8,17 @@ const TASK_VALUE_CHANGE_FACTOR = 0.9747;
const MIN_TASK_VALUE = -47.27;
async function updateTeamTasks (team) {
if (team.purchased.plan.dateTerminated) {
const dateTerminated = new Date(team.purchased.plan.dateTerminated);
if (dateTerminated < new Date()) {
team.purchased.plan.customerId = undefined;
team.markModified('purchased.plan');
return team.save();
}
}
const toSave = [];
let teamLeader = await User.findOne({ _id: team.leader }, 'preferences').exec();
if (!teamLeader) { // why would this happen?
@@ -93,12 +103,7 @@ async function updateTeamTasks (team) {
export default async function processTeamsCron () {
const activeTeams = await Group.find({
'purchased.plan.customerId': { $exists: true },
$or: [
{ 'purchased.plan.dateTerminated': { $exists: false } },
{ 'purchased.plan.dateTerminated': null },
{ 'purchased.plan.dateTerminated': { $gt: new Date() } },
],
}).exec();
}, { cron: 1, leader: 1, purchased: 1 }).exec();
const cronPromises = activeTeams.map(updateTeamTasks);
return Promise.all(cronPromises);
+58 -1
View File
@@ -1,8 +1,11 @@
import nconf from 'nconf';
import requireAgain from 'require-again';
import {
generateRes,
generateReq,
} from '../../../helpers/api-unit.helper';
import { authWithHeaders as authWithHeadersFactory } from '../../../../website/server/middlewares/auth';
const authPath = '../../../../website/server/middlewares/auth';
describe('auth middleware', () => {
let res; let req; let
@@ -16,6 +19,7 @@ describe('auth middleware', () => {
describe('auth with headers', () => {
it('allows to specify a list of user field that we do not want to load', done => {
const authWithHeadersFactory = requireAgain(authPath).authWithHeaders;
const authWithHeaders = authWithHeadersFactory({
userFieldsToExclude: ['items'],
});
@@ -35,6 +39,7 @@ describe('auth middleware', () => {
});
it('makes sure some fields are always included', done => {
const authWithHeadersFactory = requireAgain(authPath).authWithHeaders;
const authWithHeaders = authWithHeadersFactory({
userFieldsToExclude: [
'items', 'auth.timestamps',
@@ -60,5 +65,57 @@ describe('auth middleware', () => {
return done();
});
});
it('errors with InvalidCredentialsError and code when token is wrong', done => {
const authWithHeadersFactory = requireAgain(authPath).authWithHeaders;
const authWithHeaders = authWithHeadersFactory({ userFieldsToExclude: [] });
req.headers['x-api-user'] = user._id;
req.headers['x-api-key'] = 'totally-wrong-token';
authWithHeaders(req, res, err => {
expect(err).to.exist;
expect(err.name).to.equal('InvalidCredentialsError');
expect(err.code).to.equal('invalid_credentials');
expect(err.message).to.equal(res.t('invalidCredentials'));
return done();
});
});
describe('when ENFORCE_CLIENT_HEADER is true', () => {
let authFactory;
beforeEach(() => {
sandbox.stub(nconf, 'get').withArgs('ENFORCE_CLIENT_HEADER').returns('true');
authFactory = requireAgain(authPath).authWithHeaders;
});
it('errors with missingClientHeader when x-client header is not present', done => {
const authWithHeaders = authFactory({ userFieldsToExclude: [] });
req.headers['x-api-user'] = user._id;
req.headers['x-api-key'] = user;
authWithHeaders(req, res, err => {
expect(err).to.exist;
expect(err.name).to.equal('BadRequest');
expect(err.message).to.equal(res.t('missingClientHeader'));
return done();
});
});
it('allows request to pass when x-client header is present', done => {
const authWithHeaders = authFactory({ userFieldsToExclude: [] });
req.headers['x-api-user'] = user._id;
req.headers['x-api-key'] = user.apiToken;
req.headers['x-client'] = 'habitica-web';
authWithHeaders(req, res, err => {
if (err) return done(err);
expect(res.locals.user).to.exist;
return done();
});
});
});
});
});
@@ -238,6 +238,28 @@ describe('POST /user/auth/reset-password-set-new-one', () => {
expect(isPassValid).to.equal(true);
});
it('changes the apiToken on password reset', async () => {
const user = await generateUser();
const previousToken = user.apiToken;
const code = encrypt(JSON.stringify({
userId: user._id,
expiresAt: moment().add({ days: 1 }),
}));
await user.updateOne({
'auth.local.passwordResetCode': code,
});
await api.post(`${endpoint}`, {
newPassword: 'my new password',
confirmPassword: 'my new password',
code,
});
await user.sync();
expect(user.apiToken).to.not.eql(previousToken);
});
it('renders the success page and convert the password from sha1 to bcrypt', async () => {
const user = await generateUser();
@@ -27,11 +27,30 @@ describe('PUT /user/auth/update-password', async () => {
newPassword,
confirmPassword: newPassword,
});
expect(response).to.eql({});
expect(response).to.exist;
expect(response.apiToken).to.exist;
await user.sync();
expect(user.auth.local.hashed_password).to.not.eql(previousHashedPassword);
});
it('should change the apiToken on password change', async () => {
const previousToken = user.apiToken;
const response = await user.put(ENDPOINT, {
password,
newPassword,
confirmPassword: newPassword,
});
const newToken = response.apiToken;
expect(newToken).to.exist;
await user.sync();
expect(user.apiToken).to.eql(newToken);
expect(user.apiToken).to.not.eql(previousToken);
});
it('returns an error when confirmPassword does not match newPassword', async () => {
await expect(user.put(ENDPOINT, {
password,
+6 -6
View File
@@ -133,21 +133,21 @@ describe('Content Schedule', () => {
});
it('sets the end date for a gala', () => {
const date = new Date('2024-05-20');
const date = new Date('2024-05-31');
const matchers = getAllScheduleMatchingGroups(date);
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2024-06-21T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2024-06-01T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
});
it('sets the end date for a winter gala', () => {
const date = new Date('2024-12-22');
const date = new Date('2025-02-28');
const matchers = getAllScheduleMatchingGroups(date);
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2025-03-21T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2025-03-01T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
});
it('sets the end date in new year for a winter gala', () => {
const date = new Date('2025-01-04');
const date = new Date('2025-02-28');
const matchers = getAllScheduleMatchingGroups(date);
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2025-03-21T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
expect(matchers.seasonalGear.end).to.eql(moment.utc(`2025-03-01T${String(switchoverTime).padStart(2, '0')}:00:00.000Z`).toDate());
});
it('uses correct date for first hours of the month', () => {
+1 -1
View File
@@ -18,7 +18,7 @@ describe('Shop Featured Items', () => {
});
it('contains the current premium hatching potions', () => {
clock = Sinon.useFakeTimers(new Date('2024-04-08'));
clock = Sinon.useFakeTimers(new Date('2024-04-09'));
const items = featuredItems.market();
expect(_.find(items, item => item.path === 'premiumHatchingPotions.Porcelain')).to.exist;
});
+1 -1
View File
@@ -19,6 +19,6 @@ const sinonStubPromise = require('sinon-stub-promise');
sinonStubPromise(global.sinon);
global.sandbox = sinon.createSandbox();
const setupNconf = require('../../website/server/libs/setupNconf');
const setupNconf = require('../../website/server/libs/setupNconf').default;
setupNconf('./config.json.example');
+1 -1
View File
@@ -3,7 +3,7 @@
const nconf = require('nconf');
const mongoose = require('mongoose');
const setupNconf = require('../../website/server/libs/setupNconf');
const setupNconf = require('../../website/server/libs/setupNconf').default;
// fix further imports of require/import syntaxes
require('@babel/register');
+1 -3
View File
@@ -3,6 +3,7 @@ module.exports = {
root: true,
env: {
node: true,
es2021: true,
},
extends: [
'habitrpg/lib/vue',
@@ -39,7 +40,4 @@ module.exports = {
order: ['template', 'style', 'script'],
}],
},
parserOptions: {
parser: 'babel-eslint',
},
};
-9
View File
@@ -1,9 +0,0 @@
/* eslint-disable import/no-commonjs */
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset',
],
plugins: [
'@babel/plugin-proposal-optional-chaining',
],
};
@@ -12,6 +12,7 @@
<link rel="shortcut icon" sizes="192x192" href="/static/icons/favicon_192x192.png">
<link rel="mask-icon" href="/static/icons/favicon.ico">
<meta property="og:image" content="/static/emails/images/meta-image.png" />
<script type="module" src="/src/main.js"></script>
</head>
<body>
<div id="loading-screen">
@@ -28,10 +29,9 @@
</div>
<div id="app"></div>
<!-- built files will be auto injected -->
<script type="text/javascript" src="//cloudfront.loggly.com/js/loggly.tracker-latest.min.js" async></script>
<!-- Translations -->
<script type='text/javascript' src='/api/v4/i18n/browser-script'></script>
<script type='text/javascript' src='/api/v4/i18n/browser-script' vite-ignore></script>
</body>
</html>
+3378 -8455
View File
File diff suppressed because it is too large Load Diff
+18 -17
View File
@@ -3,28 +3,26 @@
"version": "1.0.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js",
"lint": "vue-cli-service lint .",
"lint-no-fix": "vue-cli-service lint --no-fix .",
"serve": "vite",
"build": "vite build",
"preview": "vite preview",
"test:unit": "vitest run",
"test:unit:watch": "vitest watch",
"lint": "eslint --ext .js,.vue --ignore-path ../../.gitignore --fix .",
"lint-no-fix": "eslint --ext .js,.vue --no-fix src",
"postinstall": "node ./scripts/npm-postinstall.js"
},
"dependencies": {
"@vue/cli-plugin-babel": "^5.0.8",
"@vue/cli-plugin-eslint": "^5.0.8",
"@vue/cli-plugin-router": "^5.0.8",
"@vue/cli-plugin-unit-mocha": "^5.0.8",
"@vue/cli-service": "^5.0.8",
"@froxz/vite-plugin-s3": "^1.6.0",
"@vitejs/plugin-vue2": "^2.3.3",
"@vue/test-utils": "1.0.0-beta.29",
"amplitude-js": "^8.21.3",
"assert": "^2.1.0",
"autoprefixer": "^10.4.20",
"axios": "^0.28.0",
"axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1",
"core-js": "^3.33.1",
"eslint": "7.32.0",
"eslint-config-habitrpg": "6.2.0",
"eslint-plugin-mocha": "5.3.0",
@@ -34,31 +32,34 @@
"intro.js": "^7.2.0",
"jquery": "^3.7.1",
"lodash": "^4.17.21",
"markdown-it": "^14.0.0",
"moment": "^2.29.4",
"moment-locales-webpack-plugin": "^1.2.0",
"nconf": "^0.12.1",
"sass": "^1.63.4",
"sass-loader": "^14.1.1",
"sinon": "^17.0.1",
"stopword": "^2.0.8",
"timers-browserify": "^2.0.12",
"uuid": "^9.0.1",
"validator": "^13.9.0",
"vite": "^6.0.0",
"vite-plugin-compression2": "^1.3.3",
"vue": "^2.7.10",
"vue-fragment": "^1.6.0",
"vue-mugen-scroll": "^0.2.6",
"vue-router": "^3.6.5",
"vue-template-babel-compiler": "^2.0.0",
"vue-template-compiler": "^2.7.10",
"vuedraggable": "^2.24.3",
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#153d339e4dbebb73733658aeda1d5b7fcc55b0a0"
},
"devDependencies": {
"@babel/plugin-proposal-optional-chaining": "^7.21.0",
"@vitest/browser": "^3.0.5",
"babel-plugin-lodash": "^3.3.4",
"chai": "^5.1.0",
"inspectpack": "^4.7.1",
"jsdom": "^26.0.0",
"mocha": "^11.1.0",
"playwright": "^1.50.1",
"terser-webpack-plugin": "^5.3.10",
"vitest": "^3.0.5",
"webpack": "^5.94.0"
}
}
+27 -14
View File
@@ -29,12 +29,14 @@
</div>
<snackbars />
<router-view v-if="!isUserLoggedIn || isStaticPage" />
<user-main v-else />
<div v-else>
<user-main />
</div>
</div>
</template>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#loading-screen-inapp {
#melior {
@@ -90,7 +92,7 @@
</style>
<style lang='scss'>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.modal-backdrop {
opacity: .9 !important;
@@ -108,16 +110,16 @@ import axios from 'axios';
import * as Analytics from '@/libs/analytics';
import { mapState } from '@/libs/store';
import userMain from '@/pages/user-main';
import snackbars from '@/components/snackbars/notifications';
import { LOCALSTORAGE_AUTH_KEY } from '@/libs/auth';
const COMMUNITY_MANAGER_EMAIL = process.env.EMAILS_COMMUNITY_MANAGER_EMAIL; // eslint-disable-line
const COMMUNITY_MANAGER_EMAIL = import.meta.env.EMAILS_COMMUNITY_MANAGER_EMAIL;
export default {
name: 'App',
components: {
snackbars,
userMain,
userMain: () => import('@/pages/user-main'),
},
data () {
return {
@@ -221,11 +223,10 @@ export default {
const errorData = error.response.data;
const errorMessage = errorData.message || errorData;
const errorCode = errorData.error;
// Check for conditions to reset the user auth
// TODO use a specific error like NotificationNotFound instead of checking for the string
const invalidUserMessage = [this.$t('invalidCredentials'), 'Missing authentication headers.'];
if (invalidUserMessage.indexOf(errorMessage) !== -1) {
// If 'invalid_credentials' signaled, force logout
if (error.response.status === 401 && errorCode === 'invalid_credentials') {
this.$store.dispatch('auth:logout', { redirectToLogin: true });
return null;
}
@@ -268,16 +269,29 @@ export default {
const loadingScreen = document.getElementById('loading-screen');
if (loadingScreen) document.body.removeChild(loadingScreen);
if (this.isStaticPage || !this.isUserLoggedIn) {
this.hideLoadingScreen();
// Check if we need to show password change success message
if (sessionStorage.getItem('passwordChangeSuccess') === 'true') {
sessionStorage.removeItem('passwordChangeSuccess');
this.$store.dispatch('snackbars:add', {
title: 'Habitica',
text: this.$t('passwordSuccess'),
type: 'success',
timeout: true,
});
}
this.$router.onReady(() => {
if (this.isStaticPage || !this.isUserLoggedIn) {
this.hideLoadingScreen();
}
});
},
methods: {
hideLoadingScreen () {
this.loading = false;
},
checkForBannedUser (error) {
const AUTH_SETTINGS = localStorage.getItem('habit-mobile-settings');
const AUTH_SETTINGS = localStorage.getItem(LOCALSTORAGE_AUTH_KEY);
const parseSettings = JSON.parse(AUTH_SETTINGS);
const errorMessage = error.response.data.message;
@@ -301,4 +315,3 @@ export default {
</script>
<style src="@/assets/scss/index.scss" lang="scss"></style>
<style src="@/assets/scss/sprites.scss" lang="scss"></style>
+9 -1
View File
@@ -177,7 +177,7 @@
height: 96px;
}
.Mount_Head_Gryphon-Gryphatrice, .Mount_Body_Gryphon-Gryphatrice {
.Mount_Head_Gryphon-Gryphatrice, .Mount_Body_Gryphon-Gryphatrice, .Mount_Head_Dragon-Hydra, .Mount_Body_Dragon-Hydra {
width: 135px;
height: 135px;
}
@@ -190,6 +190,14 @@
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Mount-Body-Gryphatrice.gif") no-repeat;
}
.Mount_Head_Dragon-Hydra {
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Hydra.gif") no-repeat;
}
.Mount_Body_Dragon-Hydra {
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Hydra.gif") no-repeat;
}
.background_airship, .background_clocktower, .background_steamworks {
width: 141px;
height: 147px;
@@ -2001,6 +2001,11 @@
width: 141px;
height: 147px;
}
.background_sirens_lair {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sirens_lair.png');
width: 141px;
height: 147px;
}
.background_slimy_swamp {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_slimy_swamp.png');
width: 141px;
@@ -2176,11 +2181,21 @@
width: 141px;
height: 147px;
}
.background_summer_seashore {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_summer_seashore.png');
width: 141px;
height: 147px;
}
.background_sunken_ship {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sunken_ship.png');
width: 141px;
height: 147px;
}
.background_sunny_street_with_shops {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sunny_street_with_shops.png');
width: 141px;
height: 147px;
}
.background_sunset_meadow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sunset_meadow.png');
width: 141px;
@@ -29545,6 +29560,11 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_beekeepersSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_beekeepersSuit.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_blueMoonShozoku {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_blueMoonShozoku.png');
width: 114px;
@@ -29675,6 +29695,11 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_flyFishingWaders {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_flyFishingWaders.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_funnyFoolCostume {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_funnyFoolCostume.png');
width: 114px;
@@ -29880,6 +29905,11 @@
width: 90px;
height: 90px;
}
.broad_armor_armoire_redWaistcoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_redWaistcoat.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_robeOfDiamonds {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_robeOfDiamonds.png');
width: 114px;
@@ -30145,6 +30175,11 @@
width: 114px;
height: 90px;
}
.head_armoire_beekeepersHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_beekeepersHat.png');
width: 114px;
height: 90px;
}
.head_armoire_bigWig {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_bigWig.png');
width: 90px;
@@ -30285,6 +30320,11 @@
width: 114px;
height: 90px;
}
.head_armoire_flyFishingHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_flyFishingHat.png');
width: 114px;
height: 90px;
}
.head_armoire_frostedHelm {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_frostedHelm.png');
width: 114px;
@@ -30505,6 +30545,11 @@
width: 90px;
height: 90px;
}
.head_armoire_redNewsieHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_redNewsieHat.png');
width: 114px;
height: 90px;
}
.head_armoire_regalCrown {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_regalCrown.png');
width: 114px;
@@ -30645,6 +30690,11 @@
width: 114px;
height: 90px;
}
.shield_armoire_beekeepersHive {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_beekeepersHive.png');
width: 114px;
height: 90px;
}
.shield_armoire_birthdayBanner {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_birthdayBanner.png');
width: 114px;
@@ -30745,6 +30795,11 @@
width: 114px;
height: 90px;
}
.shield_armoire_flyFishingRod {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_flyFishingRod.png');
width: 114px;
height: 90px;
}
.shield_armoire_gardenersSpade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_gardenersSpade.png');
width: 114px;
@@ -31090,6 +31145,11 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_beekeepersSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_beekeepersSuit.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_blueMoonShozoku {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_blueMoonShozoku.png');
width: 114px;
@@ -31220,6 +31280,11 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_flyFishingWaders {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_flyFishingWaders.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_funnyFoolCostume {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_funnyFoolCostume.png');
width: 114px;
@@ -31425,6 +31490,11 @@
width: 90px;
height: 90px;
}
.slim_armor_armoire_redWaistcoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_redWaistcoat.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_robeOfDiamonds {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_robeOfDiamonds.png');
width: 114px;
@@ -31660,6 +31730,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_beekeepersSmoker {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_beekeepersSmoker.png');
width: 114px;
height: 90px;
}
.weapon_armoire_blueKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_blueKite.png');
width: 114px;
@@ -35560,6 +35635,36 @@
width: 114px;
height: 90px;
}
.back_mystery_202506 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202506.png');
width: 114px;
height: 90px;
}
.shield_mystery_202506 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202506.png');
width: 114px;
height: 90px;
}
.back_mystery_202507 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202507.png');
width: 117px;
height: 120px;
}
.head_mystery_202507 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202507.png');
width: 114px;
height: 90px;
}
.shield_mystery_202508 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202508.png');
width: 117px;
height: 120px;
}
.weapon_mystery_202508 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202508.png');
width: 117px;
height: 120px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;
@@ -37105,6 +37210,26 @@
width: 114px;
height: 117px;
}
.broad_armor_special_summer2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2025Healer.png');
width: 114px;
height: 90px;
}
.broad_armor_special_summer2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2025Mage.png');
width: 114px;
height: 117px;
}
.broad_armor_special_summer2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2025Rogue.png');
width: 114px;
height: 108px;
}
.broad_armor_special_summer2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2025Warrior.png');
width: 114px;
height: 90px;
}
.broad_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summerHealer.png');
width: 90px;
@@ -37335,6 +37460,26 @@
width: 114px;
height: 117px;
}
.head_special_summer2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2025Healer.png');
width: 114px;
height: 90px;
}
.head_special_summer2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2025Mage.png');
width: 114px;
height: 117px;
}
.head_special_summer2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2025Rogue.png');
width: 114px;
height: 108px;
}
.head_special_summer2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2025Warrior.png');
width: 114px;
height: 90px;
}
.head_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summerHealer.png');
width: 90px;
@@ -37510,6 +37655,21 @@
width: 114px;
height: 117px;
}
.shield_special_summer2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2025Healer.png');
width: 114px;
height: 90px;
}
.shield_special_summer2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2025Rogue.png');
width: 114px;
height: 108px;
}
.shield_special_summer2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2025Warrior.png');
width: 114px;
height: 90px;
}
.shield_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summerHealer.png');
width: 90px;
@@ -37730,6 +37890,26 @@
width: 114px;
height: 117px;
}
.slim_armor_special_summer2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2025Healer.png');
width: 114px;
height: 90px;
}
.slim_armor_special_summer2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2025Mage.png');
width: 114px;
height: 117px;
}
.slim_armor_special_summer2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2025Rogue.png');
width: 114px;
height: 108px;
}
.slim_armor_special_summer2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2025Warrior.png');
width: 114px;
height: 90px;
}
.slim_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summerHealer.png');
width: 90px;
@@ -37950,6 +38130,26 @@
width: 114px;
height: 117px;
}
.weapon_special_summer2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2025Healer.png');
width: 114px;
height: 90px;
}
.weapon_special_summer2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2025Mage.png');
width: 114px;
height: 117px;
}
.weapon_special_summer2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2025Rogue.png');
width: 114px;
height: 108px;
}
.weapon_special_summer2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2025Warrior.png');
width: 114px;
height: 90px;
}
.weapon_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summerHealer.png');
width: 90px;
@@ -52508,6 +52708,11 @@
width: 81px;
height: 99px;
}
.Pet-BearCub-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-BearCub-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Cupid.png');
width: 81px;
@@ -52993,6 +53198,11 @@
width: 81px;
height: 99px;
}
.Pet-Cactus-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-Cactus-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Cupid.png');
width: 81px;
@@ -53778,6 +53988,11 @@
width: 81px;
height: 99px;
}
.Pet-Dragon-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-Dragon-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Cupid.png');
width: 81px;
@@ -54268,6 +54483,11 @@
width: 81px;
height: 99px;
}
.Pet-FlyingPig-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-FlyingPig-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Cupid.png');
width: 81px;
@@ -54598,6 +54818,11 @@
width: 81px;
height: 99px;
}
.Pet-Fox-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-Fox-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Cupid.png');
width: 81px;
@@ -55373,6 +55598,11 @@
width: 81px;
height: 99px;
}
.Pet-LionCub-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-LionCub-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Cupid.png');
width: 81px;
@@ -55973,6 +56203,11 @@
width: 81px;
height: 99px;
}
.Pet-PandaCub-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-PandaCub-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Cupid.png');
width: 81px;
@@ -57363,6 +57598,11 @@
width: 81px;
height: 99px;
}
.Pet-TigerCub-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-TigerCub-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Cupid.png');
width: 81px;
@@ -58003,6 +58243,11 @@
width: 81px;
height: 99px;
}
.Pet-Wolf-Cryptid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Cryptid.png');
width: 81px;
height: 99px;
}
.Pet-Wolf-Cupid {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Cupid.png');
width: 81px;
+1 -1
View File
@@ -1,5 +1,5 @@
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.featured-label {
width: auto;
+2 -2
View File
@@ -2,7 +2,7 @@
$grid-gutter-width: 24px;
// Bootstrap and its default variables
@import 'node_modules/bootstrap/scss/bootstrap';
@import '~/bootstrap/scss/bootstrap';
// Bootstrap Vue styles
@import 'node_modules/bootstrap-vue/dist/bootstrap-vue';
@import '~/bootstrap-vue/dist/bootstrap-vue';
@@ -316,3 +316,9 @@
line-height: 2;
padding: 2px 2px;
}
.btn-lg {
font-size: 1.25rem;
line-height: 1.5;
padding: .5rem 1rem;
}
+1 -1
View File
@@ -1,4 +1,4 @@
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h1 {
margin-top: 0px;
+3 -3
View File
@@ -61,13 +61,13 @@ input, textarea, input.form-control, textarea.form-control {
&.input-valid {
padding-right: 27px;
background-image: url(~@/assets/svg/for-css/check.svg);
background-image: url(@/assets/svg/for-css/check.svg);
background-size: 1rem;
}
&.input-invalid {
padding-right: 40px;
background-image: url(~@/assets/svg/for-css/alert.svg);
background-image: url(@/assets/svg/for-css/alert.svg);
background-size: 16px 16px;
border-color: $red-100 !important;
}
@@ -239,7 +239,7 @@ $bg-disabled-control: $gray-10;
&:checked~.custom-control-label::after {
width: 18px;
height: 18px;
background-image: url(~@/assets/svg/for-css/checkbox-white.svg);
background-image: url(@/assets/svg/for-css/checkbox-white.svg);
background-size: 13px 10px;
}
@@ -29,13 +29,13 @@
}
.iconalert-success::before {
background-image: url(~@/assets/svg/for-css/checkbox-white.svg);
background-image: url(@/assets/svg/for-css/checkbox-white.svg);
background-size: 13px 10px;
background-color: #1ca372;
}
.iconalert-warning::before, .iconalert-error::before {
background-image: url(~@/assets/svg/for-css/alert-white.svg);
background-image: url(@/assets/svg/for-css/alert-white.svg);
background-size: 16px 16px;
}
+1 -1
View File
@@ -1,4 +1,4 @@
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.modal {
z-index: 1350;
+8 -3
View File
@@ -46,13 +46,11 @@
.background {
background-repeat: repeat-x;
height:216px;
width: 100%;
position: absolute;
top: 0;
left: 0;
display: flex;
flex-direction: column;
justify-content: center;
@@ -67,6 +65,13 @@
flex-direction: column;
}
.shop-message {
position: relative;
height: 76px;
margin: 71px auto;
width: 240px;
}
.npc {
position: absolute;
left: 0;
+1 -1
View File
@@ -1,4 +1,4 @@
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.container-fluid.static-view {
margin: 5em 2em 0 2em;
+2 -2
View File
@@ -4,7 +4,7 @@
<!-- @TODO i18n. How to setup the strings with the router-link inside?-->
<img
:class="retiredChatPage ? 'mt-5' : 'image-404'"
src="~@/assets/images/404.png"
src="@/assets/images/404.png"
>
<div v-if="retiredChatPage">
<h1>
@@ -48,7 +48,7 @@ export default {
</script>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h1, .static-wrapper h1 {
color: $purple-200;
@@ -107,7 +107,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.btn-primary:active {
border: 2px solid $purple-400 !important;
@@ -193,10 +193,10 @@
import Avatar from '../avatar';
import { mapState } from '@/libs/store';
import markdownDirective from '@/directives/markdown';
import warriorIcon from '@/assets/svg/warrior.svg';
import rogueIcon from '@/assets/svg/rogue.svg';
import healerIcon from '@/assets/svg/healer.svg';
import wizardIcon from '@/assets/svg/wizard.svg';
import warriorIcon from '@/assets/svg/warrior.svg?raw';
import rogueIcon from '@/assets/svg/rogue.svg?raw';
import healerIcon from '@/assets/svg/healer.svg?raw';
import wizardIcon from '@/assets/svg/wizard.svg?raw';
export default {
components: {
@@ -70,7 +70,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h2 {
color: $purple-200;
@@ -100,7 +100,7 @@
</style>
<script>
import closeIcon from '@/assets/svg/close.svg';
import closeIcon from '@/assets/svg/close.svg?raw';
import Sprite from '@/components/ui/sprite.vue';
export default {
@@ -45,7 +45,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/mixins.scss';
@import '@/assets/scss/mixins.scss';
#generic-achievement {
@include centeredModal();
@@ -61,7 +61,7 @@
</style>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.content {
text-align: center;
@@ -98,7 +98,7 @@
<script>
import achievements from '@/../../common/script/content/achievements';
import { mapState } from '@/libs/store';
import svgClose from '@/assets/svg/close.svg';
import svgClose from '@/assets/svg/close.svg?raw';
import Sprite from '@/components/ui/sprite.vue';
export default {
@@ -58,7 +58,7 @@ label(style='display:inline-block') {{ $t('dontShowAgain') }}
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#level-up {
.modal-content {
@@ -157,8 +157,8 @@ label(style='display:inline-block') {{ $t('dontShowAgain') }}
import Avatar from '../avatar';
import Sprite from '@/components/ui/sprite';
import { mapState } from '@/libs/store';
import starGroup from '@/assets/svg/star-group.svg';
import sparkles from '@/assets/svg/sparkles-left.svg';
import starGroup from '@/assets/svg/star-group.svg?raw';
import sparkles from '@/assets/svg/sparkles-left.svg?raw';
const levelQuests = {
15: 'atom1',
@@ -17,7 +17,7 @@
</h2>
<img
class="onboarding-complete-banner d-block"
src="~@/assets/images/onboarding-complete-banner@2x.png"
src="@/assets/images/onboarding-complete-banner@2x.png"
>
<p
v-once
@@ -59,7 +59,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h2 {
color: $purple-200;
@@ -100,7 +100,7 @@ button {
</style>
<script>
import svgClose from '@/assets/svg/close.svg';
import svgClose from '@/assets/svg/close.svg?raw';
export default {
data () {
@@ -97,9 +97,9 @@ import { mapState } from '@/libs/store';
import Sprite from '@/components/ui/sprite';
export default {
components: [
components: {
Sprite,
],
},
data () {
return {
maxHealth,
@@ -73,7 +73,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#won-challenge {
.modal-body {
@@ -96,7 +96,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.purple {
color: $purple-300;
@@ -146,9 +146,9 @@
<script>
import habiticaMarkdown from 'habitica-markdown';
import closeIcon from '@/components/shared/closeIcon';
import sparkles from '@/assets/svg/star-group.svg';
import gem from '@/assets/svg/gem.svg';
import stars from '@/assets/svg/sparkles-left.svg';
import sparkles from '@/assets/svg/star-group.svg?raw';
import gem from '@/assets/svg/gem.svg?raw';
import stars from '@/assets/svg/sparkles-left.svg?raw';
import { mapState } from '@/libs/store';
export default {
@@ -19,7 +19,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.about-row {
margin-left: 0px;
@@ -170,7 +170,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.about-row {
margin-left: 0px;
@@ -401,7 +401,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.input-group-append {
width: auto;
@@ -150,7 +150,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.page-header.btn-flat {
background: transparent;
+14 -12
View File
@@ -403,7 +403,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.footer-row {
margin: 0;
flex: 0 1 auto;
@@ -838,12 +838,12 @@ import moment from 'moment';
import Vue from 'vue';
// images
import melior from '@/assets/svg/melior.svg';
import bluesky from '@/assets/svg/bluesky.svg';
import facebook from '@/assets/svg/facebook.svg';
import instagram from '@/assets/svg/instagram.svg';
import tumblr from '@/assets/svg/tumblr.svg';
import heart from '@/assets/svg/heart.svg';
import melior from '@/assets/svg/melior.svg?raw';
import bluesky from '@/assets/svg/bluesky.svg?raw';
import facebook from '@/assets/svg/facebook.svg?raw';
import instagram from '@/assets/svg/instagram.svg?raw';
import tumblr from '@/assets/svg/tumblr.svg?raw';
import heart from '@/assets/svg/heart.svg?raw';
// components & modals
import { mapState } from '@/libs/store';
@@ -851,12 +851,14 @@ import buyGemsModal from './payments/buyGemsModal.vue';
import reportBug from '@/mixins/reportBug.js';
import { worldStateMixin } from '@/mixins/worldState';
const DEBUG_ENABLED = process.env.DEBUG_ENABLED === 'true'; // eslint-disable-line no-process-env
const TIME_TRAVEL_ENABLED = process.env.TIME_TRAVEL_ENABLED === 'true'; // eslint-disable-line no-process-env
const DEBUG_ENABLED = import.meta.env.DEBUG_ENABLED === 'true';
const TIME_TRAVEL_ENABLED = import.meta.env.TIME_TRAVEL_ENABLED === 'true';
let sinon;
if (TIME_TRAVEL_ENABLED) {
// eslint-disable-next-line global-require
sinon = await import('sinon');
if (import.meta.env.TIME_TRAVEL_ENABLED === 'true') {
(async () => {
sinon = await import('sinon');
})();
}
export default {
@@ -168,7 +168,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.form {
margin: 0 auto;
@@ -227,8 +227,8 @@ import debounce from 'lodash/debounce';
import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { setUpAxios, buildAppleAuthUrl } from '@/libs/auth';
import googleIcon from '@/assets/svg/google.svg';
import appleIcon from '@/assets/svg/apple_black.svg';
import googleIcon from '@/assets/svg/google.svg?raw';
import appleIcon from '@/assets/svg/apple_black.svg?raw';
export default {
name: 'AuthForm',
@@ -290,7 +290,7 @@ export default {
},
mounted () {
hello.init({
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line
google: import.meta.env.GOOGLE_CLIENT_ID, // eslint-disable-line
});
},
methods: {
@@ -220,7 +220,6 @@
v-if="forgotPassword"
id="forgot-form"
@submit.prevent="handleSubmit"
@keyup.enter="handleSubmit"
>
<div class="text-center">
<div>
@@ -268,12 +267,11 @@
v-if="resetPasswordSetNewOne"
id="reset-password-set-new-one-form"
@submit.prevent="handleSubmit"
@keyup.enter="handleSubmit"
>
<div class="text-center">
<div>
<div
class="svg-icon habitica-logo color"
class="svg-icon habitica-logo"
v-html="icons.habiticaIcon"
></div>
</div>
@@ -355,7 +353,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
@media only screen and (min-height: 1080px) {
.bottom-wrap-register {
@@ -491,7 +489,7 @@
#top-background {
.seamless_stars_varied_opacity_repeat {
background-image: url('~@/assets/images/auth/seamless_stars_varied_opacity.png');
background-image: url('@/assets/images/auth/seamless_stars_varied_opacity.png');
background-repeat: repeat-x;
position: absolute;
height: 500px;
@@ -510,7 +508,7 @@
position: relative;
.seamless_mountains_demo_repeat {
background-image: url('~@/assets/images/auth/seamless_mountains_demo.png');
background-image: url('@/assets/images/auth/seamless_mountains_demo.png');
background-repeat: repeat-x;
width: 100%;
height: 300px;
@@ -520,7 +518,7 @@
}
.midground_foreground_extended2 {
background-image: url('~@/assets/images/auth/midground_foreground_extended2.png');
background-image: url('@/assets/images/auth/midground_foreground_extended2.png');
position: relative;
width: 1500px;
max-width: 100%;
@@ -611,11 +609,11 @@ import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { buildAppleAuthUrl } from '../../libs/auth';
import sanitizeRedirect from '@/mixins/sanitizeRedirect';
import exclamation from '@/assets/svg/exclamation.svg';
import gryphon from '@/assets/svg/gryphon.svg';
import habiticaIcon from '@/assets/svg/logo-horizontal.svg';
import googleIcon from '@/assets/svg/google.svg';
import appleIcon from '@/assets/svg/apple_black.svg';
import exclamation from '@/assets/svg/exclamation.svg?raw';
import gryphon from '@/assets/svg/gryphon.svg?raw';
import habiticaIcon from '@/assets/svg/logo-horizontal.svg?raw';
import googleIcon from '@/assets/svg/google.svg?raw';
import appleIcon from '@/assets/svg/apple_black.svg?raw';
export default {
mixins: [sanitizeRedirect],
@@ -726,9 +724,13 @@ export default {
},
mounted () {
this.forgotPassword = this.$route.path.startsWith('/forgot-password');
if (this.forgotPassword) {
if (this.$route.query.email) {
this.username = this.$route.query.email;
}
}
hello.init({
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line
google: import.meta.env.GOOGLE_CLIENT_ID, // eslint-disable-line
});
},
methods: {
+1 -1
View File
@@ -97,7 +97,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.avatar {
width: 141px;
@@ -27,7 +27,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.bottom-banner {
background: linear-gradient(114.26deg, $purple-300 0%, $purple-200 100%);
@@ -55,7 +55,7 @@
</style>
<script>
import sparkles from '@/assets/svg/sparkles-left.svg';
import sparkles from '@/assets/svg/sparkles-left.svg?raw';
export default {
data () {
@@ -42,8 +42,8 @@
</template>
<script>
import gem from '@/assets/svg/gem.svg';
import gold from '@/assets/svg/gold.svg';
import gem from '@/assets/svg/gem.svg?raw';
import gold from '@/assets/svg/gold.svg?raw';
import { avatarEditorUtilities } from '../../mixins/avatarEditUtilities';
import Sprite from '@/components/ui/sprite.vue';
@@ -72,7 +72,7 @@ export default {
</script>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.customize-options {
width: 100%;
@@ -19,7 +19,7 @@ export default {
</script>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.sub-menu {
display: flex;
@@ -30,8 +30,9 @@
<script>
import markdownDirective from '@/directives/markdown';
import { LOCALSTORAGE_AUTH_KEY } from '@/libs/auth';
const COMMUNITY_MANAGER_EMAIL = process.env.EMAILS_COMMUNITY_MANAGER_EMAIL; // eslint-disable-line
const COMMUNITY_MANAGER_EMAIL = import.meta.env.EMAILS_COMMUNITY_MANAGER_EMAIL; // eslint-disable-line
export default {
directives: {
@@ -39,7 +40,7 @@ export default {
},
computed: {
bannedMessage () {
const AUTH_SETTINGS = localStorage.getItem('habit-mobile-settings');
const AUTH_SETTINGS = localStorage.getItem(LOCALSTORAGE_AUTH_KEY);
const parseSettings = JSON.parse(AUTH_SETTINGS);
const userId = parseSettings ? parseSettings.auth.apiId : '';
@@ -118,7 +118,7 @@
</style>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h2 {
color: $white;
@@ -70,7 +70,7 @@
</style>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h2 {
color: $white;
@@ -134,7 +134,7 @@ label {
<script>
import closeIcon from '@/components/shared/closeIcon';
import checkCircleIcon from '@/assets/svg/check_circle.svg';
import checkCircleIcon from '@/assets/svg/check_circle.svg?raw';
import { MODALS } from '@/libs/consts';
export default {
@@ -75,16 +75,20 @@
class="box member-count"
@click="showMemberModal()"
>
<div
class="svg-icon member-icon"
v-html="icons.memberIcon"
></div>
{{ challenge.memberCount }}
<div
v-once
class="details"
>
{{ $t('participantsTitle') }}
<div class="box-content">
<div class="icon-number-row">
<div
class="svg-icon member-icon"
v-html="icons.memberIcon"
></div>
<span class="number">{{ challenge.memberCount }}</span>
</div>
<div
v-once
class="details"
>
{{ $t('participantsTitle') }}
</div>
</div>
</div>
<div class="box">
@@ -259,7 +263,7 @@
</template>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h1 {
color: $purple-200;
@@ -304,7 +308,7 @@
.box {
display: inline-block;
padding: 1em;
padding: 0.5em;
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);
@@ -314,22 +318,69 @@
text-align: center;
font-size: 20px;
vertical-align: bottom;
overflow: hidden;
position: relative;
&.member-count:hover {
cursor: pointer;
}
.box-content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
}
.icon-number-row {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0.1em;
.number {
font-size: 20px;
font-weight: normal;
margin-left: 0.2em;
}
}
.svg-icon {
width: 30px;
display: inline-block;
margin-right: .2em;
vertical-align: bottom;
}
.details {
font-size: 12px;
margin-top: 0.4em;
color: $gray-200;
width: 100%;
padding: 0 4px;
line-height: 1.15;
word-break: break-word;
max-height: 2.3em;
overflow: visible;
}
&.member-count {
.icon-number-row {
.svg-icon {
width: 24px;
height: 24px;
}
.number {
font-size: 18px;
}
}
.details {
font-size: 11px;
line-height: 1.1;
max-height: 2.2em;
}
}
}
@@ -380,9 +431,9 @@ import sidebarSection from '../sidebarSection';
import userLink from '../userLink';
import groupLink from '../groupLink';
import gemIcon from '@/assets/svg/gem.svg';
import memberIcon from '@/assets/svg/member-icon.svg';
import calendarIcon from '@/assets/svg/calendar.svg';
import gemIcon from '@/assets/svg/gem.svg?raw';
import memberIcon from '@/assets/svg/member-icon.svg?raw';
import calendarIcon from '@/assets/svg/calendar.svg?raw';
const TASK_KEYS_TO_REMOVE = ['_id', 'completed', 'date', 'dateCompleted', 'history', 'id', 'streak', 'createdAt', 'challenge'];
@@ -106,7 +106,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
// Have to use this, because v-markdown creates p element in h3. Scoping doesn't work with it.
.challenge-title > p {
display: -webkit-box;
@@ -127,7 +127,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.challenge {
background-color: $white;
@@ -377,14 +377,14 @@ import categoryTags from '../categories/categoryTags';
import markdownDirective from '@/directives/markdown';
import { mapState } from '@/libs/store';
import gemIcon from '@/assets/svg/gem.svg';
import memberIcon from '@/assets/svg/member-icon.svg';
import calendarIcon from '@/assets/svg/calendar.svg';
import habitIcon from '@/assets/svg/habit.svg';
import todoIcon from '@/assets/svg/todo.svg';
import dailyIcon from '@/assets/svg/daily.svg';
import rewardIcon from '@/assets/svg/reward.svg';
import officialIcon from '@/assets/svg/official.svg';
import gemIcon from '@/assets/svg/gem.svg?raw';
import memberIcon from '@/assets/svg/member-icon.svg?raw';
import calendarIcon from '@/assets/svg/calendar.svg?raw';
import habitIcon from '@/assets/svg/habit.svg?raw';
import todoIcon from '@/assets/svg/todo.svg?raw';
import dailyIcon from '@/assets/svg/daily.svg?raw';
import rewardIcon from '@/assets/svg/reward.svg?raw';
import officialIcon from '@/assets/svg/official.svg?raw';
export default {
components: {
@@ -207,7 +207,7 @@
</template>
<style lang='scss'>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#challenge-modal {
h5 {
@@ -81,7 +81,7 @@
</template>
<style lang='scss'>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#close-challenge-modal {
h2 {
@@ -98,7 +98,7 @@
}
.support-habitica {
background-image: url('~@/assets/svg/for-css/support-habitica-gems.svg');
background-image: url('@/assets/svg/for-css/support-habitica-gems.svg?raw');
width: 325px;
height: 89px;
margin: 0 auto;
@@ -63,7 +63,7 @@
</template>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
@media only screen and (max-width: 768px) {
.header-row {
@@ -122,7 +122,7 @@ import challengeModal from './challengeModal';
import externalLinks from '@/mixins/externalLinks';
import challengeUtilities from '@/mixins/challengeUtilities';
import positiveIcon from '@/assets/svg/positive.svg';
import positiveIcon from '@/assets/svg/positive.svg?raw';
export default {
components: {
@@ -49,7 +49,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.no-challenge-section {
padding: 2em;
@@ -84,7 +84,7 @@ import markdownDirective from '@/directives/markdown';
import externalLinks from '../../mixins/externalLinks';
import challengeItem from './challengeItem';
import challengeIcon from '@/assets/svg/challenge.svg';
import challengeIcon from '@/assets/svg/challenge.svg?raw';
export default {
components: {
@@ -86,7 +86,7 @@
</template>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
@media only screen and (max-width: 768px) {
.header-row {
@@ -150,8 +150,8 @@ import challengeModal from './challengeModal';
import challengeUtilities from '@/mixins/challengeUtilities';
import externalLinks from '@/mixins/externalLinks';
import challengeIcon from '@/assets/svg/challenge.svg';
import positiveIcon from '@/assets/svg/positive.svg';
import challengeIcon from '@/assets/svg/challenge.svg?raw';
import positiveIcon from '@/assets/svg/positive.svg?raw';
export default {
components: {
@@ -102,7 +102,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.modal-body {
padding: 0px 8px 0px 8px;
@@ -207,8 +207,8 @@ import { mapState } from '@/libs/store';
import notifications from '@/mixins/notifications';
import { userStateMixin } from '../../mixins/userState';
import markdownDirective from '@/directives/markdown';
import svgClose from '@/assets/svg/close.svg';
import svgReport from '@/assets/svg/report.svg';
import svgClose from '@/assets/svg/close.svg?raw';
import svgReport from '@/assets/svg/report.svg?raw';
export default {
directives: {
@@ -34,8 +34,8 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/tiers.scss';
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/tiers.scss';
@import '@/assets/scss/colors.scss';
.autocomplete-results {
padding: .5em;
@@ -74,16 +74,16 @@
<script>
import groupBy from 'lodash/groupBy';
import styleHelper from '@/mixins/styleHelper';
import tier1 from '@/assets/svg/tier-1.svg';
import tier2 from '@/assets/svg/tier-2.svg';
import tier3 from '@/assets/svg/tier-3.svg';
import tier4 from '@/assets/svg/tier-4.svg';
import tier5 from '@/assets/svg/tier-5.svg';
import tier6 from '@/assets/svg/tier-6.svg';
import tier7 from '@/assets/svg/tier-7.svg';
import tier8 from '@/assets/svg/tier-mod.svg';
import tier9 from '@/assets/svg/tier-staff.svg';
import tierNPC from '@/assets/svg/tier-npc.svg';
import tier1 from '@/assets/svg/tier-1.svg?raw';
import tier2 from '@/assets/svg/tier-2.svg?raw';
import tier3 from '@/assets/svg/tier-3.svg?raw';
import tier4 from '@/assets/svg/tier-4.svg?raw';
import tier5 from '@/assets/svg/tier-5.svg?raw';
import tier6 from '@/assets/svg/tier-6.svg?raw';
import tier7 from '@/assets/svg/tier-7.svg?raw';
import tier8 from '@/assets/svg/tier-mod.svg?raw';
import tier9 from '@/assets/svg/tier-staff.svg?raw';
import tierNPC from '@/assets/svg/tier-npc.svg?raw';
export default {
mixins: [styleHelper],
@@ -63,7 +63,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.avatar {
width: 10%;
@@ -95,7 +95,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.modal-body {
padding: 0px 8px 0px 8px;
@@ -199,7 +199,7 @@
import notifications from '@/mixins/notifications';
import markdownDirective from '@/directives/markdown';
import { userStateMixin } from '../../mixins/userState';
import svgClose from '@/assets/svg/close.svg';
import svgClose from '@/assets/svg/close.svg?raw';
export default {
directives: {
+14 -14
View File
@@ -572,7 +572,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
$dialogMarginTop: 56px;
$userCreationBgHeight: 105px;
@@ -671,7 +671,7 @@
}
.user-creation-bg {
background-image: url('~@/assets/creator/creator-hills-bg.png');
background-image: url('@/assets/creator/creator-hills-bg.png');
height: $userCreationBgHeight;
width: 219px;
margin: 0 auto;
@@ -1001,18 +1001,18 @@ import hairSettings from './avatarModal/hair-settings';
import extraSettings from './avatarModal/extra-settings';
import closeX from './ui/closeX';
import logoPurple from '@/assets/svg/logo-purple.svg';
import bodyIcon from '@/assets/svg/body.svg';
import accessoriesIcon from '@/assets/svg/accessories.svg';
import skinIcon from '@/assets/svg/skin.svg';
import hairIcon from '@/assets/svg/hair.svg';
import backgroundsIcon from '@/assets/svg/backgrounds.svg';
import gem from '@/assets/svg/gem.svg';
import hourglass from '@/assets/svg/hourglass.svg';
import gold from '@/assets/svg/gold.svg';
import arrowRight from '@/assets/svg/arrow_right.svg';
import arrowLeft from '@/assets/svg/arrow_left.svg';
import svgClose from '@/assets/svg/close.svg';
import logoPurple from '@/assets/svg/logo-purple.svg?raw';
import bodyIcon from '@/assets/svg/body.svg?raw';
import accessoriesIcon from '@/assets/svg/accessories.svg?raw';
import skinIcon from '@/assets/svg/skin.svg?raw';
import hairIcon from '@/assets/svg/hair.svg?raw';
import backgroundsIcon from '@/assets/svg/backgrounds.svg?raw';
import gem from '@/assets/svg/gem.svg?raw';
import hourglass from '@/assets/svg/hourglass.svg?raw';
import gold from '@/assets/svg/gold.svg?raw';
import arrowRight from '@/assets/svg/arrow_right.svg?raw';
import arrowLeft from '@/assets/svg/arrow_left.svg?raw';
import svgClose from '@/assets/svg/close.svg?raw';
import { avatarEditorUtilities } from '../mixins/avatarEditUtilities';
import Sprite from './ui/sprite';
@@ -60,7 +60,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#external-link-modal {
&.modal {
@@ -174,8 +174,8 @@
</style>
<script>
import exclamationIcon from '@/assets/svg/exclamation.svg';
import closeIcon from '@/assets/svg/new-close.svg';
import exclamationIcon from '@/assets/svg/exclamation.svg?raw';
import closeIcon from '@/assets/svg/new-close.svg?raw';
export default {
data () {
+1 -1
View File
@@ -39,7 +39,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.face-avatar {
width: 36px;
@@ -108,7 +108,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h2 {
color: $purple-300;
@@ -201,7 +201,7 @@
</style>
<style lang="scss">
@import '~@/assets/scss/mixins.scss';
@import '@/assets/scss/mixins.scss';
#create-group {
.modal-dialog {
max-width: 448px;
@@ -28,9 +28,9 @@
></div>
<img
class="task-columns"
src="~@/assets/images/group-plans/task-columns.png"
srcset="~@/assets/images/group-plans/task-columns@2x.png 2x,
~@/assets/images/group-plans/task-columns@3x.png 3x"
src="@/assets/images/group-plans/task-columns.png"
srcset="@/assets/images/group-plans/task-columns@2x.png 2x,
@/assets/images/group-plans/task-columns@3x.png 3x"
>
</div>
<div
@@ -96,7 +96,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#group-plans-update {
.modal-content {
border-top-left-radius: 10px;
@@ -125,7 +125,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h2 {
color: $white;
line-height: 28px;
@@ -183,8 +183,8 @@
</style>
<script>
import closeIcon from '@/assets/svg/close.svg';
import sparkles from '@/assets/svg/sparkles-left.svg';
import closeIcon from '@/assets/svg/close.svg?raw';
import sparkles from '@/assets/svg/sparkles-left.svg?raw';
export default {
data () {
@@ -125,8 +125,8 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/create-task.scss';
@import '@/assets/scss/colors.scss';
@import '@/assets/scss/create-task.scss';
h1 {
color: $purple-300;
@@ -190,13 +190,13 @@ import toggleSwitch from '@/components/ui/toggleSwitch';
import sync from '../../mixins/sync';
import positiveIcon from '@/assets/svg/positive.svg';
import filterIcon from '@/assets/svg/filter.svg';
import deleteIcon from '@/assets/svg/delete.svg';
import habitIcon from '@/assets/svg/habit.svg';
import dailyIcon from '@/assets/svg/daily.svg';
import todoIcon from '@/assets/svg/todo.svg';
import rewardIcon from '@/assets/svg/reward.svg';
import positiveIcon from '@/assets/svg/positive.svg?raw';
import filterIcon from '@/assets/svg/filter.svg?raw';
import deleteIcon from '@/assets/svg/delete.svg?raw';
import habitIcon from '@/assets/svg/habit.svg?raw';
import dailyIcon from '@/assets/svg/daily.svg?raw';
import todoIcon from '@/assets/svg/todo.svg?raw';
import rewardIcon from '@/assets/svg/reward.svg?raw';
import * as Analytics from '@/libs/analytics';
import { mapState } from '@/libs/store';
@@ -212,8 +212,8 @@ export default {
</script>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/variables.scss';
@import '@/assets/scss/colors.scss';
@import '@/assets/scss/variables.scss';
.chat-actions {
margin-top: 1em;
@@ -21,7 +21,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.community-guidelines {
background-color: rgba(135, 129, 144, 0.84);
@@ -114,7 +114,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.copy-icon {
width: 1rem;
@@ -163,7 +163,7 @@
width: 100%;
.quest_screen {
background-image: url('~@/assets/images/group@3x.png');
background-image: url('@/assets/images/group@3x.png');
background-size: cover;
width: 100%;
height: 246px;
@@ -196,7 +196,7 @@
}
.join-party {
background-image: url('~@/assets/images/party.png');
background-image: url('@/assets/images/party.png');
background-size: cover;
width: 203px;
height: 66px;
@@ -244,7 +244,7 @@ import * as Analytics from '@/libs/analytics';
import notifications from '@/mixins/notifications';
import closeX from '../ui/closeX';
import copyIcon from '@/assets/svg/copy.svg';
import copyIcon from '@/assets/svg/copy.svg?raw';
import copyToClipboard from '@/mixins/copyToClipboard';
export default {
@@ -65,7 +65,7 @@ b-dropdown(:text="$t('sort')", right=true)
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.sort-select {
margin: 2em;
@@ -95,7 +95,7 @@ import PublicGuildItem from './publicGuildItem';
import Sidebar from './groupSidebar';
import groupUtilities from '@/mixins/groupsUtilities';
import positiveIcon from '@/assets/svg/positive.svg';
import positiveIcon from '@/assets/svg/positive.svg?raw';
function _mapCategories (guilds) {
guilds.forEach(guild => {
+12 -12
View File
@@ -115,7 +115,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
@media (min-width: 1300px) {
.standard-page {
@@ -297,17 +297,17 @@ import markdownDirective from '@/directives/markdown';
import chat from './chat';
import userLink from '../userLink';
import deleteIcon from '@/assets/svg/delete.svg';
import copyIcon from '@/assets/svg/copy.svg';
import likeIcon from '@/assets/svg/like.svg';
import likedIcon from '@/assets/svg/liked.svg';
import reportIcon from '@/assets/svg/report.svg';
import gemIcon from '@/assets/svg/gem.svg';
import questIcon from '@/assets/svg/quest.svg';
import questBackground from '@/assets/svg/quest-background-border.svg';
import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-small.svg';
import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-small.svg';
import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-small.svg';
import deleteIcon from '@/assets/svg/delete.svg?raw';
import copyIcon from '@/assets/svg/copy.svg?raw';
import likeIcon from '@/assets/svg/like.svg?raw';
import likedIcon from '@/assets/svg/liked.svg?raw';
import reportIcon from '@/assets/svg/report.svg?raw';
import gemIcon from '@/assets/svg/gem.svg?raw';
import questIcon from '@/assets/svg/quest.svg?raw';
import questBackground from '@/assets/svg/quest-background-border.svg?raw';
import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-small.svg?raw';
import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-small.svg?raw';
import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-small.svg?raw';
import QuestDetailModal from './questDetailModal';
import RightSidebar from '@/components/groups/rightSidebar';
import InvitationListModal from './invitationListModal';
@@ -312,7 +312,7 @@ label.custom-control-label(v-once) {{ $t('allowGuildInvitationsFromNonMembers')
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.custom-control-input {
z-index: 1 !important;
@@ -376,8 +376,8 @@ import { MAX_SUMMARY_SIZE_FOR_GUILDS } from '@/../../common/script/constants';
import CategoryOptions from '@/../../common/script/content/categoryOptions';
import toggleSwitch from '@/components/ui/toggleSwitch';
import markdownDirective from '@/directives/markdown';
import gemIcon from '@/assets/svg/gem.svg';
import informationIcon from '@/assets/svg/information.svg';
import gemIcon from '@/assets/svg/gem.svg?raw';
import informationIcon from '@/assets/svg/information.svg?raw';
import { userStateMixin } from '../../mixins/userState';
@@ -79,7 +79,7 @@
</template>
<style lang='scss'>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#invitation-list {
.modal-header {
@@ -127,7 +127,7 @@
</style>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.header-wrap {
width: 100%;
@@ -242,8 +242,8 @@ import CloseIcon from '../shared/closeIcon';
import ClassBadge from '../members/classBadge';
import UserLabel from '../userLabel';
import svgClose from '@/assets/svg/close.svg';
import svgCheck from '@/assets/svg/check.svg';
import svgClose from '@/assets/svg/close.svg?raw';
import svgCheck from '@/assets/svg/check.svg?raw';
export default {
components: {
@@ -75,7 +75,7 @@
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
a:not([href]) {
font-size: 16px;
@@ -126,7 +126,7 @@ import isEmail from 'validator/es/lib/isEmail';
import isUUID from 'validator/es/lib/isUUID';
import { mapState } from '@/libs/store';
import notifications from '@/mixins/notifications';
import positiveIcon from '@/assets/svg/positive.svg';
import positiveIcon from '@/assets/svg/positive.svg?raw';
const INVITE_DEFAULTS = { text: '', error: null, valid: null };
@@ -128,7 +128,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h1 {
color: $purple-300;
@@ -252,12 +252,12 @@ import Avatar from '../avatar';
import userLink from '../userLink';
import { mapState } from '@/libs/store';
import syncIcon from '@/assets/svg/sync-2.svg';
import usersIcon from '@/assets/svg/users.svg';
import warriorIcon from '@/assets/svg/warrior.svg';
import rogueIcon from '@/assets/svg/rogue.svg';
import healerIcon from '@/assets/svg/healer.svg';
import wizardIcon from '@/assets/svg/wizard.svg';
import syncIcon from '@/assets/svg/sync-2.svg?raw';
import usersIcon from '@/assets/svg/users.svg?raw';
import warriorIcon from '@/assets/svg/warrior.svg?raw';
import rogueIcon from '@/assets/svg/rogue.svg?raw';
import healerIcon from '@/assets/svg/healer.svg?raw';
import wizardIcon from '@/assets/svg/wizard.svg?raw';
export default {
components: {
@@ -45,6 +45,9 @@
<div class="col-5">
<select-list
:items="sortOptions"
:hide-icon="false"
:inline-dropdown="false"
:direct-select="true"
:value="optionEntryBySelectedValue"
key-prop="value"
@select="changeSortOption($event)"
@@ -61,6 +64,9 @@
<select-list
:items="sortDirections"
:value="directionEntryBySelectedValue"
:hide-icon="false"
:inline-dropdown="false"
:direct-select="true"
key-prop="value"
@select="changeSortDirection($event)"
>
@@ -278,7 +284,7 @@
</style>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.apply-options {
padding: 1em;
@@ -372,10 +378,10 @@ import isEmpty from 'lodash/isEmpty';
import removeMemberModal from '@/components/members/removeMemberModal';
import loadingGryphon from '@/components/ui/loadingGryphon';
import MemberDetails from '../memberDetails';
import blockIcon from '@/assets/svg/block.svg';
import messageIcon from '@/assets/members/message.svg';
import starIcon from '@/assets/members/star.svg';
import dots from '@/assets/svg/dots.svg';
import blockIcon from '@/assets/svg/block.svg?raw';
import messageIcon from '@/assets/members/message.svg?raw';
import starIcon from '@/assets/members/star.svg?raw';
import dots from '@/assets/svg/dots.svg?raw';
import SelectList from '@/components/ui/selectList';
import { PAGES } from '@/libs/consts';
import { userStateMixin } from '../../mixins/userState';
@@ -81,7 +81,7 @@ b-dropdown(:text="$t('sort')", right=true)
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.sort-select {
margin: 2em;
}
@@ -115,8 +115,8 @@ import groupUtilities from '@/mixins/groupsUtilities';
import PublicGuildItem from './publicGuildItem';
import Sidebar from './groupSidebar';
import greyBadgeIcon from '@/assets/svg/grey-badge.svg';
import positiveIcon from '@/assets/svg/positive.svg';
import greyBadgeIcon from '@/assets/svg/grey-badge.svg?raw';
import positiveIcon from '@/assets/svg/positive.svg?raw';
export default {
components: { PublicGuildItem, Sidebar },
@@ -87,7 +87,7 @@
</style>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.header-wrap {
width: 100%;
@@ -109,7 +109,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.card-link {
color: #4E4A57 !important;
@@ -218,10 +218,10 @@ import { mapState } from '@/libs/store';
import categoryTags from '../categories/categoryTags';
import groupUtilities from '@/mixins/groupsUtilities';
import markdown from '@/directives/markdown';
import gemIcon from '@/assets/svg/gem.svg';
import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-large.svg';
import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-large.svg';
import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-large.svg';
import gemIcon from '@/assets/svg/gem.svg?raw';
import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-large.svg?raw';
import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-large.svg?raw';
import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-large.svg?raw';
export default {
directives: {
@@ -151,7 +151,7 @@
</template>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h2 {
color: $purple-300;
@@ -308,7 +308,7 @@ import getItemInfo from '@/../../common/script/libs/getItemInfo';
import { mapState } from '@/libs/store';
import * as Analytics from '@/libs/analytics';
import navigationBack from '@/assets/svg/navigation_back.svg';
import navigationBack from '@/assets/svg/navigation_back.svg?raw';
import questDialogContent from '../shops/quests/questDialogContent';
import closeIcon from '../shared/closeIcon';
import QuestRewards from '../shops/quests/questRewards';
@@ -268,7 +268,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.svg-icon {
height: 25px;
@@ -644,10 +644,10 @@ import { mapState } from '@/libs/store';
import sidebarSection from '../sidebarSection';
import Sprite from '../ui/sprite';
import questIcon from '@/assets/svg/quest.svg';
import swordIcon from '@/assets/svg/sword.svg';
import rageIcon from '@/assets/svg/rage.svg';
import healthNoPaddingIcon from '@/assets/svg/health_no_padding.svg';
import questIcon from '@/assets/svg/quest.svg?raw';
import swordIcon from '@/assets/svg/sword.svg?raw';
import rageIcon from '@/assets/svg/rage.svg?raw';
import healthNoPaddingIcon from '@/assets/svg/health_no_padding.svg?raw';
import questActionsMixin from '@/components/groups/questActions.mixin';
export default {
@@ -143,12 +143,12 @@ import questSidebarSection from '@/components/groups/questSidebarSection';
import sidebarSection from '@/components/sidebarSection';
import markdownDirective from '@/directives/markdown';
import menuIcon from '@/assets/svg/menu.svg';
import sparklesIcon from '@/assets/svg/sparklesIcon.svg';
import leaveIcon from '@/assets/svg/leave.svg';
import editIcon from '@/assets/svg/edit.svg';
import messageIcon from '@/assets/svg/message.svg';
import usersIcon from '@/assets/svg/users.svg';
import menuIcon from '@/assets/svg/menu.svg?raw';
import sparklesIcon from '@/assets/svg/sparklesIcon.svg?raw';
import leaveIcon from '@/assets/svg/leave.svg?raw';
import editIcon from '@/assets/svg/edit.svg?raw';
import messageIcon from '@/assets/svg/message.svg?raw';
import usersIcon from '@/assets/svg/users.svg?raw';
export default {
components: {
@@ -181,7 +181,7 @@ export default {
</script>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
@media (min-width: 1300px) {
.sidebar {
+25 -25
View File
@@ -157,12 +157,12 @@
<img
v-if="!group.quest.extra.worldDmg.seasonalShop"
class="rage-strike"
src="~@/assets/images/world-boss/rage_strike@2x.png"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.seasonalShop"
class="rage-strike-active"
src="~@/assets/images/world-boss/rage_strike-seasonalShop@2x.png"
src="@/assets/images/world-boss/rage_strike-seasonalShop@2x.png"
>
</div>
<div
@@ -172,12 +172,12 @@
<img
v-if="!group.quest.extra.worldDmg.market"
class="rage-strike"
src="~@/assets/images/world-boss/rage_strike@2x.png"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.market"
class="rage-strike-active"
src="~@/assets/images/world-boss/rage_strike-market@2x.png"
src="@/assets/images/world-boss/rage_strike-market@2x.png"
>
</div>
<div
@@ -187,12 +187,12 @@
<img
v-if="!group.quest.extra.worldDmg.quests"
class="rage-strike"
src="~@/assets/images/world-boss/rage_strike@2x.png"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.quests"
class="rage-strike-active"
src="~@/assets/images/world-boss/rage_strike-quests@2x.png"
src="@/assets/images/world-boss/rage_strike-quests@2x.png"
>
</div>
</div>
@@ -486,7 +486,7 @@
</template>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
h1 {
color: $purple-200;
@@ -756,25 +756,25 @@ import worldBossRageModal from '../world-boss/worldBossRageModal';
import sidebarSection from '../sidebarSection';
import chat from './chat';
import challengeIcon from '@/assets/svg/challenge.svg';
import chevronIcon from '@/assets/svg/chevron-red.svg';
import gemIcon from '@/assets/svg/gem.svg';
import healthIcon from '@/assets/svg/health.svg';
import informationIconRed from '@/assets/svg/information-red.svg';
import questBackground from '@/assets/svg/quest-background-border.svg';
import rageIcon from '@/assets/svg/rage.svg';
import swordIcon from '@/assets/svg/sword.svg';
import challengeIcon from '@/assets/svg/challenge.svg?raw';
import chevronIcon from '@/assets/svg/chevron-red.svg?raw';
import gemIcon from '@/assets/svg/gem.svg?raw';
import healthIcon from '@/assets/svg/health.svg?raw';
import informationIconRed from '@/assets/svg/information-red.svg?raw';
import questBackground from '@/assets/svg/quest-background-border.svg?raw';
import rageIcon from '@/assets/svg/rage.svg?raw';
import swordIcon from '@/assets/svg/sword.svg?raw';
import tier1 from '@/assets/svg/tier-1.svg';
import tier2 from '@/assets/svg/tier-2.svg';
import tier3 from '@/assets/svg/tier-3.svg';
import tier4 from '@/assets/svg/tier-4.svg';
import tier5 from '@/assets/svg/tier-5.svg';
import tier6 from '@/assets/svg/tier-6.svg';
import tier7 from '@/assets/svg/tier-7.svg';
import tierMod from '@/assets/svg/tier-mod.svg';
import tierNPC from '@/assets/svg/tier-npc.svg';
import tierStaff from '@/assets/svg/tier-staff.svg';
import tier1 from '@/assets/svg/tier-1.svg?raw';
import tier2 from '@/assets/svg/tier-2.svg?raw';
import tier3 from '@/assets/svg/tier-3.svg?raw';
import tier4 from '@/assets/svg/tier-4.svg?raw';
import tier5 from '@/assets/svg/tier-5.svg?raw';
import tier6 from '@/assets/svg/tier-6.svg?raw';
import tier7 from '@/assets/svg/tier-7.svg?raw';
import tierMod from '@/assets/svg/tier-mod.svg?raw';
import tierNPC from '@/assets/svg/tier-npc.svg?raw';
import tierStaff from '@/assets/svg/tier-staff.svg?raw';
import staffList from '../../libs/staffList';
import reportBug from '@/mixins/reportBug.js';
@@ -20,7 +20,7 @@ body.modal-open .habitica-top-banner {
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.habitica-top-banner {
width: 100%;
@@ -41,7 +41,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.announce-text {
color: $purple-50;
@@ -56,7 +56,7 @@
rgba(255,190,93,1) 25%,
rgba(255,190,93,1) 75%,
rgba(255,190,93,0) 100%),
url('~@/assets/images/glitter.png');
url('@/assets/images/glitter.png');
cursor: pointer;
}
@@ -86,8 +86,8 @@ import find from 'lodash/find';
import { mapState } from '@/libs/store';
import BaseBanner from './base';
import giftsBirthday from '@/assets/svg/gifts-birthday.svg';
import tenBirthday from '@/assets/svg/10th-birthday-linear.svg';
import giftsBirthday from '@/assets/svg/gifts-birthday.svg?raw';
import tenBirthday from '@/assets/svg/10th-birthday-linear.svg?raw';
export default {
components: {
@@ -17,7 +17,7 @@
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.chat-banner {
width: 100%;
@@ -28,7 +28,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.resting-banner {
background-color: $blue-10;
@@ -15,62 +15,62 @@
v-if="eventName === 'fall_extra_gems'"
class="d-none d-xl-block"
srcset="
~@/assets/images/gems/fall-confetti-left/confetti.png,
~@/assets/images/gems/fall-confetti-left/confetti@2x.png 2x,
~@/assets/images/gems/fall-confetti-left/confetti@3x.png 3x"
src="~@/assets/images/gems/fall-confetti-left/confetti.png"
@/assets/images/gems/fall-confetti-left/confetti.png,
@/assets/images/gems/fall-confetti-left/confetti@2x.png 2x,
@/assets/images/gems/fall-confetti-left/confetti@3x.png 3x"
src="@/assets/images/gems/fall-confetti-left/confetti.png"
>
<img
v-else-if="eventName === 'spooky_extra_gems'"
class="d-none d-xl-block"
srcset="
~@/assets/images/gems/spooky-confetti-left/confetti.png,
~@/assets/images/gems/spooky-confetti-left/confetti@2x.png 2x,
~@/assets/images/gems/spooky-confetti-left/confetti@3x.png 3x"
src="~@/assets/images/gems/spooky-confetti-left/confetti.png"
@/assets/images/gems/spooky-confetti-left/confetti.png,
@/assets/images/gems/spooky-confetti-left/confetti@2x.png 2x,
@/assets/images/gems/spooky-confetti-left/confetti@3x.png 3x"
src="@/assets/images/gems/spooky-confetti-left/confetti.png"
>
<div class="promo-test">
<img
v-if="eventName === 'fall_extra_gems'"
srcset="
~@/assets/images/gems/fall-text/text.png,
~@/assets/images/gems/fall-text/text@2x.png 2x,
~@/assets/images/gems/fall-text/text@3x.png 3x"
src="~@/assets/images/gems/fall-text/text.png"
@/assets/images/gems/fall-text/text.png,
@/assets/images/gems/fall-text/text@2x.png 2x,
@/assets/images/gems/fall-text/text@3x.png 3x"
src="@/assets/images/gems/fall-text/text.png"
>
<img
v-else-if="eventName === 'spooky_extra_gems'"
srcset="
~@/assets/images/gems/spooky-text/text.png,
~@/assets/images/gems/spooky-text/text@2x.png 2x,
~@/assets/images/gems/spooky-text/text@3x.png 3x"
src="~@/assets/images/gems/spooky-text/text.png"
@/assets/images/gems/spooky-text/text.png,
@/assets/images/gems/spooky-text/text@2x.png 2x,
@/assets/images/gems/spooky-text/text@3x.png 3x"
src="@/assets/images/gems/spooky-text/text.png"
>
</div>
<img
v-if="eventName === 'fall_extra_gems'"
class="d-none d-xl-block"
srcset="
~@/assets/images/gems/fall-confetti-right/confetti.png,
~@/assets/images/gems/fall-confetti-right/confetti@2x.png 2x,
~@/assets/images/gems/fall-confetti-right/confetti@3x.png 3x"
src="~@/assets/images/gems/fall-confetti-right/confetti.png"
@/assets/images/gems/fall-confetti-right/confetti.png,
@/assets/images/gems/fall-confetti-right/confetti@2x.png 2x,
@/assets/images/gems/fall-confetti-right/confetti@3x.png 3x"
src="@/assets/images/gems/fall-confetti-right/confetti.png"
>
<img
v-else-if="eventName === 'spooky_extra_gems'"
class="d-none d-xl-block"
srcset="
~@/assets/images/gems/spooky-confetti-right/confetti.png,
~@/assets/images/gems/spooky-confetti-right/confetti@2x.png 2x,
~@/assets/images/gems/spooky-confetti-right/confetti@3x.png 3x"
src="~@/assets/images/gems/spooky-confetti-right/confetti.png"
@/assets/images/gems/spooky-confetti-right/confetti.png,
@/assets/images/gems/spooky-confetti-right/confetti@2x.png 2x,
@/assets/images/gems/spooky-confetti-right/confetti@3x.png 3x"
src="@/assets/images/gems/spooky-confetti-right/confetti.png"
>
</div>
</base-banner>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.gems-promo-banner-fall_extra_gems {
background: $gray-10;
@@ -34,7 +34,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
.announce-text {
color: $white;
@@ -67,7 +67,7 @@ import find from 'lodash/find';
import { mapState } from '@/libs/store';
import BaseBanner from './base';
import gifts from '@/assets/svg/gifts.svg';
import gifts from '@/assets/svg/gifts.svg?raw';
export default {
components: {
@@ -74,7 +74,7 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '@/assets/scss/colors.scss';
#app-header {
padding-left: 24px;
+10 -10
View File
@@ -402,9 +402,9 @@ body.modal-open #habitica-menu {
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/utils.scss';
@import '~@/assets/scss/variables.scss';
@import '@/assets/scss/colors.scss';
@import '@/assets/scss/utils.scss';
@import '@/assets/scss/variables.scss';
.menu-toggle {
border: none;
@@ -417,7 +417,7 @@ body.modal-open #habitica-menu {
.topbar {
z-index: 1080;
background: $purple-100 url(~@/assets/svg/for-css/bits.svg) right top no-repeat;
background: $purple-100 url(@/assets/svg/for-css/bits.svg) right top no-repeat;
min-height: 56px;
box-shadow: 0 1px 2px 0 rgba($black, 0.24);
@@ -740,12 +740,12 @@ body.modal-open #habitica-menu {
import { mapState, mapGetters } from '@/libs/store';
import { goToModForm } from '@/libs/modform';
import gemIcon from '@/assets/svg/gem.svg';
import goldIcon from '@/assets/svg/gold.svg';
import syncIcon from '@/assets/svg/sync.svg';
import svgHourglasses from '@/assets/svg/hourglass.svg';
import chevronDownIcon from '@/assets/svg/chevron-down.svg';
import melior from '@/assets/svg/melior.svg';
import gemIcon from '@/assets/svg/gem.svg?raw';
import goldIcon from '@/assets/svg/gold.svg?raw';
import syncIcon from '@/assets/svg/sync.svg?raw';
import svgHourglasses from '@/assets/svg/hourglass.svg?raw';
import chevronDownIcon from '@/assets/svg/chevron-down.svg?raw';
import melior from '@/assets/svg/melior.svg?raw';
import creatorIntro from '../creatorIntro';
import notificationMenu from './notificationsDropdown';

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