Compare commits

...

94 Commits

Author SHA1 Message Date
Hafiz
2a69f98906 Merge branch 'fiz/challenge-modal-fixes' into fiz/updated-end-challenge-modal 2025-08-06 14:09:37 -05:00
Hafiz
5d1d70b72e end challenge modal fixes 2025-08-06 14:09:10 -05:00
Hafiz
b9764ddfcf lint error fixes 2025-08-06 13:35:43 -05:00
Hafiz
fdbae638bb Merge branch 'fiz/updated-end-challenge-modal' into qa/monkey 2025-08-06 13:28:28 -05:00
Hafiz
949809a994 Merge branch 'fiz/profile-modal-tab-urls' into qa/monkey 2025-08-06 13:28:18 -05:00
Hafiz
ef59ecb3b1 Merge branch 'fiz/bounds-enhancements' into qa/monkey 2025-08-06 13:28:01 -05:00
Hafiz
4250fbc53f Fix inconsistent profile URL format between own and other users' profiles
- Update profile tab navigation to use consistent URL format for all users
- Redirect old /user/* routes to new format for backward compatibility
- Update all navigation points (dropdown menu, notifications) to use new URLs
2025-08-06 13:24:31 -05:00
Hafiz
1d48439528 Update End Challenge modal
- Replace dropdown with searchable input (384x32px) for winner selection
- Add visual badge state with gems icons for challenge completion
- Update Delete Challenge flow with refund info and proper styling
- Add close button (X) with opacity hover effect
- Enhance Award Winner button with gem icon and dynamic prize display
- Apply conditional styling based on winner selection state
- Update text colors: Maroon/50 for delete warning, Gray/100 for "OR" text
- Add proper translations for gem/gems and refund description
2025-08-06 12:59:33 -05:00
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
Hafiz
45e1b97ebd Merge branch 'fiz/case-insensitive-mentions' into qa/monkey 2025-08-05 13:10:19 -05:00
Hafiz
c1ab9cb6ca lint fixes 2025-08-05 13:10:07 -05:00
Hafiz
5cf07d75f5 Merge branch 'fiz/case-insensitive-mentions' into qa/monkey 2025-08-05 13:03:31 -05:00
Hafiz
375cafc781 Merge branch 'fiz/profile-modal-tab-urls' into qa/monkey 2025-08-05 12:53:44 -05:00
Hafiz
0c0dc20dcc Fix undefined userId 2025-08-05 12:53:28 -05:00
Hafiz
ffa73698a5 Server now matches usernames case insensitively like client
- Preserves original capitalization in mention text
- Fixes profile links not working with wrong case mentions
2025-08-05 12:39:33 -05:00
Hafiz
f1ac0d5038 Merge branch 'fiz/profile-modal-tab-urls' into qa/monkey 2025-08-05 12:01:28 -05:00
Hafiz
c0508a2f22 Fix profile modal tab navigation URLs for both own and other users profiles
- Add routes for /user/profile, /user/stats, and /user/achievements
- Update selectPage() to properly update URLs when switching tabs
- Own profile uses /user/{tab} format
- Other users' profiles use /profile/{userId}#{tab} format
- Parse hash fragments when navigating to other users' profile tabs
- Ensure direct navigation to tab URLs opens correct tab
2025-08-05 11:59:11 -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
Hafiz
53aa960afd fix lint 2025-08-04 13:08:16 -05:00
Hafiz
d16c9bc67a Merge branch 'fiz/content-user-preferred-language' into qa/monkey 2025-08-04 13:03:51 -05:00
Hafiz
00a468bde9 Merge branch 'develop' into qa/monkey 2025-08-04 13:02:38 -05:00
Hafiz
c71528a478 Respect user language preference in content endpoint
Content API now returns data in user's preferred language when authenticated without language parameter. No breaking changes - existing clients unaffected.
2025-08-04 12:56:32 -05: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
CuriousMagpie
338c633cdb chore: fix typos 2025-06-20 13:56:20 -04:00
CuriousMagpie
b957d2a3b0 Merge branch 'develop' into 2025-08-content-build 2025-06-20 12:47:37 -04: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
CuriousMagpie
b2efb8286b chore: 2025-08 content build 2025-06-19 15:20:30 -04: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
Kalista Payne
484c3cbac8 5.36.0 2025-04-29 14:08:34 -05:00
Weblate
c199beaf8c Translated using Weblate (Ukrainian)
Currently translated at 98.1% (422 of 430 strings)

Translated using Weblate (Ukrainian)

Currently translated at 58.4% (1942 of 3325 strings)

Translated using Weblate (Ukrainian)

Currently translated at 54.2% (133 of 245 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Serbian)

Currently translated at 94.2% (132 of 140 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 96.5% (255 of 264 strings)

Translated using Weblate (Serbian)

Currently translated at 46.4% (123 of 265 strings)

Translated using Weblate (Serbian)

Currently translated at 94.6% (53 of 56 strings)

Translated using Weblate (Serbian)

Currently translated at 67.0% (63 of 94 strings)

Translated using Weblate (Serbian)

Currently translated at 75.0% (6 of 8 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (276 of 276 strings)

Translated using Weblate (Serbian)

Currently translated at 65.5% (282 of 430 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.2% (3233 of 3325 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.2% (3233 of 3325 strings)

Translated using Weblate (Serbian)

Currently translated at 87.3% (159 of 182 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 5.3% (13 of 245 strings)

Translated using Weblate (Serbian)

Currently translated at 1.6% (4 of 245 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.5% (841 of 845 strings)

Translated using Weblate (Serbian)

Currently translated at 41.7% (38 of 91 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Serbian)

Currently translated at 74.0% (305 of 412 strings)

Translated using Weblate (Serbian)

Currently translated at 95.3% (184 of 193 strings)

Translated using Weblate (Serbian)

Currently translated at 26.3% (44 of 167 strings)

Translated using Weblate (Serbian)

Currently translated at 54.6% (142 of 260 strings)

Translated using Weblate (German)

Currently translated at 99.8% (3320 of 3325 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (408 of 408 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.8% (827 of 845 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.1% (821 of 845 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Spanish)

Currently translated at 99.9% (3322 of 3325 strings)

Translated using Weblate (Italian)

Currently translated at 14.2% (35 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 96.2% (813 of 845 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (862 of 862 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 94.5% (799 of 845 strings)

Translated using Weblate (Danish)

Currently translated at 69.9% (603 of 862 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 94.3% (797 of 845 strings)

Translated using Weblate (Danish)

Currently translated at 70.0% (604 of 862 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 95.9% (235 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 95.5% (234 of 245 strings)

Translated using Weblate (Italian)

Currently translated at 13.8% (34 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 99.3% (856 of 862 strings)

Translated using Weblate (German)

Currently translated at 99.7% (3318 of 3325 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 92.8% (785 of 845 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (3317 of 3325 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (German)

Currently translated at 99.7% (3316 of 3325 strings)

Translated using Weblate (French)

Currently translated at 100.0% (862 of 862 strings)

Translated using Weblate (Spanish)

Currently translated at 99.0% (854 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% (412 of 412 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (French)

Currently translated at 100.0% (862 of 862 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.6% (398 of 412 strings)

Translated using Weblate (Italian)

Currently translated at 91.8% (101 of 110 strings)

Translated using Weblate (German)

Currently translated at 100.0% (265 of 265 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3325 of 3325 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (French)

Currently translated at 99.5% (858 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.3% (397 of 412 strings)

Translated using Weblate (German)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (German)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (French)

Currently translated at 100.0% (265 of 265 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.6% (275 of 276 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.0% (3227 of 3325 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (411 of 412 strings)

Translated using Weblate (French)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (French)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 95.8% (253 of 264 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 96.0% (3195 of 3325 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.3% (397 of 412 strings)

Translated using Weblate (Russian)

Currently translated at 84.9% (225 of 265 strings)

Translated using Weblate (Russian)

Currently translated at 84.1% (223 of 265 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (3316 of 3325 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (265 of 265 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3325 of 3325 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (862 of 862 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (265 of 265 strings)

Translated using Weblate (Hungarian)

Currently translated at 99.0% (854 of 862 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (905 of 905 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 93.1% (246 of 264 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 91.3% (772 of 845 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (411 of 412 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Polish)

Currently translated at 28.9% (71 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 28.5% (70 of 245 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.7% (407 of 408 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.7% (407 of 408 strings)

Translated using Weblate (Polish)

Currently translated at 28.1% (69 of 245 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Indonesian)

Currently translated at 97.1% (876 of 902 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (902 of 902 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.2% (260 of 276 strings)

Translated using Weblate (Ukrainian)

Currently translated at 58.4% (1939 of 3315 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.9% (3114 of 3315 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.8% (818 of 845 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.0% (396 of 408 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (902 of 902 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 78.3% (192 of 245 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.4% (815 of 845 strings)

Translated using Weblate (German)

Currently translated at 99.5% (841 of 845 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (902 of 902 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.5% (242 of 243 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 66.1% (162 of 245 strings)

Co-authored-by: Catherine Liang <catherine.cy.liang@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Dawid Wodyk <dawid.wodykk@gmail.com>
Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Lizard <li07369427zard@gmail.com>
Co-authored-by: Lorenzo Lionello <lorenzo22092005@gmail.com>
Co-authored-by: Maja Miloradović <maka.zikelic@gmail.com>
Co-authored-by: Marie Blosse--Gilbin <mbgil@hotmail.fr>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Nazar Paruna <nazarparuna@gmail.com>
Co-authored-by: Oleh <okv23200@gmail.com>
Co-authored-by: Pasquale Bosso <protagora87@gmail.com>
Co-authored-by: Rocío Ibarra Robles <notion.ro.personal@gmail.com>
Co-authored-by: Saalima Aaseman <aaseman.bio@gmail.com>
Co-authored-by: Sofia Amaral Novaes <soso.novaes@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: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Ushkovsky Stas <che2116@ya.ru>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: theblighted <theamityd@gmail.com>
Co-authored-by: Анна <antarinel+habitica@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/sr/
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/id/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
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/character/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/character/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/content/de/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es/
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/death/sr/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/sr/
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/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sr/
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/pt_BR/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/sr/
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/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hu/
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/settings/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/sr/
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/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/uk/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Inventory
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Overview
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2025-04-29 20:23:27 +02:00
Phillip Thelen
553aa01c25 fix sprite alignment in mount raised modal 2025-04-28 09:39:54 -05:00
Natalie
8d1b10e458 May 2025 Content Build (#15422)
* chore: May 2025 subscriber gear, background, and armoire gear

* chore: May 2025 pet and hatching potion quests, stylesheet update

* fix: add space to pet quest rage description

* Update backgrounds.json

fix(typo): missing fullstop

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-04-18 13:05:03 -05:00
Phillip Thelen
0eaee9b1e4 Use stable sprites (#15421) 2025-04-17 16:38:22 -05:00
Kalista Payne
41bbc475ab 5.35.4 2025-04-17 16:18:55 -05:00
Natalie
d6e03c765e fix: correct number of available completed todos for users (#15424)
* fix: Correct number of available completed todos for users

* fix(test): remove test obsoleted by changes to GET completed

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-04-17 12:34:55 -05:00
649 changed files with 11026 additions and 12754 deletions

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();
});

View File

@@ -49,12 +49,6 @@ function integrationTestCommand (testDir) {
} }
/* Test task definitions */ /* 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 => { gulp.task('test:prepare:mongo', cb => {
const mongooseOptions = getDefaultConnectionOptions(); const mongooseOptions = getDefaultConnectionOptions();
const connectionUrl = getDevelopmentConnectionUrl(TEST_DB_URI); const connectionUrl = getDevelopmentConnectionUrl(TEST_DB_URI);

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-build'); // eslint-disable-line global-require
require('./gulp/gulp-console'); // 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-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-tests'); // eslint-disable-line global-require
require('./gulp/gulp-transifex-test'); // 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 require('gulp').task('default', gulp.series('test')); // eslint-disable-line global-require

View File

@@ -37,7 +37,7 @@ let consoleStamp = require('console-stamp');
consoleStamp(console); consoleStamp(console);
// Initialize configuration // 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_OLD = nconf.get('MONGODB_OLD');
let MONGODB_NEW = nconf.get('MONGODB_NEW'); let MONGODB_NEW = nconf.get('MONGODB_NEW');

View File

@@ -32,7 +32,7 @@ let moment = require('moment');
consoleStamp(console); consoleStamp(console);
// Initialize configuration // 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_OLD = nconf.get('MONGODB_OLD');
let MONGODB_NEW = nconf.get('MONGODB_NEW'); let MONGODB_NEW = nconf.get('MONGODB_NEW');

View File

@@ -6,7 +6,7 @@ require('@babel/register'); // eslint-disable-line import/no-extraneous-dependen
function setUpServer () { function setUpServer () {
const nconf = require('nconf'); // eslint-disable-line global-require, no-unused-vars 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 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(); setupNconf();

590
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "habitica", "name": "habitica",
"version": "5.35.3", "version": "5.38.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "habitica", "name": "habitica",
"version": "5.35.3", "version": "5.38.1",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@babel/core": "^7.22.10", "@babel/core": "^7.22.10",
@@ -43,7 +43,6 @@
"gulp-babel": "^8.0.0", "gulp-babel": "^8.0.0",
"gulp-filter": "^7.0.0", "gulp-filter": "^7.0.0",
"gulp-imagemin": "^7.1.0", "gulp-imagemin": "^7.1.0",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.13.0", "gulp.spritesmith": "^6.13.0",
"habitica-markdown": "^3.0.0", "habitica-markdown": "^3.0.0",
"helmet": "^4.6.0", "helmet": "^4.6.0",
@@ -55,12 +54,12 @@
"merge-stream": "^2.0.0", "merge-stream": "^2.0.0",
"method-override": "^3.0.0", "method-override": "^3.0.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"moment-recur": "^1.0.7", "moment-recur": "git://github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"mongoose": "^8.9.5", "mongoose": "^8.9.5",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"nconf": "^0.12.1", "nconf": "^0.12.1",
"node-gcm": "^1.0.5", "node-gcm": "^1.0.5",
"nodemon": "^2.0.20", "nodemon": "^3.1.9",
"on-headers": "^1.0.2", "on-headers": "^1.0.2",
"passport": "^0.5.3", "passport": "^0.5.3",
"passport-facebook": "^3.0.0", "passport-facebook": "^3.0.0",
@@ -87,7 +86,7 @@
"xml2js": "^0.6.2" "xml2js": "^0.6.2"
}, },
"devDependencies": { "devDependencies": {
"axios": "^1.7.4", "axios": "^1.8.2",
"chai": "^4.3.7", "chai": "^4.3.7",
"chai-as-promised": "^7.1.1", "chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0", "chai-moment": "^0.1.0",
@@ -151,14 +150,6 @@
"node": ">=4" "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": { "node_modules/@babel/code-frame/node_modules/supports-color": {
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -542,14 +533,6 @@
"node": ">=4" "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": { "node_modules/@babel/highlight/node_modules/supports-color": {
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -1699,9 +1682,10 @@
"integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.23.9", "version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
"integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
"license": "MIT",
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
}, },
@@ -1786,231 +1770,6 @@
"node": ">=10.0.0" "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": { "node_modules/@esbuild/linux-x64": {
"version": "0.16.17", "version": "0.16.17",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
@@ -2026,96 +1785,6 @@
"node": ">=12" "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": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -4170,6 +3839,14 @@
"node": ">=6" "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": { "node_modules/apidoc/node_modules/glob": {
"version": "7.2.3", "version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -4200,6 +3877,41 @@
"node": ">=10" "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": { "node_modules/apidoc/node_modules/semver": {
"version": "7.6.0", "version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
@@ -4214,6 +3926,36 @@
"node": ">=10" "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": { "node_modules/apidoc/node_modules/yallist": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -4787,10 +4529,11 @@
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.7.4", "version": "1.8.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
"form-data": "^4.0.0", "form-data": "^4.0.0",
@@ -6193,7 +5936,7 @@
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"devOptional": true, "dev": true,
"dependencies": { "dependencies": {
"file-uri-to-path": "1.0.0" "file-uri-to-path": "1.0.0"
} }
@@ -7013,15 +6756,6 @@
"node": ">=4" "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": { "node_modules/coa/node_modules/supports-color": {
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -7115,6 +6849,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
"engines": { "engines": {
"node": ">=0.1.90" "node": ">=0.1.90"
} }
@@ -8993,14 +8728,6 @@
"url": "https://github.com/sponsors/sindresorhus" "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": { "node_modules/eslint-config-habitrpg/node_modules/ignore": {
"version": "4.0.6", "version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -10507,7 +10234,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "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==", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"devOptional": true "dev": true
}, },
"node_modules/filename-reserved-regex": { "node_modules/filename-reserved-regex": {
"version": "2.0.0", "version": "2.0.0",
@@ -11593,24 +11320,6 @@
"node": ">=0.10.0" "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": { "node_modules/glob-watcher/node_modules/glob-parent": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
@@ -12300,16 +12009,6 @@
"node": ">=8" "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": { "node_modules/gulp.spritesmith": {
"version": "6.13.0", "version": "6.13.0",
"resolved": "https://registry.npmjs.org/gulp.spritesmith/-/gulp.spritesmith-6.13.0.tgz", "resolved": "https://registry.npmjs.org/gulp.spritesmith/-/gulp.spritesmith-6.13.0.tgz",
@@ -12542,6 +12241,14 @@
"url": "https://github.com/sponsors/ljharb" "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": { "node_modules/has-property-descriptors": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
@@ -15335,15 +15042,6 @@
"node": "*" "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": { "node_modules/mocha/node_modules/minimatch": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -15407,9 +15105,10 @@
} }
}, },
"node_modules/moment-recur": { "node_modules/moment-recur": {
"version": "1.0.7", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/moment-recur/-/moment-recur-1.0.7.tgz", "resolved": "git+ssh://git@github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"integrity": "sha512-jpBQn6H62gCnEYjtYdLfK/VdPZHEXo1t8RrVItHVVS67SRvByyJBNBa3WQSGTe+8H0smcYO/79FYTA9LGMVdQw==", "integrity": "sha512-LaqXV3izeVQjG0EKAEQQWdneMiff5JR6oBKcfgl0uFOTeaFzLKG62psk7r2VE7RTBdhYigt6KNaLZR7GdWPEIA==",
"license": "Unlicense",
"dependencies": { "dependencies": {
"moment": "<3.0.0" "moment": "<3.0.0"
} }
@@ -15949,7 +15648,7 @@
"version": "2.18.0", "version": "2.18.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
"integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==",
"devOptional": true "dev": true
}, },
"node_modules/nanomatch": { "node_modules/nanomatch": {
"version": "1.2.13", "version": "1.2.13",
@@ -16313,17 +16012,17 @@
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
}, },
"node_modules/nodemon": { "node_modules/nodemon": {
"version": "2.0.22", "version": "3.1.10",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
"integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==",
"dependencies": { "dependencies": {
"chokidar": "^3.5.2", "chokidar": "^3.5.2",
"debug": "^3.2.7", "debug": "^4",
"ignore-by-default": "^1.0.1", "ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2", "minimatch": "^3.1.2",
"pstree.remy": "^1.1.8", "pstree.remy": "^1.1.8",
"semver": "^5.7.1", "semver": "^7.5.3",
"simple-update-notifier": "^1.0.7", "simple-update-notifier": "^2.0.0",
"supports-color": "^5.5.0", "supports-color": "^5.5.0",
"touch": "^3.1.0", "touch": "^3.1.0",
"undefsafe": "^2.0.5" "undefsafe": "^2.0.5"
@@ -16332,35 +16031,22 @@
"nodemon": "bin/nodemon.js" "nodemon": "bin/nodemon.js"
}, },
"engines": { "engines": {
"node": ">=8.10.0" "node": ">=10"
}, },
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/nodemon" "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": { "node_modules/nodemon/node_modules/semver": {
"version": "5.7.2", "version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"bin": { "bin": {
"semver": "bin/semver" "semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
} }
}, },
"node_modules/nodemon/node_modules/supports-color": { "node_modules/nodemon/node_modules/supports-color": {
@@ -18200,9 +17886,10 @@
} }
}, },
"node_modules/prismjs": { "node_modules/prismjs": {
"version": "1.29.0", "version": "1.30.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
"license": "MIT",
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
@@ -19213,15 +18900,6 @@
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true "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": { "node_modules/run-rs/node_modules/mongodb": {
"version": "3.6.12", "version": "3.6.12",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.12.tgz", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.12.tgz",
@@ -19746,22 +19424,25 @@
} }
}, },
"node_modules/simple-update-notifier": { "node_modules/simple-update-notifier": {
"version": "1.1.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
"integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dependencies": { "dependencies": {
"semver": "~7.0.0" "semver": "^7.5.3"
}, },
"engines": { "engines": {
"node": ">=8.10.0" "node": ">=10"
} }
}, },
"node_modules/simple-update-notifier/node_modules/semver": { "node_modules/simple-update-notifier/node_modules/semver": {
"version": "7.0.0", "version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
} }
}, },
"node_modules/sinon": { "node_modules/sinon": {
@@ -20790,15 +20471,6 @@
"node": ">=4" "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": { "node_modules/svgo/node_modules/sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",

View File

@@ -1,7 +1,7 @@
{ {
"name": "habitica", "name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.", "description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.35.3", "version": "5.38.1",
"main": "./website/server/index.js", "main": "./website/server/index.js",
"dependencies": { "dependencies": {
"@babel/core": "^7.22.10", "@babel/core": "^7.22.10",
@@ -38,7 +38,6 @@
"gulp-babel": "^8.0.0", "gulp-babel": "^8.0.0",
"gulp-filter": "^7.0.0", "gulp-filter": "^7.0.0",
"gulp-imagemin": "^7.1.0", "gulp-imagemin": "^7.1.0",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.13.0", "gulp.spritesmith": "^6.13.0",
"habitica-markdown": "^3.0.0", "habitica-markdown": "^3.0.0",
"helmet": "^4.6.0", "helmet": "^4.6.0",
@@ -50,12 +49,11 @@
"merge-stream": "^2.0.0", "merge-stream": "^2.0.0",
"method-override": "^3.0.0", "method-override": "^3.0.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"moment-recur": "^1.0.7", "moment-recur": "git://github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"mongoose": "^8.9.5", "mongoose": "^8.9.5",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"nconf": "^0.12.1", "nconf": "^0.12.1",
"node-gcm": "^1.0.5", "node-gcm": "^1.0.5",
"nodemon": "^2.0.20",
"on-headers": "^1.0.2", "on-headers": "^1.0.2",
"passport": "^0.5.3", "passport": "^0.5.3",
"passport-facebook": "^3.0.0", "passport-facebook": "^3.0.0",
@@ -100,15 +98,14 @@
"test:sanity": "nyc --silent --no-clean mocha test/sanity --recursive", "test:sanity": "nyc --silent --no-clean mocha test/sanity --recursive",
"test:common": "nyc --silent --no-clean mocha test/common --recursive", "test:common": "nyc --silent --no-clean mocha test/common --recursive",
"test:content": "nyc --silent --no-clean mocha test/content --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", "coverage": "nyc report --reporter=html --report-dir coverage/results; open coverage/results/index.html",
"sprites": "gulp sprites:compile", "sprites": "gulp sprites:compile",
"client:dev": "cd website/client && npm run serve", "client:dev": "cd website/client && npm run serve",
"client:build": "cd website/client && npm run build", "client:build": "cd website/client && npm run build",
"client:unit": "cd website/client && npm run test:unit", "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", "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: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", "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", "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" "heroku-postbuild": ".heroku/report_deploy.sh"
}, },
"devDependencies": { "devDependencies": {
"axios": "^1.7.4", "axios": "^1.8.2",
"chai": "^4.3.7", "chai": "^4.3.7",
"chai-as-promised": "^7.1.1", "chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0", "chai-moment": "^0.1.0",

View File

@@ -71,15 +71,14 @@ async function deleteHabiticaData (user, email) {
} }
async function processEmailAddress (email) { async function processEmailAddress (email) {
const emailRegex = new RegExp(`^${email}$`, 'i');
const localUsers = await User.find( const localUsers = await User.find(
{ 'auth.local.email': emailRegex }, { 'auth.local.email': email },
{ _id: 1, apiToken: 1, auth: 1 }, { _id: 1, apiToken: 1, auth: 1 },
).exec(); ).exec();
const socialUsers = await User.find( const socialUsers = await User.find(
{ {
'auth.local.email': { $not: emailRegex }, 'auth.local.email': { $ne: email },
$or: [ $or: [
{ 'auth.facebook.emails.value': email }, { 'auth.facebook.emails.value': email },
{ 'auth.google.emails.value': email }, { 'auth.google.emails.value': email },

View File

@@ -8,7 +8,17 @@ const TASK_VALUE_CHANGE_FACTOR = 0.9747;
const MIN_TASK_VALUE = -47.27; const MIN_TASK_VALUE = -47.27;
async function updateTeamTasks (team) { 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 = []; const toSave = [];
let teamLeader = await User.findOne({ _id: team.leader }, 'preferences').exec(); let teamLeader = await User.findOne({ _id: team.leader }, 'preferences').exec();
if (!teamLeader) { // why would this happen? if (!teamLeader) { // why would this happen?
@@ -93,12 +103,7 @@ async function updateTeamTasks (team) {
export default async function processTeamsCron () { export default async function processTeamsCron () {
const activeTeams = await Group.find({ const activeTeams = await Group.find({
'purchased.plan.customerId': { $exists: true }, 'purchased.plan.customerId': { $exists: true },
$or: [ }, { cron: 1, leader: 1, purchased: 1 }).exec();
{ 'purchased.plan.dateTerminated': { $exists: false } },
{ 'purchased.plan.dateTerminated': null },
{ 'purchased.plan.dateTerminated': { $gt: new Date() } },
],
}).exec();
const cronPromises = activeTeams.map(updateTeamTasks); const cronPromises = activeTeams.map(updateTeamTasks);
return Promise.all(cronPromises); return Promise.all(cronPromises);

View File

@@ -47,6 +47,12 @@ describe('highlightMentions', () => {
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)'); expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
}); });
it('highlights users with case-insensitive matching', async () => {
const text = '@USER: message @User2 @USER3';
const result = await highlightMentions(text);
expect(result[0]).to.equal('[@USER](/profile/111): message [@User2](/profile/222) [@USER3](/profile/333)');
});
it('doesn\'t highlight nonexisting users', async () => { it('doesn\'t highlight nonexisting users', async () => {
const text = '@nouser message'; const text = '@nouser message';
const result = await highlightMentions(text); const result = await highlightMentions(text);

View File

@@ -1,8 +1,11 @@
import nconf from 'nconf';
import requireAgain from 'require-again';
import { import {
generateRes, generateRes,
generateReq, generateReq,
} from '../../../helpers/api-unit.helper'; } from '../../../helpers/api-unit.helper';
import { authWithHeaders as authWithHeadersFactory } from '../../../../website/server/middlewares/auth';
const authPath = '../../../../website/server/middlewares/auth';
describe('auth middleware', () => { describe('auth middleware', () => {
let res; let req; let let res; let req; let
@@ -16,6 +19,7 @@ describe('auth middleware', () => {
describe('auth with headers', () => { describe('auth with headers', () => {
it('allows to specify a list of user field that we do not want to load', done => { 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({ const authWithHeaders = authWithHeadersFactory({
userFieldsToExclude: ['items'], userFieldsToExclude: ['items'],
}); });
@@ -35,6 +39,7 @@ describe('auth middleware', () => {
}); });
it('makes sure some fields are always included', done => { it('makes sure some fields are always included', done => {
const authWithHeadersFactory = requireAgain(authPath).authWithHeaders;
const authWithHeaders = authWithHeadersFactory({ const authWithHeaders = authWithHeadersFactory({
userFieldsToExclude: [ userFieldsToExclude: [
'items', 'auth.timestamps', 'items', 'auth.timestamps',
@@ -60,5 +65,57 @@ describe('auth middleware', () => {
return done(); 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();
});
});
});
}); });
}); });

View File

@@ -238,6 +238,18 @@ describe('POST /chat', () => {
expect(groupMessages[0].id).to.exist; expect(groupMessages[0].id).to.exist;
}); });
it('creates a chat with case-insensitive mentions', async () => {
const originalUsername = member.auth.local.username;
const uppercaseUsername = originalUsername.toUpperCase();
const messageWithMentions = `hi @${uppercaseUsername}`;
const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: messageWithMentions });
const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`);
expect(newMessage.message.id).to.exist;
expect(newMessage.message.text).to.include(`[@${uppercaseUsername}](/profile/${member._id})`);
expect(groupMessages[0].id).to.exist;
});
it('creates a chat with a max length of 3000 chars', async () => { it('creates a chat with a max length of 3000 chars', async () => {
const veryLongMessage = ` const veryLongMessage = `
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789. 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789.

View File

@@ -1,6 +1,7 @@
import { import {
requester, requester,
translate as t, translate as t,
generateUser,
} from '../../../../helpers/api-integration/v3'; } from '../../../../helpers/api-integration/v3';
import i18n from '../../../../../website/common/script/i18n'; import i18n from '../../../../../website/common/script/i18n';
@@ -56,4 +57,28 @@ describe('GET /content', () => {
const res = await requester().get('/content?filter=backgroundsFlat,invalid'); const res = await requester().get('/content?filter=backgroundsFlat,invalid');
expect(res).to.not.have.property('backgroundsFlat'); expect(res).to.not.have.property('backgroundsFlat');
}); });
describe('authenticated user', () => {
let user;
it('returns content in user\'s preferred language when no language parameter is provided', async () => {
user = await generateUser({ 'preferences.language': 'de' });
const res = await user.get('/content');
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'de'));
});
it('respects language parameter over user\'s preferred language', async () => {
user = await generateUser({ 'preferences.language': 'de' });
const res = await user.get('/content?language=fr');
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'fr'));
});
it('falls back to English if user\'s preferred language is invalid', async () => {
user = await generateUser({ 'preferences.language': 'invalid_lang' });
const res = await user.get('/content');
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText'));
});
});
}); });

View File

@@ -101,34 +101,6 @@ describe('GET /tasks/user', () => {
expect(allCompletedTodos[allCompletedTodos.length - 1].text).to.equal('todo to complete 2'); expect(allCompletedTodos[allCompletedTodos.length - 1].text).to.equal('todo to complete 2');
}); });
it('returns only some completed todos if req.query.type is "completedTodos" or "_allCompletedTodos"', async () => {
const LIMIT = 30;
const numberOfTodos = LIMIT + 1;
const todosInput = [];
for (let i = 0; i < numberOfTodos; i += 1) {
todosInput[i] = { text: `todo to complete ${i}`, type: 'todo' };
}
const todos = await user.post('/tasks/user', todosInput);
await user.sync();
const initialTodoCount = user.tasksOrder.todos.length;
for (let i = 0; i < numberOfTodos; i += 1) {
const id = todos[i]._id;
await user.post(`/tasks/${id}/score/up`); // eslint-disable-line no-await-in-loop
}
await user.sync();
expect(user.tasksOrder.todos.length).to.equal(initialTodoCount - numberOfTodos);
const completedTodos = await user.get('/tasks/user?type=completedTodos');
expect(completedTodos.length).to.equal(LIMIT);
const allCompletedTodos = await user.get('/tasks/user?type=_allCompletedTodos');
expect(allCompletedTodos.length).to.equal(numberOfTodos);
});
it('returns dailies with isDue for the date specified', async () => { it('returns dailies with isDue for the date specified', async () => {
// @TODO Add required format // @TODO Add required format
const startDate = moment().subtract('1', 'days').toISOString(); const startDate = moment().subtract('1', 'days').toISOString();

View File

@@ -238,6 +238,28 @@ describe('POST /user/auth/reset-password-set-new-one', () => {
expect(isPassValid).to.equal(true); 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 () => { it('renders the success page and convert the password from sha1 to bcrypt', async () => {
const user = await generateUser(); const user = await generateUser();

View File

@@ -27,11 +27,30 @@ describe('PUT /user/auth/update-password', async () => {
newPassword, newPassword,
confirmPassword: newPassword, confirmPassword: newPassword,
}); });
expect(response).to.eql({});
expect(response).to.exist;
expect(response.apiToken).to.exist;
await user.sync(); await user.sync();
expect(user.auth.local.hashed_password).to.not.eql(previousHashedPassword); 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 () => { it('returns an error when confirmPassword does not match newPassword', async () => {
await expect(user.put(ENDPOINT, { await expect(user.put(ENDPOINT, {
password, password,

View File

@@ -133,21 +133,21 @@ describe('Content Schedule', () => {
}); });
it('sets the end date for a gala', () => { 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); 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', () => { 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); 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', () => { 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); 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', () => { it('uses correct date for first hours of the month', () => {

View File

@@ -18,7 +18,7 @@ describe('Shop Featured Items', () => {
}); });
it('contains the current premium hatching potions', () => { 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(); const items = featuredItems.market();
expect(_.find(items, item => item.path === 'premiumHatchingPotions.Porcelain')).to.exist; expect(_.find(items, item => item.path === 'premiumHatchingPotions.Porcelain')).to.exist;
}); });

View File

@@ -19,6 +19,6 @@ const sinonStubPromise = require('sinon-stub-promise');
sinonStubPromise(global.sinon); sinonStubPromise(global.sinon);
global.sandbox = sinon.createSandbox(); global.sandbox = sinon.createSandbox();
const setupNconf = require('../../website/server/libs/setupNconf'); const setupNconf = require('../../website/server/libs/setupNconf').default;
setupNconf('./config.json.example'); setupNconf('./config.json.example');

View File

@@ -3,7 +3,7 @@
const nconf = require('nconf'); const nconf = require('nconf');
const mongoose = require('mongoose'); 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 // fix further imports of require/import syntaxes
require('@babel/register'); require('@babel/register');

View File

@@ -3,6 +3,7 @@ module.exports = {
root: true, root: true,
env: { env: {
node: true, node: true,
es2021: true,
}, },
extends: [ extends: [
'habitrpg/lib/vue', 'habitrpg/lib/vue',
@@ -39,7 +40,4 @@ module.exports = {
order: ['template', 'style', 'script'], order: ['template', 'style', 'script'],
}], }],
}, },
parserOptions: {
parser: 'babel-eslint',
},
}; };

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',
],
};

View File

@@ -12,6 +12,7 @@
<link rel="shortcut icon" sizes="192x192" href="/static/icons/favicon_192x192.png"> <link rel="shortcut icon" sizes="192x192" href="/static/icons/favicon_192x192.png">
<link rel="mask-icon" href="/static/icons/favicon.ico"> <link rel="mask-icon" href="/static/icons/favicon.ico">
<meta property="og:image" content="/static/emails/images/meta-image.png" /> <meta property="og:image" content="/static/emails/images/meta-image.png" />
<script type="module" src="/src/main.js"></script>
</head> </head>
<body> <body>
<div id="loading-screen"> <div id="loading-screen">
@@ -28,10 +29,9 @@
</div> </div>
<div id="app"></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> <script type="text/javascript" src="//cloudfront.loggly.com/js/loggly.tracker-latest.min.js" async></script>
<!-- Translations --> <!-- 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> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@@ -3,28 +3,26 @@
"version": "1.0.0", "version": "1.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vite",
"build": "vue-cli-service build", "build": "vite build",
"test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js", "preview": "vite preview",
"lint": "vue-cli-service lint .", "test:unit": "vitest run",
"lint-no-fix": "vue-cli-service lint --no-fix .", "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" "postinstall": "node ./scripts/npm-postinstall.js"
}, },
"dependencies": { "dependencies": {
"@vue/cli-plugin-babel": "^5.0.8", "@froxz/vite-plugin-s3": "^1.6.0",
"@vue/cli-plugin-eslint": "^5.0.8", "@vitejs/plugin-vue2": "^2.3.3",
"@vue/cli-plugin-router": "^5.0.8",
"@vue/cli-plugin-unit-mocha": "^5.0.8",
"@vue/cli-service": "^5.0.8",
"@vue/test-utils": "1.0.0-beta.29", "@vue/test-utils": "1.0.0-beta.29",
"amplitude-js": "^8.21.3", "amplitude-js": "^8.21.3",
"assert": "^2.1.0", "assert": "^2.1.0",
"autoprefixer": "^10.4.20",
"axios": "^0.28.0", "axios": "^0.28.0",
"axios-progress-bar": "^1.2.0", "axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.6.0", "bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1", "bootstrap-vue": "^2.23.1",
"core-js": "^3.33.1",
"eslint": "7.32.0", "eslint": "7.32.0",
"eslint-config-habitrpg": "6.2.0", "eslint-config-habitrpg": "6.2.0",
"eslint-plugin-mocha": "5.3.0", "eslint-plugin-mocha": "5.3.0",
@@ -34,31 +32,34 @@
"intro.js": "^7.2.0", "intro.js": "^7.2.0",
"jquery": "^3.7.1", "jquery": "^3.7.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"markdown-it": "^14.0.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"moment-locales-webpack-plugin": "^1.2.0",
"nconf": "^0.12.1", "nconf": "^0.12.1",
"sass": "^1.63.4", "sass": "^1.63.4",
"sass-loader": "^14.1.1",
"sinon": "^17.0.1", "sinon": "^17.0.1",
"stopword": "^2.0.8", "stopword": "^2.0.8",
"timers-browserify": "^2.0.12", "timers-browserify": "^2.0.12",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"validator": "^13.9.0", "validator": "^13.9.0",
"vite": "^6.0.0",
"vite-plugin-compression2": "^1.3.3",
"vue": "^2.7.10", "vue": "^2.7.10",
"vue-fragment": "^1.6.0", "vue-fragment": "^1.6.0",
"vue-mugen-scroll": "^0.2.6", "vue-mugen-scroll": "^0.2.6",
"vue-router": "^3.6.5", "vue-router": "^3.6.5",
"vue-template-babel-compiler": "^2.0.0",
"vue-template-compiler": "^2.7.10",
"vuedraggable": "^2.24.3", "vuedraggable": "^2.24.3",
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#153d339e4dbebb73733658aeda1d5b7fcc55b0a0" "vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#153d339e4dbebb73733658aeda1d5b7fcc55b0a0"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-proposal-optional-chaining": "^7.21.0",
"@vitest/browser": "^3.0.5",
"babel-plugin-lodash": "^3.3.4", "babel-plugin-lodash": "^3.3.4",
"chai": "^5.1.0",
"inspectpack": "^4.7.1", "inspectpack": "^4.7.1",
"jsdom": "^26.0.0",
"mocha": "^11.1.0",
"playwright": "^1.50.1",
"terser-webpack-plugin": "^5.3.10", "terser-webpack-plugin": "^5.3.10",
"vitest": "^3.0.5",
"webpack": "^5.94.0" "webpack": "^5.94.0"
} }
} }

View File

@@ -29,12 +29,14 @@
</div> </div>
<snackbars /> <snackbars />
<router-view v-if="!isUserLoggedIn || isStaticPage" /> <router-view v-if="!isUserLoggedIn || isStaticPage" />
<user-main v-else /> <div v-else>
<user-main />
</div>
</div> </div>
</template> </template>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#loading-screen-inapp { #loading-screen-inapp {
#melior { #melior {
@@ -90,7 +92,7 @@
</style> </style>
<style lang='scss'> <style lang='scss'>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.modal-backdrop { .modal-backdrop {
opacity: .9 !important; opacity: .9 !important;
@@ -108,16 +110,16 @@ import axios from 'axios';
import * as Analytics from '@/libs/analytics'; import * as Analytics from '@/libs/analytics';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import userMain from '@/pages/user-main';
import snackbars from '@/components/snackbars/notifications'; 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 { export default {
name: 'App', name: 'App',
components: { components: {
snackbars, snackbars,
userMain, userMain: () => import('@/pages/user-main'),
}, },
data () { data () {
return { return {
@@ -221,11 +223,10 @@ export default {
const errorData = error.response.data; const errorData = error.response.data;
const errorMessage = errorData.message || errorData; const errorMessage = errorData.message || errorData;
const errorCode = errorData.error;
// Check for conditions to reset the user auth // If 'invalid_credentials' signaled, force logout
// TODO use a specific error like NotificationNotFound instead of checking for the string if (error.response.status === 401 && errorCode === 'invalid_credentials') {
const invalidUserMessage = [this.$t('invalidCredentials'), 'Missing authentication headers.'];
if (invalidUserMessage.indexOf(errorMessage) !== -1) {
this.$store.dispatch('auth:logout', { redirectToLogin: true }); this.$store.dispatch('auth:logout', { redirectToLogin: true });
return null; return null;
} }
@@ -268,16 +269,29 @@ export default {
const loadingScreen = document.getElementById('loading-screen'); const loadingScreen = document.getElementById('loading-screen');
if (loadingScreen) document.body.removeChild(loadingScreen); if (loadingScreen) document.body.removeChild(loadingScreen);
// 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) { if (this.isStaticPage || !this.isUserLoggedIn) {
this.hideLoadingScreen(); this.hideLoadingScreen();
} }
});
}, },
methods: { methods: {
hideLoadingScreen () { hideLoadingScreen () {
this.loading = false; this.loading = false;
}, },
checkForBannedUser (error) { 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 parseSettings = JSON.parse(AUTH_SETTINGS);
const errorMessage = error.response.data.message; const errorMessage = error.response.data.message;
@@ -301,4 +315,3 @@ export default {
</script> </script>
<style src="@/assets/scss/index.scss" lang="scss"></style> <style src="@/assets/scss/index.scss" lang="scss"></style>
<style src="@/assets/scss/sprites.scss" lang="scss"></style>

View File

@@ -177,7 +177,7 @@
height: 96px; 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; width: 135px;
height: 135px; height: 135px;
} }
@@ -190,6 +190,14 @@
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Mount-Body-Gryphatrice.gif") no-repeat; 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 { .background_airship, .background_clocktower, .background_steamworks {
width: 141px; width: 141px;
height: 147px; height: 147px;

View File

@@ -2001,6 +2001,11 @@
width: 141px; width: 141px;
height: 147px; 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_slimy_swamp {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_slimy_swamp.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_slimy_swamp.png');
width: 141px; width: 141px;
@@ -2176,11 +2181,21 @@
width: 141px; width: 141px;
height: 147px; 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_sunken_ship {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sunken_ship.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sunken_ship.png');
width: 141px; width: 141px;
height: 147px; 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_sunset_meadow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sunset_meadow.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sunset_meadow.png');
width: 141px; width: 141px;
@@ -2266,6 +2281,11 @@
width: 141px; width: 141px;
height: 147px; height: 147px;
} }
.background_trail_through_a_forest {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_trail_through_a_forest.png');
width: 141px;
height: 147px;
}
.background_training_grounds { .background_training_grounds {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_training_grounds.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_training_grounds.png');
width: 141px; width: 141px;
@@ -29540,6 +29560,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .broad_armor_armoire_blueMoonShozoku {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_blueMoonShozoku.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_blueMoonShozoku.png');
width: 114px; width: 114px;
@@ -29670,6 +29695,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .broad_armor_armoire_funnyFoolCostume {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_funnyFoolCostume.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_funnyFoolCostume.png');
width: 114px; width: 114px;
@@ -29680,6 +29710,11 @@
width: 114px; width: 114px;
height: 90px; height: 90px;
} }
.broad_armor_armoire_gildedKnightsPlate {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_gildedKnightsPlate.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_gladiatorArmor { .broad_armor_armoire_gladiatorArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_gladiatorArmor.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_gladiatorArmor.png');
width: 90px; width: 90px;
@@ -29870,6 +29905,11 @@
width: 90px; width: 90px;
height: 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 { .broad_armor_armoire_robeOfDiamonds {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_robeOfDiamonds.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_robeOfDiamonds.png');
width: 114px; width: 114px;
@@ -30135,6 +30175,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .head_armoire_bigWig {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_bigWig.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_bigWig.png');
width: 90px; width: 90px;
@@ -30275,6 +30320,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .head_armoire_frostedHelm {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_frostedHelm.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_frostedHelm.png');
width: 114px; width: 114px;
@@ -30290,6 +30340,11 @@
width: 114px; width: 114px;
height: 90px; height: 90px;
} }
.head_armoire_gildedKnightsHelm {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_gildedKnightsHelm.png');
width: 114px;
height: 90px;
}
.head_armoire_gladiatorHelm { .head_armoire_gladiatorHelm {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_gladiatorHelm.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_gladiatorHelm.png');
width: 90px; width: 90px;
@@ -30490,6 +30545,11 @@
width: 90px; width: 90px;
height: 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 { .head_armoire_regalCrown {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_regalCrown.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_regalCrown.png');
width: 114px; width: 114px;
@@ -30630,6 +30690,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .shield_armoire_birthdayBanner {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_birthdayBanner.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_birthdayBanner.png');
width: 114px; width: 114px;
@@ -30730,6 +30795,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .shield_armoire_gardenersSpade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_gardenersSpade.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_gardenersSpade.png');
width: 114px; width: 114px;
@@ -31075,6 +31145,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .slim_armor_armoire_blueMoonShozoku {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_blueMoonShozoku.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_blueMoonShozoku.png');
width: 114px; width: 114px;
@@ -31205,6 +31280,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .slim_armor_armoire_funnyFoolCostume {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_funnyFoolCostume.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_funnyFoolCostume.png');
width: 114px; width: 114px;
@@ -31215,6 +31295,11 @@
width: 114px; width: 114px;
height: 90px; height: 90px;
} }
.slim_armor_armoire_gildedKnightsPlate {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_gildedKnightsPlate.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_gladiatorArmor { .slim_armor_armoire_gladiatorArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_gladiatorArmor.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_gladiatorArmor.png');
width: 90px; width: 90px;
@@ -31405,6 +31490,11 @@
width: 90px; width: 90px;
height: 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 { .slim_armor_armoire_robeOfDiamonds {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_robeOfDiamonds.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_robeOfDiamonds.png');
width: 114px; width: 114px;
@@ -31640,6 +31730,11 @@
width: 114px; width: 114px;
height: 90px; 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 { .weapon_armoire_blueKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_blueKite.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_blueKite.png');
width: 114px; width: 114px;
@@ -31760,6 +31855,11 @@
width: 114px; width: 114px;
height: 90px; height: 90px;
} }
.weapon_armoire_gildedKnightsSpear {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_gildedKnightsSpear.png');
width: 114px;
height: 90px;
}
.weapon_armoire_glassblowersBlowpipe { .weapon_armoire_glassblowersBlowpipe {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_glassblowersBlowpipe.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_glassblowersBlowpipe.png');
width: 114px; width: 114px;
@@ -35525,6 +35625,46 @@
width: 114px; width: 114px;
height: 90px; height: 90px;
} }
.back_mystery_202505 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202505.png');
width: 114px;
height: 90px;
}
.headAccessory_mystery_202505 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_mystery_202505.png');
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 { .broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px; width: 90px;
@@ -37070,6 +37210,26 @@
width: 114px; width: 114px;
height: 117px; 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 { .broad_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summerHealer.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summerHealer.png');
width: 90px; width: 90px;
@@ -37300,6 +37460,26 @@
width: 114px; width: 114px;
height: 117px; 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 { .head_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summerHealer.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summerHealer.png');
width: 90px; width: 90px;
@@ -37475,6 +37655,21 @@
width: 114px; width: 114px;
height: 117px; 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 { .shield_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summerHealer.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summerHealer.png');
width: 90px; width: 90px;
@@ -37695,6 +37890,26 @@
width: 114px; width: 114px;
height: 117px; 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 { .slim_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summerHealer.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summerHealer.png');
width: 90px; width: 90px;
@@ -37915,6 +38130,26 @@
width: 114px; width: 114px;
height: 117px; 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 { .weapon_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summerHealer.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summerHealer.png');
width: 90px; width: 90px;
@@ -40813,6 +41048,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_BearCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_BearCub-Peppermint { .Mount_Body_BearCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Peppermint.png');
width: 105px; width: 105px;
@@ -41268,6 +41508,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Cactus-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_Cactus-Peppermint { .Mount_Body_Cactus-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-Peppermint.png');
width: 105px; width: 105px;
@@ -42018,6 +42263,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Dragon-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dragon-Peppermint { .Mount_Body_Dragon-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-Peppermint.png');
width: 105px; width: 105px;
@@ -42468,6 +42718,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_FlyingPig-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_FlyingPig-Peppermint { .Mount_Body_FlyingPig-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-Peppermint.png');
width: 105px; width: 105px;
@@ -42768,6 +43023,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Fox-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_Fox-Peppermint { .Mount_Body_Fox-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-Peppermint.png');
width: 105px; width: 105px;
@@ -43508,6 +43768,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_LionCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_LionCub-Peppermint { .Mount_Body_LionCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-Peppermint.png');
width: 105px; width: 105px;
@@ -44078,6 +44343,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_PandaCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_PandaCub-Peppermint { .Mount_Body_PandaCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-Peppermint.png');
width: 105px; width: 105px;
@@ -44378,6 +44648,56 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Platypus-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-Base.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-CottonCandyBlue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-CottonCandyBlue.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-CottonCandyPink {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-CottonCandyPink.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-Desert {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-Desert.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-Golden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-Golden.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-Red {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-Red.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-Shade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-Shade.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-Skeleton {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-Skeleton.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-White {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-White.png');
width: 105px;
height: 105px;
}
.Mount_Body_Platypus-Zombie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Platypus-Zombie.png');
width: 105px;
height: 105px;
}
.Mount_Body_Pterodactyl-Base { .Mount_Body_Pterodactyl-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Pterodactyl-Base.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Pterodactyl-Base.png');
width: 105px; width: 105px;
@@ -45383,6 +45703,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_TigerCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Body_TigerCub-Peppermint { .Mount_Body_TigerCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-Peppermint.png');
width: 105px; width: 105px;
@@ -45993,6 +46318,11 @@
width: 135px; width: 135px;
height: 135px; height: 135px;
} }
.Mount_Body_Wolf-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-Opal.png');
width: 135px;
height: 135px;
}
.Mount_Body_Wolf-Peppermint { .Mount_Body_Wolf-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-Peppermint.png');
width: 135px; width: 135px;
@@ -46593,6 +46923,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_BearCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_BearCub-Peppermint { .Mount_Head_BearCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Peppermint.png');
width: 105px; width: 105px;
@@ -47048,6 +47383,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_Cactus-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_Cactus-Peppermint { .Mount_Head_Cactus-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-Peppermint.png');
width: 105px; width: 105px;
@@ -47798,6 +48138,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_Dragon-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dragon-Peppermint { .Mount_Head_Dragon-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-Peppermint.png');
width: 105px; width: 105px;
@@ -48248,6 +48593,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_FlyingPig-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_FlyingPig-Peppermint { .Mount_Head_FlyingPig-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-Peppermint.png');
width: 105px; width: 105px;
@@ -48548,6 +48898,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_Fox-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_Fox-Peppermint { .Mount_Head_Fox-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-Peppermint.png');
width: 105px; width: 105px;
@@ -49288,6 +49643,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_LionCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_LionCub-Peppermint { .Mount_Head_LionCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-Peppermint.png');
width: 105px; width: 105px;
@@ -49858,6 +50218,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_PandaCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_PandaCub-Peppermint { .Mount_Head_PandaCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-Peppermint.png');
width: 105px; width: 105px;
@@ -50158,6 +50523,56 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_Platypus-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-Base.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-CottonCandyBlue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-CottonCandyBlue.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-CottonCandyPink {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-CottonCandyPink.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-Desert {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-Desert.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-Golden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-Golden.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-Red {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-Red.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-Shade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-Shade.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-Skeleton {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-Skeleton.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-White {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-White.png');
width: 105px;
height: 105px;
}
.Mount_Head_Platypus-Zombie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Platypus-Zombie.png');
width: 105px;
height: 105px;
}
.Mount_Head_Pterodactyl-Base { .Mount_Head_Pterodactyl-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Pterodactyl-Base.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Pterodactyl-Base.png');
width: 105px; width: 105px;
@@ -51163,6 +51578,11 @@
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Head_TigerCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-Opal.png');
width: 105px;
height: 105px;
}
.Mount_Head_TigerCub-Peppermint { .Mount_Head_TigerCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-Peppermint.png');
width: 105px; width: 105px;
@@ -51773,6 +52193,11 @@
width: 135px; width: 135px;
height: 135px; height: 135px;
} }
.Mount_Head_Wolf-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-Opal.png');
width: 135px;
height: 135px;
}
.Mount_Head_Wolf-Peppermint { .Mount_Head_Wolf-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-Peppermint.png');
width: 135px; width: 135px;
@@ -52393,6 +52818,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-BearCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Opal.png');
width: 81px;
height: 99px;
}
.Pet-BearCub-Peppermint { .Pet-BearCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Peppermint.png');
width: 81px; width: 81px;
@@ -52878,6 +53308,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-Cactus-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Opal.png');
width: 81px;
height: 99px;
}
.Pet-Cactus-Peppermint { .Pet-Cactus-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Peppermint.png');
width: 81px; width: 81px;
@@ -53668,6 +54103,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-Dragon-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Opal.png');
width: 81px;
height: 99px;
}
.Pet-Dragon-Peppermint { .Pet-Dragon-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Peppermint.png');
width: 81px; width: 81px;
@@ -54153,6 +54593,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-FlyingPig-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Opal.png');
width: 81px;
height: 99px;
}
.Pet-FlyingPig-Peppermint { .Pet-FlyingPig-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Peppermint.png');
width: 81px; width: 81px;
@@ -54483,6 +54928,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-Fox-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Opal.png');
width: 81px;
height: 99px;
}
.Pet-Fox-Peppermint { .Pet-Fox-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Peppermint.png');
width: 81px; width: 81px;
@@ -55258,6 +55708,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-LionCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Opal.png');
width: 81px;
height: 99px;
}
.Pet-LionCub-Peppermint { .Pet-LionCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Peppermint.png');
width: 81px; width: 81px;
@@ -55858,6 +56313,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-PandaCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Opal.png');
width: 81px;
height: 99px;
}
.Pet-PandaCub-Peppermint { .Pet-PandaCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Peppermint.png');
width: 81px; width: 81px;
@@ -56173,6 +56633,56 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-Platypus-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-Base.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-CottonCandyBlue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-CottonCandyBlue.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-CottonCandyPink {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-CottonCandyPink.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-Desert {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-Desert.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-Golden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-Golden.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-Red {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-Red.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-Shade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-Shade.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-Skeleton {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-Skeleton.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-White {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-White.png');
width: 81px;
height: 99px;
}
.Pet-Platypus-Zombie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Platypus-Zombie.png');
width: 81px;
height: 99px;
}
.Pet-Pterodactyl-Base { .Pet-Pterodactyl-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Pterodactyl-Base.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Pterodactyl-Base.png');
width: 81px; width: 81px;
@@ -57198,6 +57708,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-TigerCub-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Opal.png');
width: 81px;
height: 99px;
}
.Pet-TigerCub-Peppermint { .Pet-TigerCub-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Peppermint.png');
width: 81px; width: 81px;
@@ -57838,6 +58353,11 @@
width: 81px; width: 81px;
height: 99px; height: 99px;
} }
.Pet-Wolf-Opal {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Opal.png');
width: 81px;
height: 99px;
}
.Pet-Wolf-Peppermint { .Pet-Wolf-Peppermint {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Peppermint.png'); background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Peppermint.png');
width: 81px; width: 81px;

View File

@@ -1,5 +1,5 @@
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.featured-label { .featured-label {
width: auto; width: auto;

View File

@@ -2,7 +2,7 @@
$grid-gutter-width: 24px; $grid-gutter-width: 24px;
// Bootstrap and its default variables // Bootstrap and its default variables
@import 'node_modules/bootstrap/scss/bootstrap'; @import '~/bootstrap/scss/bootstrap';
// Bootstrap Vue styles // Bootstrap Vue styles
@import 'node_modules/bootstrap-vue/dist/bootstrap-vue'; @import '~/bootstrap-vue/dist/bootstrap-vue';

View File

@@ -316,3 +316,9 @@
line-height: 2; line-height: 2;
padding: 2px 2px; padding: 2px 2px;
} }
.btn-lg {
font-size: 1.25rem;
line-height: 1.5;
padding: .5rem 1rem;
}

View File

@@ -1,4 +1,4 @@
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h1 { h1 {
margin-top: 0px; margin-top: 0px;

View File

@@ -61,13 +61,13 @@ input, textarea, input.form-control, textarea.form-control {
&.input-valid { &.input-valid {
padding-right: 27px; padding-right: 27px;
background-image: url(~@/assets/svg/for-css/check.svg); background-image: url(@/assets/svg/for-css/check.svg);
background-size: 1rem; background-size: 1rem;
} }
&.input-invalid { &.input-invalid {
padding-right: 40px; 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; background-size: 16px 16px;
border-color: $red-100 !important; border-color: $red-100 !important;
} }
@@ -239,7 +239,7 @@ $bg-disabled-control: $gray-10;
&:checked~.custom-control-label::after { &:checked~.custom-control-label::after {
width: 18px; width: 18px;
height: 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; background-size: 13px 10px;
} }

View File

@@ -29,13 +29,13 @@
} }
.iconalert-success::before { .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-size: 13px 10px;
background-color: #1ca372; background-color: #1ca372;
} }
.iconalert-warning::before, .iconalert-error::before { .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; background-size: 16px 16px;
} }

View File

@@ -1,4 +1,4 @@
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.modal { .modal {
z-index: 1350; z-index: 1350;

View File

@@ -46,13 +46,11 @@
.background { .background {
background-repeat: repeat-x; background-repeat: repeat-x;
height:216px;
width: 100%; width: 100%;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
@@ -67,6 +65,13 @@
flex-direction: column; flex-direction: column;
} }
.shop-message {
position: relative;
height: 76px;
margin: 71px auto;
width: 240px;
}
.npc { .npc {
position: absolute; position: absolute;
left: 0; left: 0;

View File

@@ -1,4 +1,4 @@
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.container-fluid.static-view { .container-fluid.static-view {
margin: 5em 2em 0 2em; margin: 5em 2em 0 2em;

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,29 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M58.1792 31.6843L46.8536 22.3769L23.918 28.6988L18.861 42.5218L44.341 58.5813L58.1792 31.6843Z" fill="#FF944C"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L46.1108 26.1328L36.2812 28.8422L46.6218 34.5148Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M30.2393 39.0304L26.4518 31.5515L36.2813 28.8422L30.2393 39.0304Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L36.2813 28.8422L30.2393 39.0304L46.6218 34.5148Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M53.8301 32.5279L46.1108 26.1328L46.6218 34.5148L53.8301 32.5279Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M23.0309 41.0173L26.4518 31.5516L30.2393 39.0304L23.0309 41.0173Z" fill="#FA8537"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M53.8301 32.5279L46.6218 34.5148L43.0424 53.79L53.8301 32.5279Z" fill="#FA8537"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M23.0309 41.0173L30.2393 39.0304L43.0425 53.79L23.0309 41.0173Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L30.2393 39.0304L43.0425 53.79L46.6218 34.5148Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.555 4.15937L47.026 0.420004L38.7773 1.59601L36.4144 6.17539L44.5675 12.8919L50.555 4.15937Z" fill="#FFBE5D"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L46.6034 1.6924L43.0682 2.1964L46.414 4.62854Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M40.5221 5.46854L39.5331 2.7004L43.0682 2.1964L40.5221 5.46854Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L43.0683 2.1964L40.5221 5.46855L46.414 4.62854Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M49.0064 4.25894L46.6034 1.6924L46.414 4.62854L49.0064 4.25894Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M37.9296 5.83815L39.5331 2.70041L40.5221 5.46855L37.9296 5.83815Z" fill="#FFA624"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M49.0064 4.25893L46.414 4.62853L44.3259 11.1688L49.0064 4.25893Z" fill="#FFA624"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M37.9297 5.83815L40.5221 5.46855L44.326 11.1688L37.9297 5.83815Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L40.5221 5.46855L44.326 11.1688L46.414 4.62854Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.2986 16.7775L24.6513 8.36623L11.1016 3.94533L4.07056 9.19883L11.614 25.6769L27.2986 16.7775Z" fill="#FF6165"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L23.0573 10.0026L17.2502 8.10789L20.5864 14.3719Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M10.908 11.2141L11.4432 6.21322L17.2502 8.10789L10.908 11.2141Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L17.2502 8.10789L10.9081 11.2141L20.5864 14.3719Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M24.8449 15.7613L23.0573 10.0026L20.5864 14.3719L24.8449 15.7613Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M6.64955 9.82464L11.4432 6.21321L10.908 11.2141L6.64955 9.82464Z" fill="#F23035"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M24.8449 15.7613L20.5864 14.3719L12.5221 22.8464L24.8449 15.7613Z" fill="#F23035"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.64959 9.82464L10.9081 11.2141L12.5221 22.8463L6.64959 9.82464Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L10.9081 11.2141L12.5221 22.8463L20.5864 14.3719Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,29 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.82083 31.6843L17.1464 22.3769L40.082 28.6988L45.139 42.5218L19.659 58.5813L5.82083 31.6843Z" fill="#24CC8F"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L17.8892 26.1328L27.7188 28.8422L17.3782 34.5148Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M33.7607 39.0304L37.5482 31.5515L27.7187 28.8422L33.7607 39.0304Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L27.7187 28.8422L33.7607 39.0304L17.3782 34.5148Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M10.1699 32.5279L17.8892 26.1328L17.3782 34.5148L10.1699 32.5279Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M40.9691 41.0173L37.5482 31.5516L33.7607 39.0304L40.9691 41.0173Z" fill="#1CA372"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M10.1699 32.5279L17.3782 34.5148L20.9576 53.79L10.1699 32.5279Z" fill="#1CA372"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M40.9691 41.0173L33.7607 39.0304L20.9575 53.79L40.9691 41.0173Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L33.7607 39.0304L20.9575 53.79L17.3782 34.5148Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.445 4.15937L16.974 0.420004L25.2227 1.59601L27.5856 6.17539L19.4325 12.8919L13.445 4.15937Z" fill="#925CF3"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L17.3966 1.6924L20.9318 2.1964L17.586 4.62854Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M23.4779 5.46854L24.4669 2.7004L20.9318 2.1964L23.4779 5.46854Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L20.9317 2.1964L23.4779 5.46855L17.586 4.62854Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14.9936 4.25894L17.3966 1.6924L17.586 4.62854L14.9936 4.25894Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M26.0704 5.83815L24.4669 2.70041L23.4779 5.46855L26.0704 5.83815Z" fill="#4F2A93"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M14.9936 4.25893L17.586 4.62853L19.6741 11.1688L14.9936 4.25893Z" fill="#4F2A93"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M26.0703 5.83815L23.4779 5.46855L19.674 11.1688L26.0703 5.83815Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L23.4779 5.46855L19.674 11.1688L17.586 4.62854Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M36.7014 16.7775L39.3487 8.36623L52.8984 3.94533L59.9294 9.19883L52.386 25.6769L36.7014 16.7775Z" fill="#50B5E9"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L40.9427 10.0026L46.7498 8.10789L43.4136 14.3719Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M53.092 11.2141L52.5568 6.21322L46.7498 8.10789L53.092 11.2141Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L46.7498 8.10789L53.0919 11.2141L43.4136 14.3719Z" fill="white"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M39.1551 15.7613L40.9427 10.0026L43.4136 14.3719L39.1551 15.7613Z" fill="white"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M57.3504 9.82464L52.5568 6.21321L53.092 11.2141L57.3504 9.82464Z" fill="#46A7D9"/>
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M39.1551 15.7613L43.4136 14.3719L51.4779 22.8464L39.1551 15.7613Z" fill="#46A7D9"/>
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M57.3504 9.82464L53.0919 11.2141L51.4779 22.8463L57.3504 9.82464Z" fill="white"/>
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L53.0919 11.2141L51.4779 22.8463L43.4136 14.3719Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -4,7 +4,7 @@
<!-- @TODO i18n. How to setup the strings with the router-link inside?--> <!-- @TODO i18n. How to setup the strings with the router-link inside?-->
<img <img
:class="retiredChatPage ? 'mt-5' : 'image-404'" :class="retiredChatPage ? 'mt-5' : 'image-404'"
src="~@/assets/images/404.png" src="@/assets/images/404.png"
> >
<div v-if="retiredChatPage"> <div v-if="retiredChatPage">
<h1> <h1>
@@ -48,7 +48,7 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h1, .static-wrapper h1 { h1, .static-wrapper h1 {
color: $purple-200; color: $purple-200;

View File

@@ -107,7 +107,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.btn-primary:active { .btn-primary:active {
border: 2px solid $purple-400 !important; border: 2px solid $purple-400 !important;
@@ -193,10 +193,10 @@
import Avatar from '../avatar'; import Avatar from '../avatar';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import markdownDirective from '@/directives/markdown'; import markdownDirective from '@/directives/markdown';
import warriorIcon from '@/assets/svg/warrior.svg'; import warriorIcon from '@/assets/svg/warrior.svg?raw';
import rogueIcon from '@/assets/svg/rogue.svg'; import rogueIcon from '@/assets/svg/rogue.svg?raw';
import healerIcon from '@/assets/svg/healer.svg'; import healerIcon from '@/assets/svg/healer.svg?raw';
import wizardIcon from '@/assets/svg/wizard.svg'; import wizardIcon from '@/assets/svg/wizard.svg?raw';
export default { export default {
components: { components: {

View File

@@ -70,7 +70,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h2 { h2 {
color: $purple-200; color: $purple-200;
@@ -100,7 +100,7 @@
</style> </style>
<script> <script>
import closeIcon from '@/assets/svg/close.svg'; import closeIcon from '@/assets/svg/close.svg?raw';
import Sprite from '@/components/ui/sprite.vue'; import Sprite from '@/components/ui/sprite.vue';
export default { export default {

View File

@@ -45,7 +45,7 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/mixins.scss'; @import '@/assets/scss/mixins.scss';
#generic-achievement { #generic-achievement {
@include centeredModal(); @include centeredModal();
@@ -61,7 +61,7 @@
</style> </style>
<style scoped lang="scss"> <style scoped lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.content { .content {
text-align: center; text-align: center;
@@ -98,7 +98,7 @@
<script> <script>
import achievements from '@/../../common/script/content/achievements'; import achievements from '@/../../common/script/content/achievements';
import { mapState } from '@/libs/store'; 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'; import Sprite from '@/components/ui/sprite.vue';
export default { export default {

View File

@@ -58,7 +58,7 @@ label(style='display:inline-block') {{ $t('dontShowAgain') }}
</template> </template>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#level-up { #level-up {
.modal-content { .modal-content {
@@ -157,8 +157,8 @@ label(style='display:inline-block') {{ $t('dontShowAgain') }}
import Avatar from '../avatar'; import Avatar from '../avatar';
import Sprite from '@/components/ui/sprite'; import Sprite from '@/components/ui/sprite';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import starGroup from '@/assets/svg/star-group.svg'; import starGroup from '@/assets/svg/star-group.svg?raw';
import sparkles from '@/assets/svg/sparkles-left.svg'; import sparkles from '@/assets/svg/sparkles-left.svg?raw';
const levelQuests = { const levelQuests = {
15: 'atom1', 15: 'atom1',

View File

@@ -17,7 +17,7 @@
</h2> </h2>
<img <img
class="onboarding-complete-banner d-block" class="onboarding-complete-banner d-block"
src="~@/assets/images/onboarding-complete-banner@2x.png" src="@/assets/images/onboarding-complete-banner@2x.png"
> >
<p <p
v-once v-once
@@ -59,7 +59,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h2 { h2 {
color: $purple-200; color: $purple-200;
@@ -100,7 +100,7 @@ button {
</style> </style>
<script> <script>
import svgClose from '@/assets/svg/close.svg'; import svgClose from '@/assets/svg/close.svg?raw';
export default { export default {
data () { data () {
@@ -117,7 +117,7 @@ export default {
closeWithAction () { closeWithAction () {
this.close(); this.close();
setTimeout(() => { setTimeout(() => {
this.$router.push({ name: 'achievements' }); this.$router.push(`/profile/${this.$store.state.user.data._id}#achievements`);
}, 200); }, 200);
}, },
}, },

View File

@@ -97,9 +97,9 @@ import { mapState } from '@/libs/store';
import Sprite from '@/components/ui/sprite'; import Sprite from '@/components/ui/sprite';
export default { export default {
components: [ components: {
Sprite, Sprite,
], },
data () { data () {
return { return {
maxHealth, maxHealth,

View File

@@ -73,7 +73,7 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#won-challenge { #won-challenge {
.modal-body { .modal-body {
@@ -96,7 +96,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.purple { .purple {
color: $purple-300; color: $purple-300;
@@ -146,9 +146,9 @@
<script> <script>
import habiticaMarkdown from 'habitica-markdown'; import habiticaMarkdown from 'habitica-markdown';
import closeIcon from '@/components/shared/closeIcon'; import closeIcon from '@/components/shared/closeIcon';
import sparkles from '@/assets/svg/star-group.svg'; import sparkles from '@/assets/svg/star-group.svg?raw';
import gem from '@/assets/svg/gem.svg'; import gem from '@/assets/svg/gem.svg?raw';
import stars from '@/assets/svg/sparkles-left.svg'; import stars from '@/assets/svg/sparkles-left.svg?raw';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
export default { export default {

View File

@@ -19,7 +19,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.about-row { .about-row {
margin-left: 0px; margin-left: 0px;

View File

@@ -170,7 +170,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.about-row { .about-row {
margin-left: 0px; margin-left: 0px;

View File

@@ -401,7 +401,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.input-group-append { .input-group-append {
width: auto; width: auto;

View File

@@ -150,7 +150,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.page-header.btn-flat { .page-header.btn-flat {
background: transparent; background: transparent;

View File

@@ -403,7 +403,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.footer-row { .footer-row {
margin: 0; margin: 0;
flex: 0 1 auto; flex: 0 1 auto;
@@ -838,12 +838,12 @@ import moment from 'moment';
import Vue from 'vue'; import Vue from 'vue';
// images // images
import melior from '@/assets/svg/melior.svg'; import melior from '@/assets/svg/melior.svg?raw';
import bluesky from '@/assets/svg/bluesky.svg'; import bluesky from '@/assets/svg/bluesky.svg?raw';
import facebook from '@/assets/svg/facebook.svg'; import facebook from '@/assets/svg/facebook.svg?raw';
import instagram from '@/assets/svg/instagram.svg'; import instagram from '@/assets/svg/instagram.svg?raw';
import tumblr from '@/assets/svg/tumblr.svg'; import tumblr from '@/assets/svg/tumblr.svg?raw';
import heart from '@/assets/svg/heart.svg'; import heart from '@/assets/svg/heart.svg?raw';
// components & modals // components & modals
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
@@ -851,12 +851,14 @@ import buyGemsModal from './payments/buyGemsModal.vue';
import reportBug from '@/mixins/reportBug.js'; import reportBug from '@/mixins/reportBug.js';
import { worldStateMixin } from '@/mixins/worldState'; import { worldStateMixin } from '@/mixins/worldState';
const DEBUG_ENABLED = process.env.DEBUG_ENABLED === 'true'; // eslint-disable-line no-process-env const DEBUG_ENABLED = import.meta.env.DEBUG_ENABLED === 'true';
const TIME_TRAVEL_ENABLED = process.env.TIME_TRAVEL_ENABLED === 'true'; // eslint-disable-line no-process-env const TIME_TRAVEL_ENABLED = import.meta.env.TIME_TRAVEL_ENABLED === 'true';
let sinon; let sinon;
if (TIME_TRAVEL_ENABLED) { if (import.meta.env.TIME_TRAVEL_ENABLED === 'true') {
// eslint-disable-next-line global-require (async () => {
sinon = await import('sinon'); sinon = await import('sinon');
})();
} }
export default { export default {

View File

@@ -168,7 +168,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.form { .form {
margin: 0 auto; margin: 0 auto;
@@ -227,8 +227,8 @@ import debounce from 'lodash/debounce';
import isEmail from 'validator/es/lib/isEmail'; import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants'; import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { setUpAxios, buildAppleAuthUrl } from '@/libs/auth'; import { setUpAxios, buildAppleAuthUrl } from '@/libs/auth';
import googleIcon from '@/assets/svg/google.svg'; import googleIcon from '@/assets/svg/google.svg?raw';
import appleIcon from '@/assets/svg/apple_black.svg'; import appleIcon from '@/assets/svg/apple_black.svg?raw';
export default { export default {
name: 'AuthForm', name: 'AuthForm',
@@ -290,7 +290,7 @@ export default {
}, },
mounted () { mounted () {
hello.init({ hello.init({
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line google: import.meta.env.GOOGLE_CLIENT_ID, // eslint-disable-line
}); });
}, },
methods: { methods: {

View File

@@ -220,7 +220,6 @@
v-if="forgotPassword" v-if="forgotPassword"
id="forgot-form" id="forgot-form"
@submit.prevent="handleSubmit" @submit.prevent="handleSubmit"
@keyup.enter="handleSubmit"
> >
<div class="text-center"> <div class="text-center">
<div> <div>
@@ -268,12 +267,11 @@
v-if="resetPasswordSetNewOne" v-if="resetPasswordSetNewOne"
id="reset-password-set-new-one-form" id="reset-password-set-new-one-form"
@submit.prevent="handleSubmit" @submit.prevent="handleSubmit"
@keyup.enter="handleSubmit"
> >
<div class="text-center"> <div class="text-center">
<div> <div>
<div <div
class="svg-icon habitica-logo color" class="svg-icon habitica-logo"
v-html="icons.habiticaIcon" v-html="icons.habiticaIcon"
></div> ></div>
</div> </div>
@@ -355,7 +353,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
@media only screen and (min-height: 1080px) { @media only screen and (min-height: 1080px) {
.bottom-wrap-register { .bottom-wrap-register {
@@ -491,7 +489,7 @@
#top-background { #top-background {
.seamless_stars_varied_opacity_repeat { .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; background-repeat: repeat-x;
position: absolute; position: absolute;
height: 500px; height: 500px;
@@ -510,7 +508,7 @@
position: relative; position: relative;
.seamless_mountains_demo_repeat { .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; background-repeat: repeat-x;
width: 100%; width: 100%;
height: 300px; height: 300px;
@@ -520,7 +518,7 @@
} }
.midground_foreground_extended2 { .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; position: relative;
width: 1500px; width: 1500px;
max-width: 100%; max-width: 100%;
@@ -611,11 +609,11 @@ import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants'; import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { buildAppleAuthUrl } from '../../libs/auth'; import { buildAppleAuthUrl } from '../../libs/auth';
import sanitizeRedirect from '@/mixins/sanitizeRedirect'; import sanitizeRedirect from '@/mixins/sanitizeRedirect';
import exclamation from '@/assets/svg/exclamation.svg'; import exclamation from '@/assets/svg/exclamation.svg?raw';
import gryphon from '@/assets/svg/gryphon.svg'; import gryphon from '@/assets/svg/gryphon.svg?raw';
import habiticaIcon from '@/assets/svg/logo-horizontal.svg'; import habiticaIcon from '@/assets/svg/logo-horizontal.svg?raw';
import googleIcon from '@/assets/svg/google.svg'; import googleIcon from '@/assets/svg/google.svg?raw';
import appleIcon from '@/assets/svg/apple_black.svg'; import appleIcon from '@/assets/svg/apple_black.svg?raw';
export default { export default {
mixins: [sanitizeRedirect], mixins: [sanitizeRedirect],
@@ -726,9 +724,13 @@ export default {
}, },
mounted () { mounted () {
this.forgotPassword = this.$route.path.startsWith('/forgot-password'); this.forgotPassword = this.$route.path.startsWith('/forgot-password');
if (this.forgotPassword) {
if (this.$route.query.email) {
this.username = this.$route.query.email;
}
}
hello.init({ hello.init({
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line google: import.meta.env.GOOGLE_CLIENT_ID, // eslint-disable-line
}); });
}, },
methods: { methods: {

View File

@@ -97,7 +97,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.avatar { .avatar {
width: 141px; width: 141px;

View File

@@ -27,7 +27,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.bottom-banner { .bottom-banner {
background: linear-gradient(114.26deg, $purple-300 0%, $purple-200 100%); background: linear-gradient(114.26deg, $purple-300 0%, $purple-200 100%);
@@ -55,7 +55,7 @@
</style> </style>
<script> <script>
import sparkles from '@/assets/svg/sparkles-left.svg'; import sparkles from '@/assets/svg/sparkles-left.svg?raw';
export default { export default {
data () { data () {

View File

@@ -42,8 +42,8 @@
</template> </template>
<script> <script>
import gem from '@/assets/svg/gem.svg'; import gem from '@/assets/svg/gem.svg?raw';
import gold from '@/assets/svg/gold.svg'; import gold from '@/assets/svg/gold.svg?raw';
import { avatarEditorUtilities } from '../../mixins/avatarEditUtilities'; import { avatarEditorUtilities } from '../../mixins/avatarEditUtilities';
import Sprite from '@/components/ui/sprite.vue'; import Sprite from '@/components/ui/sprite.vue';
@@ -72,7 +72,7 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.customize-options { .customize-options {
width: 100%; width: 100%;

View File

@@ -19,7 +19,7 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.sub-menu { .sub-menu {
display: flex; display: flex;

View File

@@ -30,8 +30,9 @@
<script> <script>
import markdownDirective from '@/directives/markdown'; 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 { export default {
directives: { directives: {
@@ -39,7 +40,7 @@ export default {
}, },
computed: { computed: {
bannedMessage () { bannedMessage () {
const AUTH_SETTINGS = localStorage.getItem('habit-mobile-settings'); const AUTH_SETTINGS = localStorage.getItem(LOCALSTORAGE_AUTH_KEY);
const parseSettings = JSON.parse(AUTH_SETTINGS); const parseSettings = JSON.parse(AUTH_SETTINGS);
const userId = parseSettings ? parseSettings.auth.apiId : ''; const userId = parseSettings ? parseSettings.auth.apiId : '';

View File

@@ -118,7 +118,7 @@
</style> </style>
<style scoped lang="scss"> <style scoped lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h2 { h2 {
color: $white; color: $white;

View File

@@ -70,7 +70,7 @@
</style> </style>
<style scoped lang="scss"> <style scoped lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h2 { h2 {
color: $white; color: $white;
@@ -134,7 +134,7 @@ label {
<script> <script>
import closeIcon from '@/components/shared/closeIcon'; 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'; import { MODALS } from '@/libs/consts';
export default { export default {

View File

@@ -75,11 +75,14 @@
class="box member-count" class="box member-count"
@click="showMemberModal()" @click="showMemberModal()"
> >
<div class="box-content">
<div class="icon-number-row">
<div <div
class="svg-icon member-icon" class="svg-icon member-icon"
v-html="icons.memberIcon" v-html="icons.memberIcon"
></div> ></div>
{{ challenge.memberCount }} <span class="number">{{ challenge.memberCount }}</span>
</div>
<div <div
v-once v-once
class="details" class="details"
@@ -87,6 +90,7 @@
{{ $t('participantsTitle') }} {{ $t('participantsTitle') }}
</div> </div>
</div> </div>
</div>
<div class="box"> <div class="box">
<div <div
class="svg-icon gem-icon" class="svg-icon gem-icon"
@@ -259,7 +263,7 @@
</template> </template>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h1 { h1 {
color: $purple-200; color: $purple-200;
@@ -304,7 +308,7 @@
.box { .box {
display: inline-block; display: inline-block;
padding: 1em; padding: 0.5em;
border-radius: 2px; border-radius: 2px;
background-color: $white; background-color: $white;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12); box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
@@ -314,22 +318,69 @@
text-align: center; text-align: center;
font-size: 20px; font-size: 20px;
vertical-align: bottom; vertical-align: bottom;
overflow: hidden;
position: relative;
&.member-count:hover { &.member-count:hover {
cursor: pointer; 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 { .svg-icon {
width: 30px; width: 30px;
display: inline-block; display: inline-block;
margin-right: .2em;
vertical-align: bottom; vertical-align: bottom;
} }
.details { .details {
font-size: 12px; font-size: 12px;
margin-top: 0.4em;
color: $gray-200; 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 userLink from '../userLink';
import groupLink from '../groupLink'; import groupLink from '../groupLink';
import gemIcon from '@/assets/svg/gem.svg'; import gemIcon from '@/assets/svg/gem.svg?raw';
import memberIcon from '@/assets/svg/member-icon.svg'; import memberIcon from '@/assets/svg/member-icon.svg?raw';
import calendarIcon from '@/assets/svg/calendar.svg'; import calendarIcon from '@/assets/svg/calendar.svg?raw';
const TASK_KEYS_TO_REMOVE = ['_id', 'completed', 'date', 'dateCompleted', 'history', 'id', 'streak', 'createdAt', 'challenge']; const TASK_KEYS_TO_REMOVE = ['_id', 'completed', 'date', 'dateCompleted', 'history', 'id', 'streak', 'createdAt', 'challenge'];

View File

@@ -106,7 +106,7 @@
</template> </template>
<style lang="scss"> <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. // Have to use this, because v-markdown creates p element in h3. Scoping doesn't work with it.
.challenge-title > p { .challenge-title > p {
display: -webkit-box; display: -webkit-box;
@@ -127,7 +127,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.challenge { .challenge {
background-color: $white; background-color: $white;
@@ -377,14 +377,14 @@ import categoryTags from '../categories/categoryTags';
import markdownDirective from '@/directives/markdown'; import markdownDirective from '@/directives/markdown';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import gemIcon from '@/assets/svg/gem.svg'; import gemIcon from '@/assets/svg/gem.svg?raw';
import memberIcon from '@/assets/svg/member-icon.svg'; import memberIcon from '@/assets/svg/member-icon.svg?raw';
import calendarIcon from '@/assets/svg/calendar.svg'; import calendarIcon from '@/assets/svg/calendar.svg?raw';
import habitIcon from '@/assets/svg/habit.svg'; import habitIcon from '@/assets/svg/habit.svg?raw';
import todoIcon from '@/assets/svg/todo.svg'; import todoIcon from '@/assets/svg/todo.svg?raw';
import dailyIcon from '@/assets/svg/daily.svg'; import dailyIcon from '@/assets/svg/daily.svg?raw';
import rewardIcon from '@/assets/svg/reward.svg'; import rewardIcon from '@/assets/svg/reward.svg?raw';
import officialIcon from '@/assets/svg/official.svg'; import officialIcon from '@/assets/svg/official.svg?raw';
export default { export default {
components: { components: {

View File

@@ -207,7 +207,7 @@
</template> </template>
<style lang='scss'> <style lang='scss'>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#challenge-modal { #challenge-modal {
h5 { h5 {

View File

@@ -4,6 +4,7 @@
id="close-challenge-modal" id="close-challenge-modal"
:title="$t('endChallenge')" :title="$t('endChallenge')"
size="md" size="md"
:hide-header="false"
> >
<div <div
slot="modal-header" slot="modal-header"
@@ -15,6 +16,15 @@
> >
{{ $t('endChallenge') }} {{ $t('endChallenge') }}
</h2> </h2>
<button
class="close-button"
@click="$root.$emit('bv::hide::modal', 'close-challenge-modal')"
>
<div
class="svg-icon"
v-html="icons.close"
></div>
</button>
</div> </div>
<div class="row text-center"> <div class="row text-center">
<span <span
@@ -28,28 +38,67 @@
class="col-12" class="col-12"
> >
<div class="col-12"> <div class="col-12">
<div class="support-habitica"> <div class="badge-section">
<!-- @TODO: Add challenge achievement badge here--> <div
class="gems-left"
v-html="icons.gemsOrange"
></div>
<div
class="challenge-badge"
v-html="icons.endChallengeBadge"
></div>
<div
class="gems-right"
v-html="icons.gemsPurple"
></div>
</div> </div>
</div> </div>
<div class="col-12"> <div class="col-12">
<strong v-once>{{ $t('selectChallengeWinnersDescription') }}</strong> <strong v-once>{{ $t('selectChallengeWinnersDescription') }}</strong>
</div> </div>
<div class="col-12"> <div class="col-12">
<member-search-dropdown <div class="search-input-wrapper">
:text="winnerText" <div
:members="members" class="search-icon"
:challenge-id="challengeId" v-html="icons.search"
@member-selected="selectMember" ></div>
/> <input
v-model="searchTerm"
class="search-input"
type="text"
:placeholder="'@' + $t('username')"
@input="searchMembers"
@focus="showResults = true"
@blur="handleBlur"
>
<div
v-if="showResults && filteredMembers.length > 0"
class="search-results"
>
<div
v-for="member in filteredMembers"
:key="member._id"
class="search-result-item"
@mousedown="selectMember(member)"
>
{{ getMemberDisplayName(member) }}
</div>
</div>
</div>
</div> </div>
<div class="col-12"> <div class="col-12">
<button <button
v-once class="btn award-winner-btn"
class="btn btn-primary" :class="{'has-winner': winner._id}"
:disabled="!winner._id"
@click="closeChallenge" @click="closeChallenge"
> >
{{ $t('awardWinners') }} <span>{{ $t('awardWinners') }}</span>
<div
class="gem-icon"
v-html="icons.gem"
></div>
<span>{{ prize }} {{ prize === 1 ? $t('gem') : $t('gems') }}</span>
</button> </button>
</div> </div>
</span> </span>
@@ -60,14 +109,24 @@
</div> </div>
</div> </div>
<div class="col-12"> <div class="col-12">
<strong v-once>{{ $t('doYouWantedToDeleteChallenge') }}</strong> <strong
v-once
class="delete-challenge-text"
>{{ $t('doYouWantedToDeleteChallenge') }}</strong>
</div>
<div class="col-12 refund-text">
{{ $t('deleteChallengeRefundDescription') }}
</div> </div>
<div class="col-12"> <div class="col-12">
<button <button
v-once v-once
class="btn btn-danger" class="btn btn-danger delete-challenge-btn"
@click="deleteChallenge()" @click="deleteChallenge()"
> >
<div
class="delete-icon"
v-html="icons.deleteIcon"
></div>
{{ $t('deleteChallenge') }} {{ $t('deleteChallenge') }}
</button> </button>
</div> </div>
@@ -81,7 +140,7 @@
</template> </template>
<style lang='scss'> <style lang='scss'>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#close-challenge-modal { #close-challenge-modal {
h2 { h2 {
@@ -95,13 +154,185 @@
.header-wrap { .header-wrap {
width: 100%; width: 100%;
padding-top: 2em; padding-top: 2em;
position: relative;
} }
.support-habitica { .close-button {
background-image: url('~@/assets/svg/for-css/support-habitica-gems.svg'); position: absolute;
width: 325px; top: 1rem;
height: 89px; right: 1rem;
background: none;
border: none;
padding: 0.5rem;
cursor: pointer;
opacity: 0.5;
transition: opacity 0.2s ease;
&:hover {
opacity: 1;
}
.svg-icon {
width: 16px;
height: 16px;
color: $gray-10;
}
}
.search-input-wrapper {
position: relative;
width: 384px;
margin: 0 auto; margin: 0 auto;
.search-icon {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
width: 16px;
height: 16px;
color: $gray-200;
pointer-events: none;
}
.search-input {
width: 100%;
height: 32px;
padding-left: 36px;
padding-right: 12px;
border: 2px solid $gray-400;
border-radius: 4px;
font-size: 14px;
transition: border-color 0.2s ease;
&:focus {
outline: none;
border-color: $purple-300;
}
&::placeholder {
color: $gray-300;
}
}
.search-results {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: $white;
border: 1px solid $gray-400;
border-top: none;
border-radius: 0 0 4px 4px;
max-height: 200px;
overflow-y: auto;
z-index: 1000;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
.search-result-item {
padding: 8px 12px;
cursor: pointer;
transition: background-color 0.2s ease;
&:hover {
background-color: $gray-700;
}
}
}
}
.delete-challenge-text {
color: $maroon-50;
}
.refund-text {
font-family: 'Roboto', sans-serif;
font-size: 14px;
line-height: 24px;
font-weight: 400;
color: $gray-50;
margin-top: 0.5em !important;
}
.delete-challenge-btn {
font-family: 'Roboto', sans-serif;
font-size: 14px;
font-weight: 700;
line-height: 24px;
display: inline-flex;
align-items: center;
gap: 8px;
.delete-icon {
width: 16px;
height: 16px;
display: inline-flex;
color: $white;
}
}
.award-winner-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
background-color: $white;
color: $gray-200;
border: 1px solid $gray-400;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
transition: all 0.2s ease;
&:disabled {
opacity: 0.5;
cursor: not-allowed;
&:hover {
background-color: $white;
}
}
&.has-winner {
background-color: $purple-200;
color: $white;
border-color: $purple-200;
.gem-icon {
color: $white;
}
}
&:hover:not(.has-winner):not(:disabled) {
background-color: $gray-700;
}
.gem-icon {
width: 20px;
height: 20px;
display: inline-flex;
align-items: center;
color: $gems-color;
}
}
.badge-section {
display: flex;
align-items: center;
justify-content: center;
gap: 1.5rem;
margin: 0 auto;
padding: 1rem 0;
.gems-left, .gems-right {
width: 64px;
height: 64px;
flex-shrink: 0;
}
.challenge-badge {
width: 48px;
height: 52px;
flex-shrink: 0;
}
} }
.modal-footer, .modal-header { .modal-footer, .modal-header {
@@ -123,21 +354,37 @@
margin-right: auto; margin-right: auto;
margin-left: auto; margin-left: auto;
font-weight: bold; font-weight: bold;
color: $gray-100;
} }
} }
</style> </style>
<script> <script>
import memberSearchDropdown from '@/components/members/memberSearchDropdown'; import searchIcon from '@/assets/svg/for-css/search.svg?raw';
import deleteIcon from '@/assets/svg/delete.svg?raw';
import closeIcon from '@/assets/svg/close.svg?raw';
import gemIcon from '@/assets/svg/gem.svg?raw';
import endChallengeBadge from '@/assets/svg/for-css/end_challenge_badge.svg?raw';
import gemsOrange from '@/assets/svg/for-css/orange100_red100_yellow100_gems.svg?raw';
import gemsPurple from '@/assets/svg/for-css/purple200_green10_blue100_gems.svg?raw';
export default { export default {
components: {
memberSearchDropdown,
},
props: ['challengeId', 'members', 'prize', 'flagCount'], props: ['challengeId', 'members', 'prize', 'flagCount'],
data () { data () {
return { return {
winner: {}, winner: {},
searchTerm: '',
showResults: false,
filteredMembers: [],
icons: Object.freeze({
search: searchIcon,
deleteIcon,
close: closeIcon,
gem: gemIcon,
endChallengeBadge,
gemsOrange,
gemsPurple,
}),
}; };
}, },
computed: { computed: {
@@ -150,8 +397,35 @@ export default {
}, },
}, },
methods: { methods: {
searchMembers () {
if (!this.searchTerm) {
this.filteredMembers = [];
return;
}
const searchLower = this.searchTerm.toLowerCase().replace('@', '');
this.filteredMembers = this.members.filter(member => {
const username = member.auth?.local?.username || '';
const displayName = member.profile?.name || '';
return username.toLowerCase().includes(searchLower)
|| displayName.toLowerCase().includes(searchLower);
}).slice(0, 10);
},
getMemberDisplayName (member) {
if (member.auth?.local?.username) {
return `@${member.auth.local.username}`;
}
return member.profile?.name || '';
},
selectMember (member) { selectMember (member) {
this.winner = member; this.winner = member;
this.searchTerm = this.getMemberDisplayName(member);
this.showResults = false;
},
handleBlur () {
setTimeout(() => {
this.showResults = false;
}, 200);
}, },
async closeChallenge () { async closeChallenge () {
this.challenge = await this.$store.dispatch('challenges:selectChallengeWinner', { this.challenge = await this.$store.dispatch('challenges:selectChallengeWinner', {

View File

@@ -63,7 +63,7 @@
</template> </template>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
@media only screen and (max-width: 768px) { @media only screen and (max-width: 768px) {
.header-row { .header-row {
@@ -122,7 +122,7 @@ import challengeModal from './challengeModal';
import externalLinks from '@/mixins/externalLinks'; import externalLinks from '@/mixins/externalLinks';
import challengeUtilities from '@/mixins/challengeUtilities'; import challengeUtilities from '@/mixins/challengeUtilities';
import positiveIcon from '@/assets/svg/positive.svg'; import positiveIcon from '@/assets/svg/positive.svg?raw';
export default { export default {
components: { components: {

View File

@@ -49,7 +49,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.no-challenge-section { .no-challenge-section {
padding: 2em; padding: 2em;
@@ -84,7 +84,7 @@ import markdownDirective from '@/directives/markdown';
import externalLinks from '../../mixins/externalLinks'; import externalLinks from '../../mixins/externalLinks';
import challengeItem from './challengeItem'; import challengeItem from './challengeItem';
import challengeIcon from '@/assets/svg/challenge.svg'; import challengeIcon from '@/assets/svg/challenge.svg?raw';
export default { export default {
components: { components: {

View File

@@ -86,7 +86,7 @@
</template> </template>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
@media only screen and (max-width: 768px) { @media only screen and (max-width: 768px) {
.header-row { .header-row {
@@ -150,8 +150,8 @@ import challengeModal from './challengeModal';
import challengeUtilities from '@/mixins/challengeUtilities'; import challengeUtilities from '@/mixins/challengeUtilities';
import externalLinks from '@/mixins/externalLinks'; import externalLinks from '@/mixins/externalLinks';
import challengeIcon from '@/assets/svg/challenge.svg'; import challengeIcon from '@/assets/svg/challenge.svg?raw';
import positiveIcon from '@/assets/svg/positive.svg'; import positiveIcon from '@/assets/svg/positive.svg?raw';
export default { export default {
components: { components: {

View File

@@ -102,7 +102,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.modal-body { .modal-body {
padding: 0px 8px 0px 8px; padding: 0px 8px 0px 8px;
@@ -207,8 +207,8 @@ import { mapState } from '@/libs/store';
import notifications from '@/mixins/notifications'; import notifications from '@/mixins/notifications';
import { userStateMixin } from '../../mixins/userState'; import { userStateMixin } from '../../mixins/userState';
import markdownDirective from '@/directives/markdown'; import markdownDirective from '@/directives/markdown';
import svgClose from '@/assets/svg/close.svg'; import svgClose from '@/assets/svg/close.svg?raw';
import svgReport from '@/assets/svg/report.svg'; import svgReport from '@/assets/svg/report.svg?raw';
export default { export default {
directives: { directives: {

View File

@@ -34,8 +34,8 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/tiers.scss'; @import '@/assets/scss/tiers.scss';
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.autocomplete-results { .autocomplete-results {
padding: .5em; padding: .5em;
@@ -74,16 +74,16 @@
<script> <script>
import groupBy from 'lodash/groupBy'; import groupBy from 'lodash/groupBy';
import styleHelper from '@/mixins/styleHelper'; import styleHelper from '@/mixins/styleHelper';
import tier1 from '@/assets/svg/tier-1.svg'; import tier1 from '@/assets/svg/tier-1.svg?raw';
import tier2 from '@/assets/svg/tier-2.svg'; import tier2 from '@/assets/svg/tier-2.svg?raw';
import tier3 from '@/assets/svg/tier-3.svg'; import tier3 from '@/assets/svg/tier-3.svg?raw';
import tier4 from '@/assets/svg/tier-4.svg'; import tier4 from '@/assets/svg/tier-4.svg?raw';
import tier5 from '@/assets/svg/tier-5.svg'; import tier5 from '@/assets/svg/tier-5.svg?raw';
import tier6 from '@/assets/svg/tier-6.svg'; import tier6 from '@/assets/svg/tier-6.svg?raw';
import tier7 from '@/assets/svg/tier-7.svg'; import tier7 from '@/assets/svg/tier-7.svg?raw';
import tier8 from '@/assets/svg/tier-mod.svg'; import tier8 from '@/assets/svg/tier-mod.svg?raw';
import tier9 from '@/assets/svg/tier-staff.svg'; import tier9 from '@/assets/svg/tier-staff.svg?raw';
import tierNPC from '@/assets/svg/tier-npc.svg'; import tierNPC from '@/assets/svg/tier-npc.svg?raw';
export default { export default {
mixins: [styleHelper], mixins: [styleHelper],

View File

@@ -63,7 +63,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.avatar { .avatar {
width: 10%; width: 10%;

View File

@@ -95,7 +95,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.modal-body { .modal-body {
padding: 0px 8px 0px 8px; padding: 0px 8px 0px 8px;
@@ -199,7 +199,7 @@
import notifications from '@/mixins/notifications'; import notifications from '@/mixins/notifications';
import markdownDirective from '@/directives/markdown'; import markdownDirective from '@/directives/markdown';
import { userStateMixin } from '../../mixins/userState'; import { userStateMixin } from '../../mixins/userState';
import svgClose from '@/assets/svg/close.svg'; import svgClose from '@/assets/svg/close.svg?raw';
export default { export default {
directives: { directives: {

View File

@@ -572,7 +572,7 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
$dialogMarginTop: 56px; $dialogMarginTop: 56px;
$userCreationBgHeight: 105px; $userCreationBgHeight: 105px;
@@ -671,7 +671,7 @@
} }
.user-creation-bg { .user-creation-bg {
background-image: url('~@/assets/creator/creator-hills-bg.png'); background-image: url('@/assets/creator/creator-hills-bg.png');
height: $userCreationBgHeight; height: $userCreationBgHeight;
width: 219px; width: 219px;
margin: 0 auto; margin: 0 auto;
@@ -1001,18 +1001,18 @@ import hairSettings from './avatarModal/hair-settings';
import extraSettings from './avatarModal/extra-settings'; import extraSettings from './avatarModal/extra-settings';
import closeX from './ui/closeX'; import closeX from './ui/closeX';
import logoPurple from '@/assets/svg/logo-purple.svg'; import logoPurple from '@/assets/svg/logo-purple.svg?raw';
import bodyIcon from '@/assets/svg/body.svg'; import bodyIcon from '@/assets/svg/body.svg?raw';
import accessoriesIcon from '@/assets/svg/accessories.svg'; import accessoriesIcon from '@/assets/svg/accessories.svg?raw';
import skinIcon from '@/assets/svg/skin.svg'; import skinIcon from '@/assets/svg/skin.svg?raw';
import hairIcon from '@/assets/svg/hair.svg'; import hairIcon from '@/assets/svg/hair.svg?raw';
import backgroundsIcon from '@/assets/svg/backgrounds.svg'; import backgroundsIcon from '@/assets/svg/backgrounds.svg?raw';
import gem from '@/assets/svg/gem.svg'; import gem from '@/assets/svg/gem.svg?raw';
import hourglass from '@/assets/svg/hourglass.svg'; import hourglass from '@/assets/svg/hourglass.svg?raw';
import gold from '@/assets/svg/gold.svg'; import gold from '@/assets/svg/gold.svg?raw';
import arrowRight from '@/assets/svg/arrow_right.svg'; import arrowRight from '@/assets/svg/arrow_right.svg?raw';
import arrowLeft from '@/assets/svg/arrow_left.svg'; import arrowLeft from '@/assets/svg/arrow_left.svg?raw';
import svgClose from '@/assets/svg/close.svg'; import svgClose from '@/assets/svg/close.svg?raw';
import { avatarEditorUtilities } from '../mixins/avatarEditUtilities'; import { avatarEditorUtilities } from '../mixins/avatarEditUtilities';
import Sprite from './ui/sprite'; import Sprite from './ui/sprite';

View File

@@ -60,7 +60,7 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#external-link-modal { #external-link-modal {
&.modal { &.modal {
@@ -174,8 +174,8 @@
</style> </style>
<script> <script>
import exclamationIcon from '@/assets/svg/exclamation.svg'; import exclamationIcon from '@/assets/svg/exclamation.svg?raw';
import closeIcon from '@/assets/svg/new-close.svg'; import closeIcon from '@/assets/svg/new-close.svg?raw';
export default { export default {
data () { data () {

View File

@@ -39,7 +39,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.face-avatar { .face-avatar {
width: 36px; width: 36px;

View File

@@ -108,7 +108,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h2 { h2 {
color: $purple-300; color: $purple-300;
@@ -201,7 +201,7 @@
</style> </style>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/mixins.scss'; @import '@/assets/scss/mixins.scss';
#create-group { #create-group {
.modal-dialog { .modal-dialog {
max-width: 448px; max-width: 448px;

View File

@@ -28,9 +28,9 @@
></div> ></div>
<img <img
class="task-columns" class="task-columns"
src="~@/assets/images/group-plans/task-columns.png" src="@/assets/images/group-plans/task-columns.png"
srcset="~@/assets/images/group-plans/task-columns@2x.png 2x, srcset="@/assets/images/group-plans/task-columns@2x.png 2x,
~@/assets/images/group-plans/task-columns@3x.png 3x" @/assets/images/group-plans/task-columns@3x.png 3x"
> >
</div> </div>
<div <div
@@ -96,7 +96,7 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#group-plans-update { #group-plans-update {
.modal-content { .modal-content {
border-top-left-radius: 10px; border-top-left-radius: 10px;
@@ -125,7 +125,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h2 { h2 {
color: $white; color: $white;
line-height: 28px; line-height: 28px;
@@ -183,8 +183,8 @@
</style> </style>
<script> <script>
import closeIcon from '@/assets/svg/close.svg'; import closeIcon from '@/assets/svg/close.svg?raw';
import sparkles from '@/assets/svg/sparkles-left.svg'; import sparkles from '@/assets/svg/sparkles-left.svg?raw';
export default { export default {
data () { data () {

View File

@@ -125,8 +125,8 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
@import '~@/assets/scss/create-task.scss'; @import '@/assets/scss/create-task.scss';
h1 { h1 {
color: $purple-300; color: $purple-300;
@@ -190,13 +190,13 @@ import toggleSwitch from '@/components/ui/toggleSwitch';
import sync from '../../mixins/sync'; import sync from '../../mixins/sync';
import positiveIcon from '@/assets/svg/positive.svg'; import positiveIcon from '@/assets/svg/positive.svg?raw';
import filterIcon from '@/assets/svg/filter.svg'; import filterIcon from '@/assets/svg/filter.svg?raw';
import deleteIcon from '@/assets/svg/delete.svg'; import deleteIcon from '@/assets/svg/delete.svg?raw';
import habitIcon from '@/assets/svg/habit.svg'; import habitIcon from '@/assets/svg/habit.svg?raw';
import dailyIcon from '@/assets/svg/daily.svg'; import dailyIcon from '@/assets/svg/daily.svg?raw';
import todoIcon from '@/assets/svg/todo.svg'; import todoIcon from '@/assets/svg/todo.svg?raw';
import rewardIcon from '@/assets/svg/reward.svg'; import rewardIcon from '@/assets/svg/reward.svg?raw';
import * as Analytics from '@/libs/analytics'; import * as Analytics from '@/libs/analytics';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';

View File

@@ -212,8 +212,8 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
@import '~@/assets/scss/variables.scss'; @import '@/assets/scss/variables.scss';
.chat-actions { .chat-actions {
margin-top: 1em; margin-top: 1em;

View File

@@ -21,7 +21,7 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.community-guidelines { .community-guidelines {
background-color: rgba(135, 129, 144, 0.84); background-color: rgba(135, 129, 144, 0.84);

View File

@@ -114,7 +114,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.copy-icon { .copy-icon {
width: 1rem; width: 1rem;
@@ -163,7 +163,7 @@
width: 100%; width: 100%;
.quest_screen { .quest_screen {
background-image: url('~@/assets/images/group@3x.png'); background-image: url('@/assets/images/group@3x.png');
background-size: cover; background-size: cover;
width: 100%; width: 100%;
height: 246px; height: 246px;
@@ -196,7 +196,7 @@
} }
.join-party { .join-party {
background-image: url('~@/assets/images/party.png'); background-image: url('@/assets/images/party.png');
background-size: cover; background-size: cover;
width: 203px; width: 203px;
height: 66px; height: 66px;
@@ -244,7 +244,7 @@ import * as Analytics from '@/libs/analytics';
import notifications from '@/mixins/notifications'; import notifications from '@/mixins/notifications';
import closeX from '../ui/closeX'; 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'; import copyToClipboard from '@/mixins/copyToClipboard';
export default { export default {

View File

@@ -65,7 +65,7 @@ b-dropdown(:text="$t('sort')", right=true)
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.sort-select { .sort-select {
margin: 2em; margin: 2em;
@@ -95,7 +95,7 @@ import PublicGuildItem from './publicGuildItem';
import Sidebar from './groupSidebar'; import Sidebar from './groupSidebar';
import groupUtilities from '@/mixins/groupsUtilities'; import groupUtilities from '@/mixins/groupsUtilities';
import positiveIcon from '@/assets/svg/positive.svg'; import positiveIcon from '@/assets/svg/positive.svg?raw';
function _mapCategories (guilds) { function _mapCategories (guilds) {
guilds.forEach(guild => { guilds.forEach(guild => {

View File

@@ -115,7 +115,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
@media (min-width: 1300px) { @media (min-width: 1300px) {
.standard-page { .standard-page {
@@ -297,17 +297,17 @@ import markdownDirective from '@/directives/markdown';
import chat from './chat'; import chat from './chat';
import userLink from '../userLink'; import userLink from '../userLink';
import deleteIcon from '@/assets/svg/delete.svg'; import deleteIcon from '@/assets/svg/delete.svg?raw';
import copyIcon from '@/assets/svg/copy.svg'; import copyIcon from '@/assets/svg/copy.svg?raw';
import likeIcon from '@/assets/svg/like.svg'; import likeIcon from '@/assets/svg/like.svg?raw';
import likedIcon from '@/assets/svg/liked.svg'; import likedIcon from '@/assets/svg/liked.svg?raw';
import reportIcon from '@/assets/svg/report.svg'; import reportIcon from '@/assets/svg/report.svg?raw';
import gemIcon from '@/assets/svg/gem.svg'; import gemIcon from '@/assets/svg/gem.svg?raw';
import questIcon from '@/assets/svg/quest.svg'; import questIcon from '@/assets/svg/quest.svg?raw';
import questBackground from '@/assets/svg/quest-background-border.svg'; import questBackground from '@/assets/svg/quest-background-border.svg?raw';
import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-small.svg'; import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-small.svg?raw';
import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-small.svg'; import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-small.svg?raw';
import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-small.svg'; import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-small.svg?raw';
import QuestDetailModal from './questDetailModal'; import QuestDetailModal from './questDetailModal';
import RightSidebar from '@/components/groups/rightSidebar'; import RightSidebar from '@/components/groups/rightSidebar';
import InvitationListModal from './invitationListModal'; import InvitationListModal from './invitationListModal';

View File

@@ -312,7 +312,7 @@ label.custom-control-label(v-once) {{ $t('allowGuildInvitationsFromNonMembers')
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.custom-control-input { .custom-control-input {
z-index: 1 !important; 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 CategoryOptions from '@/../../common/script/content/categoryOptions';
import toggleSwitch from '@/components/ui/toggleSwitch'; import toggleSwitch from '@/components/ui/toggleSwitch';
import markdownDirective from '@/directives/markdown'; import markdownDirective from '@/directives/markdown';
import gemIcon from '@/assets/svg/gem.svg'; import gemIcon from '@/assets/svg/gem.svg?raw';
import informationIcon from '@/assets/svg/information.svg'; import informationIcon from '@/assets/svg/information.svg?raw';
import { userStateMixin } from '../../mixins/userState'; import { userStateMixin } from '../../mixins/userState';

View File

@@ -79,7 +79,7 @@
</template> </template>
<style lang='scss'> <style lang='scss'>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
#invitation-list { #invitation-list {
.modal-header { .modal-header {
@@ -127,7 +127,7 @@
</style> </style>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.header-wrap { .header-wrap {
width: 100%; width: 100%;
@@ -242,8 +242,8 @@ import CloseIcon from '../shared/closeIcon';
import ClassBadge from '../members/classBadge'; import ClassBadge from '../members/classBadge';
import UserLabel from '../userLabel'; import UserLabel from '../userLabel';
import svgClose from '@/assets/svg/close.svg'; import svgClose from '@/assets/svg/close.svg?raw';
import svgCheck from '@/assets/svg/check.svg'; import svgCheck from '@/assets/svg/check.svg?raw';
export default { export default {
components: { components: {

View File

@@ -75,7 +75,7 @@
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
a:not([href]) { a:not([href]) {
font-size: 16px; font-size: 16px;
@@ -126,7 +126,7 @@ import isEmail from 'validator/es/lib/isEmail';
import isUUID from 'validator/es/lib/isUUID'; import isUUID from 'validator/es/lib/isUUID';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import notifications from '@/mixins/notifications'; 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 }; const INVITE_DEFAULTS = { text: '', error: null, valid: null };

View File

@@ -128,7 +128,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h1 { h1 {
color: $purple-300; color: $purple-300;
@@ -252,12 +252,12 @@ import Avatar from '../avatar';
import userLink from '../userLink'; import userLink from '../userLink';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import syncIcon from '@/assets/svg/sync-2.svg'; import syncIcon from '@/assets/svg/sync-2.svg?raw';
import usersIcon from '@/assets/svg/users.svg'; import usersIcon from '@/assets/svg/users.svg?raw';
import warriorIcon from '@/assets/svg/warrior.svg'; import warriorIcon from '@/assets/svg/warrior.svg?raw';
import rogueIcon from '@/assets/svg/rogue.svg'; import rogueIcon from '@/assets/svg/rogue.svg?raw';
import healerIcon from '@/assets/svg/healer.svg'; import healerIcon from '@/assets/svg/healer.svg?raw';
import wizardIcon from '@/assets/svg/wizard.svg'; import wizardIcon from '@/assets/svg/wizard.svg?raw';
export default { export default {
components: { components: {

View File

@@ -45,6 +45,9 @@
<div class="col-5"> <div class="col-5">
<select-list <select-list
:items="sortOptions" :items="sortOptions"
:hide-icon="false"
:inline-dropdown="false"
:direct-select="true"
:value="optionEntryBySelectedValue" :value="optionEntryBySelectedValue"
key-prop="value" key-prop="value"
@select="changeSortOption($event)" @select="changeSortOption($event)"
@@ -61,6 +64,9 @@
<select-list <select-list
:items="sortDirections" :items="sortDirections"
:value="directionEntryBySelectedValue" :value="directionEntryBySelectedValue"
:hide-icon="false"
:inline-dropdown="false"
:direct-select="true"
key-prop="value" key-prop="value"
@select="changeSortDirection($event)" @select="changeSortDirection($event)"
> >
@@ -278,7 +284,7 @@
</style> </style>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.apply-options { .apply-options {
padding: 1em; padding: 1em;
@@ -372,10 +378,10 @@ import isEmpty from 'lodash/isEmpty';
import removeMemberModal from '@/components/members/removeMemberModal'; import removeMemberModal from '@/components/members/removeMemberModal';
import loadingGryphon from '@/components/ui/loadingGryphon'; import loadingGryphon from '@/components/ui/loadingGryphon';
import MemberDetails from '../memberDetails'; import MemberDetails from '../memberDetails';
import blockIcon from '@/assets/svg/block.svg'; import blockIcon from '@/assets/svg/block.svg?raw';
import messageIcon from '@/assets/members/message.svg'; import messageIcon from '@/assets/members/message.svg?raw';
import starIcon from '@/assets/members/star.svg'; import starIcon from '@/assets/members/star.svg?raw';
import dots from '@/assets/svg/dots.svg'; import dots from '@/assets/svg/dots.svg?raw';
import SelectList from '@/components/ui/selectList'; import SelectList from '@/components/ui/selectList';
import { PAGES } from '@/libs/consts'; import { PAGES } from '@/libs/consts';
import { userStateMixin } from '../../mixins/userState'; import { userStateMixin } from '../../mixins/userState';

View File

@@ -81,7 +81,7 @@ b-dropdown(:text="$t('sort')", right=true)
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.sort-select { .sort-select {
margin: 2em; margin: 2em;
} }
@@ -115,8 +115,8 @@ import groupUtilities from '@/mixins/groupsUtilities';
import PublicGuildItem from './publicGuildItem'; import PublicGuildItem from './publicGuildItem';
import Sidebar from './groupSidebar'; import Sidebar from './groupSidebar';
import greyBadgeIcon from '@/assets/svg/grey-badge.svg'; import greyBadgeIcon from '@/assets/svg/grey-badge.svg?raw';
import positiveIcon from '@/assets/svg/positive.svg'; import positiveIcon from '@/assets/svg/positive.svg?raw';
export default { export default {
components: { PublicGuildItem, Sidebar }, components: { PublicGuildItem, Sidebar },

View File

@@ -87,7 +87,7 @@
</style> </style>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.header-wrap { .header-wrap {
width: 100%; width: 100%;

View File

@@ -109,7 +109,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.card-link { .card-link {
color: #4E4A57 !important; color: #4E4A57 !important;
@@ -218,10 +218,10 @@ import { mapState } from '@/libs/store';
import categoryTags from '../categories/categoryTags'; import categoryTags from '../categories/categoryTags';
import groupUtilities from '@/mixins/groupsUtilities'; import groupUtilities from '@/mixins/groupsUtilities';
import markdown from '@/directives/markdown'; import markdown from '@/directives/markdown';
import gemIcon from '@/assets/svg/gem.svg'; import gemIcon from '@/assets/svg/gem.svg?raw';
import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-large.svg'; import goldGuildBadgeIcon from '@/assets/svg/gold-guild-badge-large.svg?raw';
import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-large.svg'; import silverGuildBadgeIcon from '@/assets/svg/silver-guild-badge-large.svg?raw';
import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-large.svg'; import bronzeGuildBadgeIcon from '@/assets/svg/bronze-guild-badge-large.svg?raw';
export default { export default {
directives: { directives: {

View File

@@ -151,7 +151,7 @@
</template> </template>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h2 { h2 {
color: $purple-300; color: $purple-300;
@@ -308,7 +308,7 @@ import getItemInfo from '@/../../common/script/libs/getItemInfo';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import * as Analytics from '@/libs/analytics'; 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 questDialogContent from '../shops/quests/questDialogContent';
import closeIcon from '../shared/closeIcon'; import closeIcon from '../shared/closeIcon';
import QuestRewards from '../shops/quests/questRewards'; import QuestRewards from '../shops/quests/questRewards';

View File

@@ -268,7 +268,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.svg-icon { .svg-icon {
height: 25px; height: 25px;
@@ -644,10 +644,10 @@ import { mapState } from '@/libs/store';
import sidebarSection from '../sidebarSection'; import sidebarSection from '../sidebarSection';
import Sprite from '../ui/sprite'; import Sprite from '../ui/sprite';
import questIcon from '@/assets/svg/quest.svg'; import questIcon from '@/assets/svg/quest.svg?raw';
import swordIcon from '@/assets/svg/sword.svg'; import swordIcon from '@/assets/svg/sword.svg?raw';
import rageIcon from '@/assets/svg/rage.svg'; import rageIcon from '@/assets/svg/rage.svg?raw';
import healthNoPaddingIcon from '@/assets/svg/health_no_padding.svg'; import healthNoPaddingIcon from '@/assets/svg/health_no_padding.svg?raw';
import questActionsMixin from '@/components/groups/questActions.mixin'; import questActionsMixin from '@/components/groups/questActions.mixin';
export default { export default {

View File

@@ -143,12 +143,12 @@ import questSidebarSection from '@/components/groups/questSidebarSection';
import sidebarSection from '@/components/sidebarSection'; import sidebarSection from '@/components/sidebarSection';
import markdownDirective from '@/directives/markdown'; import markdownDirective from '@/directives/markdown';
import menuIcon from '@/assets/svg/menu.svg'; import menuIcon from '@/assets/svg/menu.svg?raw';
import sparklesIcon from '@/assets/svg/sparklesIcon.svg'; import sparklesIcon from '@/assets/svg/sparklesIcon.svg?raw';
import leaveIcon from '@/assets/svg/leave.svg'; import leaveIcon from '@/assets/svg/leave.svg?raw';
import editIcon from '@/assets/svg/edit.svg'; import editIcon from '@/assets/svg/edit.svg?raw';
import messageIcon from '@/assets/svg/message.svg'; import messageIcon from '@/assets/svg/message.svg?raw';
import usersIcon from '@/assets/svg/users.svg'; import usersIcon from '@/assets/svg/users.svg?raw';
export default { export default {
components: { components: {
@@ -181,7 +181,7 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
@media (min-width: 1300px) { @media (min-width: 1300px) {
.sidebar { .sidebar {

View File

@@ -157,12 +157,12 @@
<img <img
v-if="!group.quest.extra.worldDmg.seasonalShop" v-if="!group.quest.extra.worldDmg.seasonalShop"
class="rage-strike" class="rage-strike"
src="~@/assets/images/world-boss/rage_strike@2x.png" src="@/assets/images/world-boss/rage_strike@2x.png"
> >
<img <img
v-if="group.quest.extra.worldDmg.seasonalShop" v-if="group.quest.extra.worldDmg.seasonalShop"
class="rage-strike-active" 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>
<div <div
@@ -172,12 +172,12 @@
<img <img
v-if="!group.quest.extra.worldDmg.market" v-if="!group.quest.extra.worldDmg.market"
class="rage-strike" class="rage-strike"
src="~@/assets/images/world-boss/rage_strike@2x.png" src="@/assets/images/world-boss/rage_strike@2x.png"
> >
<img <img
v-if="group.quest.extra.worldDmg.market" v-if="group.quest.extra.worldDmg.market"
class="rage-strike-active" 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>
<div <div
@@ -187,12 +187,12 @@
<img <img
v-if="!group.quest.extra.worldDmg.quests" v-if="!group.quest.extra.worldDmg.quests"
class="rage-strike" class="rage-strike"
src="~@/assets/images/world-boss/rage_strike@2x.png" src="@/assets/images/world-boss/rage_strike@2x.png"
> >
<img <img
v-if="group.quest.extra.worldDmg.quests" v-if="group.quest.extra.worldDmg.quests"
class="rage-strike-active" 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>
</div> </div>
@@ -486,7 +486,7 @@
</template> </template>
<style lang='scss' scoped> <style lang='scss' scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
h1 { h1 {
color: $purple-200; color: $purple-200;
@@ -756,25 +756,25 @@ import worldBossRageModal from '../world-boss/worldBossRageModal';
import sidebarSection from '../sidebarSection'; import sidebarSection from '../sidebarSection';
import chat from './chat'; import chat from './chat';
import challengeIcon from '@/assets/svg/challenge.svg'; import challengeIcon from '@/assets/svg/challenge.svg?raw';
import chevronIcon from '@/assets/svg/chevron-red.svg'; import chevronIcon from '@/assets/svg/chevron-red.svg?raw';
import gemIcon from '@/assets/svg/gem.svg'; import gemIcon from '@/assets/svg/gem.svg?raw';
import healthIcon from '@/assets/svg/health.svg'; import healthIcon from '@/assets/svg/health.svg?raw';
import informationIconRed from '@/assets/svg/information-red.svg'; import informationIconRed from '@/assets/svg/information-red.svg?raw';
import questBackground from '@/assets/svg/quest-background-border.svg'; import questBackground from '@/assets/svg/quest-background-border.svg?raw';
import rageIcon from '@/assets/svg/rage.svg'; import rageIcon from '@/assets/svg/rage.svg?raw';
import swordIcon from '@/assets/svg/sword.svg'; import swordIcon from '@/assets/svg/sword.svg?raw';
import tier1 from '@/assets/svg/tier-1.svg'; import tier1 from '@/assets/svg/tier-1.svg?raw';
import tier2 from '@/assets/svg/tier-2.svg'; import tier2 from '@/assets/svg/tier-2.svg?raw';
import tier3 from '@/assets/svg/tier-3.svg'; import tier3 from '@/assets/svg/tier-3.svg?raw';
import tier4 from '@/assets/svg/tier-4.svg'; import tier4 from '@/assets/svg/tier-4.svg?raw';
import tier5 from '@/assets/svg/tier-5.svg'; import tier5 from '@/assets/svg/tier-5.svg?raw';
import tier6 from '@/assets/svg/tier-6.svg'; import tier6 from '@/assets/svg/tier-6.svg?raw';
import tier7 from '@/assets/svg/tier-7.svg'; import tier7 from '@/assets/svg/tier-7.svg?raw';
import tierMod from '@/assets/svg/tier-mod.svg'; import tierMod from '@/assets/svg/tier-mod.svg?raw';
import tierNPC from '@/assets/svg/tier-npc.svg'; import tierNPC from '@/assets/svg/tier-npc.svg?raw';
import tierStaff from '@/assets/svg/tier-staff.svg'; import tierStaff from '@/assets/svg/tier-staff.svg?raw';
import staffList from '../../libs/staffList'; import staffList from '../../libs/staffList';
import reportBug from '@/mixins/reportBug.js'; import reportBug from '@/mixins/reportBug.js';

View File

@@ -20,7 +20,7 @@ body.modal-open .habitica-top-banner {
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.habitica-top-banner { .habitica-top-banner {
width: 100%; width: 100%;

View File

@@ -41,7 +41,7 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '~@/assets/scss/colors.scss'; @import '@/assets/scss/colors.scss';
.announce-text { .announce-text {
color: $purple-50; color: $purple-50;
@@ -56,7 +56,7 @@
rgba(255,190,93,1) 25%, rgba(255,190,93,1) 25%,
rgba(255,190,93,1) 75%, rgba(255,190,93,1) 75%,
rgba(255,190,93,0) 100%), rgba(255,190,93,0) 100%),
url('~@/assets/images/glitter.png'); url('@/assets/images/glitter.png');
cursor: pointer; cursor: pointer;
} }
@@ -86,8 +86,8 @@ import find from 'lodash/find';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import BaseBanner from './base'; import BaseBanner from './base';
import giftsBirthday from '@/assets/svg/gifts-birthday.svg'; import giftsBirthday from '@/assets/svg/gifts-birthday.svg?raw';
import tenBirthday from '@/assets/svg/10th-birthday-linear.svg'; import tenBirthday from '@/assets/svg/10th-birthday-linear.svg?raw';
export default { export default {
components: { components: {

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