384 Commits

Author SHA1 Message Date
MAZE
ad57f082ca fix: wip for ios 2025-02-18 19:53:20 +03:30
MAZE
54b46123b4 fix: wip for ios 2025-02-18 19:42:05 +03:30
MAZE
699f49bfa3 feat: add binary animation 2025-02-14 15:20:17 +03:30
MAZE
29bebb3ec7 feat: add cipher animation 2025-02-14 15:14:53 +03:30
MAZE
7a47282165 chore: update logos 2025-02-13 20:35:40 +03:30
MAZE
2b85b276eb chore: update logos 2025-02-13 20:32:28 +03:30
MAZE ✧
0a1bf16d18 Merge pull request #54 from underoot/feature/media-controls
feat: media session support
2025-02-13 20:09:11 +03:30
MAZE
10259d013f feat: better heading 2025-02-13 20:04:10 +03:30
MAZE
e61307a302 feat: use custom slider in binaural and isochronic 2025-02-13 19:53:39 +03:30
MAZE
cb340c53a3 feat: add custom checkbox 2025-02-13 19:47:54 +03:30
MAZE
3b77c12114 feat: add custom slider 2025-02-13 19:43:21 +03:30
MAZE
b8ed79f48a feat: remove pre-made binaurals 2025-02-13 19:38:44 +03:30
Aleksandr Shoronov
d3a9f1ddba Removed Media Controls menu item 2025-01-26 10:57:51 +02:00
Aleksandr Shoronov
18ed2e6f05 feat: media session support 2025-01-18 14:06:37 +02:00
MAZE
3b829fce07 feat: add global volume 2024-10-13 21:54:52 +03:30
MAZE
e77c67bc24 fix: better implement shortcuts 2024-10-13 21:32:58 +03:30
MAZE
14c331ab6e fix: add default value 2024-09-13 19:59:29 +03:30
MAZE
5c536786ea style: add style to generators 2024-09-13 15:58:03 +03:30
MAZE
2e1fce4669 style: change icons 2024-09-13 15:28:04 +03:30
MAZE
d759064373 feat: add isochronic tone generator without styles 2024-09-13 15:17:20 +03:30
MAZE
f40e8206f8 feat: add binaural beat generator without styles 2024-09-13 14:55:04 +03:30
MAZE
d2e289e5d5 feat: add more sounds 2024-09-03 18:49:47 +03:30
MAZE
a59db41dc5 feat: change and add shortcuts 2024-09-03 18:30:24 +03:30
MAZE
554309ebd8 feat: add more sounds 2024-09-03 18:27:30 +03:30
MAZE
be38b92647 feat: add more sounds 2024-09-03 18:12:33 +03:30
MAZE
b497d16fd8 feat: add more sounds 2024-09-03 17:51:19 +03:30
MAZE
ace0d6eecc feat: add confetti 2024-09-01 13:07:19 +04:30
MAZE
aa8161aac5 feat: add done counter 2024-09-01 13:00:10 +04:30
MAZE
c6cc61a17f feat: add header to todos 2024-09-01 12:57:59 +04:30
MAZE
7f3ac26b98 style: minor changes 2024-09-01 12:48:15 +04:30
MAZE
6a4dc1ed95 feat: bring back all tools 2024-09-01 12:44:27 +04:30
MAZE
4cc85975e5 style: minor changes 2024-09-01 12:29:56 +04:30
MAZE
d42eb25f7b fix: disable the sleep timer when no sound is selected 2024-08-31 20:43:22 +03:30
MAZE
4f45279938 feat: change shortcuts 2024-08-31 20:41:22 +03:30
MAZE
105f53ea02 feat: add reverse timer 2024-08-31 19:39:31 +03:30
MAZE
f3cea66847 refactor: relocate folders 2024-08-31 19:25:51 +03:30
MAZE
a4a31dd43e refactor: remove extra hook 2024-08-31 19:22:07 +03:30
MAZE
973e0df6fb feat: remove all extra tools 2024-08-31 19:19:42 +03:30
MAZE
13d26b3337 feat: remove lofi modal 2024-08-31 19:11:58 +03:30
MAZE
e1de5c48b2 feat: bring back all tools 2024-08-31 19:05:12 +03:30
MAZE
07f37ef17f feat: add desktop notice 2024-08-31 18:22:46 +03:30
MAZE
bb39b4ba98 feat: add lofi radios 2024-08-31 18:15:24 +03:30
MAZE
76fdc74710 feat: remove the breathing exercises 2024-08-31 17:49:00 +03:30
MAZE
41845ffe5e style: remove animation on change 2024-08-31 14:34:10 +04:30
MAZE
48a85b2601 feat: add animation for labels 2024-08-31 14:02:11 +04:30
MAZE
5865fc867d feat: add timer for breathing exercises 2024-08-31 13:58:44 +04:30
MAZE
b27f24d374 style: minor changes 2024-08-31 13:26:10 +04:30
MAZE
5c9a2aa23a style: change border radius 2024-08-31 13:09:55 +04:30
MAZE
12d3255d57 style: fix pointer event 2024-08-31 13:00:04 +04:30
MAZE
c12ef12b79 style: remove pointer event 2024-08-31 12:55:55 +04:30
MAZE
ba3cd5ca5b style: add binary pattern 2024-08-31 12:49:40 +04:30
MAZE
a3b794d974 feat: add breathing exercise shortcut 2024-08-31 00:23:21 +03:30
MAZE
3ef4a076a2 fix: remove extra hook 2024-08-31 00:21:08 +03:30
MAZE
1f2b6b952c feat: add breathing exercise 2024-08-31 00:19:55 +03:30
MAZE
2bbdc7e09e feat: remove all tools 2024-08-31 00:10:58 +03:30
MAZE
47a63a774e feat: add store to the notepad 2024-08-30 23:38:37 +03:30
MAZE
edd53d8102 feat: add countdown timer 2024-08-30 23:35:58 +03:30
MAZE
302a71cdc6 style: minor change 2024-08-30 23:18:15 +03:30
MAZE
b73fd0b16e style: minor change 2024-08-30 23:17:13 +03:30
MAZE
5b3972b347 feat: add Moodist description to tools 2024-08-30 22:26:57 +03:30
MAZE
bee391acfe feat: add pomodoro timer tool 2024-08-30 22:21:23 +03:30
MAZE
1fd02f927c feat: add notepad tool page 2024-08-30 22:14:15 +03:30
MAZE
d56f8be448 refactor: refactor the breathing tool 2024-08-30 22:10:21 +03:30
MAZE
eee755378a feat: add breathing exercises and other tools 2024-08-30 22:09:07 +03:30
MAZE
4b015016e7 style: change logo color 2024-08-30 17:51:51 +03:30
MAZE
251f30930c feat: change shortcuts 2024-08-30 17:17:46 +03:30
MAZE
a29e2c20e4 style: minor changes 2024-08-30 17:14:29 +03:30
MAZE
1cf9a85e13 style: center icons 2024-08-30 17:09:07 +03:30
MAZE
69eb8832da style: add pattern 2024-08-30 17:01:30 +03:30
MAZE
c1ece582f4 feat: add new logo 2024-08-30 16:42:41 +03:30
MAZE
b32d8b2803 feat: remove all tools 2024-08-30 16:33:20 +03:30
MAZE
1768ba1548 feat: update the menu items 2024-08-30 15:30:22 +03:30
MAZE
a80289db57 feat: add notepad tool 2024-08-30 15:24:39 +03:30
MAZE
9208663050 style: change description 2024-08-30 15:20:28 +03:30
MAZE
d2edeb48be feat: add pomodoro timer 2024-08-30 15:19:35 +03:30
MAZE
27f25785e1 feat: add breathing exercises tool 2024-08-30 15:12:11 +03:30
MAZE ✧
f526f97908 Merge pull request #39 from arapl3y/feature/fix-modal-layout-shift
feat: fix modal and scrollbar layout shift
2024-08-03 21:35:17 +03:30
Alex Rapley
e399673462 feat: fix modal and scrollbar layout shift 2024-08-02 16:40:08 +10:00
MAZE
3d83a1427f perf: improve the breathing cricle 2024-07-06 19:37:30 +03:30
MAZE ✧
ddf929f4c0 Merge pull request #38 from SuperMeepBoy/accessbility-ignore-icons-screen-reader
accessibility: ignore icons for screen readers
2024-07-06 19:34:29 +03:30
MAZE
5ffb06be03 refactor: remove the timer store 2024-07-06 19:31:32 +03:30
MAZE
d6ed3fd251 feat: remove the countdown timer 2024-07-06 19:29:52 +03:30
MAZE
0052b917a8 style: reorder menu items 2024-07-04 20:02:46 +03:30
MAZE
9e38a8fd7d style: change gradient 2024-07-01 20:28:23 +03:30
MAZE
60cb453847 feat: add shortcut for breathing exercise 2024-07-01 18:54:09 +03:30
MAZE
fc4f52146e feat: add simple breathing exercise tool 2024-07-01 18:50:12 +03:30
MAZE
1a1359c989 fix: icons path 2024-06-25 20:02:19 +04:30
MAZE
a6c7ac41ad feat: replace reverse timer 2024-06-25 20:01:10 +04:30
MAZE
3e11fb6123 feat: add move up and down functionality 2024-06-25 19:56:04 +04:30
Jef Roelandt
ee0a28b296 accessibility: ignore icons for screen readers 2024-06-19 23:08:39 +02:00
MAZE
d356d77aa9 test: write tests for motion lib 2024-06-19 14:26:23 +04:30
MAZE
9cc0ccd325 test: write more tests 2024-06-19 14:23:27 +04:30
MAZE
cad85c7667 test: write tests for random helper 2024-06-19 14:18:47 +04:30
MAZE
def9a57e0c test: add Vitest and some tests 2024-06-19 14:12:06 +04:30
MAZE
74f6b5851d feat: scroll into view after marking favorite 2024-06-17 21:01:53 +04:30
MAZE
f4c66e3092 feat: scroll the new timer into view 2024-06-16 22:22:32 +03:30
MAZE
28abc16b9c style: remove animations 2024-06-16 22:14:47 +03:30
MAZE
787a9b60b5 style: add animation to presets 2024-06-16 22:14:44 +04:30
MAZE
73a5c21be9 chore: add animation to countdown timer 2024-06-16 22:12:12 +04:30
MAZE
cfd2744e92 chore: add toolbox copy 2024-06-16 21:06:26 +04:30
MAZE
4c0f417469 feat: add persist mode to the modal 2024-06-16 19:32:40 +03:30
MAZE
9d1d8f8035 style: change notice 2024-06-16 18:51:23 +03:30
MAZE
8a79ccf018 style: change button style 2024-06-16 18:50:06 +03:30
MAZE
a3c384d105 style: add title to timer 2024-06-16 18:49:15 +03:30
MAZE
96ca376885 style: increase menu width 2024-06-16 18:44:35 +03:30
MAZE
18987cc339 style: add min width 2024-06-16 19:41:09 +04:30
MAZE
919831538f style: change item order 2024-06-16 19:28:29 +04:30
MAZE
edd15f4b9a fix: change shortcuts 2024-06-16 19:27:33 +04:30
MAZE
09c0a6ce93 fix: change icon path 2024-06-16 19:23:54 +04:30
MAZE
2bfb9b181c feat: implement countdown timer functionality 2024-06-16 19:19:22 +04:30
MAZE
c272914416 feat: add basic form 2024-06-16 19:00:38 +04:30
MAZE
d73b2bc1ff refactor: rename components 2024-06-16 18:47:57 +04:30
MAZE
c5657d0642 feat: add countdown timer structure 2024-06-16 18:40:13 +04:30
MAZE
c35409ce0a refactor: separate the migration 2024-06-16 18:09:51 +04:30
MAZE
7658842324 refactor: use the ID instead of index 2024-06-16 17:42:44 +04:30
MAZE
78222be011 feat: add ID to presets 2024-06-16 17:39:44 +04:30
MAZE
2c8135db43 refactor: add description for events 2024-06-15 13:36:10 +04:30
MAZE
fddf75cdca refactor: write JSDoc for libs 2024-06-15 13:32:00 +04:30
MAZE
0f50e6ae8b refactor: add JSDoc for custom hooks 2024-06-15 13:19:00 +04:30
MAZE
4ae0504937 refactor: add JSDoc for helper functions 2024-06-15 13:06:48 +04:30
MAZE
af075b32e6 style: add focus state 2024-06-15 12:58:24 +04:30
MAZE
82d8240b97 feat: add active indicator for sleep timer 2024-06-15 12:55:45 +04:30
MAZE
096251ec0a refactor: change stores structure 2024-06-15 12:44:46 +04:30
MAZE
2a86a88ed6 refactor: rename stores folder 2024-06-15 12:36:47 +04:30
MAZE
c60dcc74ed chore(release): 1.5.1 2024-06-14 20:53:41 +03:30
MAZE
aca746148e Merge branch 'develop' 2024-06-14 20:53:14 +03:30
MAZE
095e3c795e chore: add more sounds 2024-06-14 20:51:35 +03:30
MAZE
7e65bb75f9 chore: add washing machine sound 2024-06-14 20:36:41 +03:30
MAZE
0533460667 refactor: rename some functions 2024-06-14 19:08:00 +04:30
MAZE
9d633a9637 refactor: use nullish operator 2024-06-14 18:57:13 +04:30
MAZE
a9fe7f7b4f chore: update README file 2024-06-12 23:42:28 +03:30
MAZE
ffe260f4a0 refactor: migrate to Astro components 2024-05-20 13:14:42 +04:30
MAZE
78656bb61f chore(release): 1.5.0 2024-05-19 17:25:10 +03:30
MAZE
629f0a514e chore: update README file 2024-05-18 23:31:49 +03:30
MAZE
9338b1d30a fix: remove media session 2024-05-11 16:48:44 +03:30
MAZE
34d3f07581 feat: add media session (wip) 2024-05-11 16:44:22 +03:30
MAZE
cf4870b0d6 feat: add media session (wip) 2024-05-11 16:38:26 +03:30
MAZE
9f0a28d930 feat: add media session (wip) 2024-05-11 16:35:07 +03:30
MAZE
56b0e9bf1a feat: add media session (wip) 2024-05-11 16:31:32 +03:30
MAZE
4f752bb6d0 feat: add media session (wip) 2024-05-11 16:25:14 +03:30
MAZE
1547b0a436 feat: add media session (wip) 2024-05-11 16:20:48 +03:30
MAZE
9ad16306cf chore: remove extra sound 2024-05-11 16:49:55 +04:30
MAZE
4b73e45dd4 Merge branch 'main' of https://github.com/remvze/moodist into main 2024-05-11 16:46:43 +04:30
MAZE
05b298f51e Merge branch 'main' into develop 2024-05-11 16:45:58 +04:30
MAZE
8d01d74bd3 fix: remove media session 2024-05-11 16:45:13 +04:30
MAZE
f311ec114e feat: add media session (wip) 2024-05-11 16:26:25 +04:30
MAZE
df1b05f7ce feat: add media session (wip) 2024-05-11 16:20:26 +04:30
MAZE
ea0dfff9c1 feat: add media session (wip) 2024-05-11 15:57:20 +04:30
MAZE
fc1bd07b7d feat: add media session (wip) 2024-05-11 15:53:30 +04:30
MAZE
f79e941527 feat: add media session (wip) 2024-05-11 15:30:49 +04:30
MAZE
11a4514a0f feat: add media session (wip) 2024-05-11 15:20:41 +04:30
MAZE
e41f901041 Merge branch 'main' of https://github.com/remvze/moodist 2024-05-09 20:53:01 +03:30
MAZE
de49d37f08 chore: update README file 2024-05-09 20:52:32 +03:30
MAZE
5f066a4eff feat: add countdown timer button 2024-05-09 20:51:57 +03:30
MAZE
b925a2e04f Merge branch 'develop' into main 2024-05-03 16:00:36 +04:30
MAZE
c66cddc4c9 fix: turn off spell check 2024-05-03 15:59:19 +04:30
MAZE
7cb0f1c752 chore: update README file 2024-05-03 00:02:17 +03:30
MAZE
d09e598297 chore: add emojis 2024-05-01 16:28:32 +04:30
MAZE
5899d1bbbb chore: add contributing guide 2024-05-01 16:25:22 +04:30
MAZE
81678ea384 refactor: add constants 2024-05-01 15:50:07 +04:30
MAZE
d9246b692b feat: add lock while fading 2024-04-30 18:13:00 +03:30
MAZE
c893e2a6ad refactor: reduce dependency 2024-04-30 18:00:19 +03:30
MAZE
f025213ef2 fix: close all modals 2024-04-30 17:50:53 +03:30
MAZE
6ce766af47 feat: add basic fading effect 2024-04-30 17:47:49 +03:30
MAZE
7c57fb686b refactor: rewrite timer logic 2024-04-30 16:53:49 +03:30
MAZE
dc139e41e6 chore: update README file 2024-04-30 16:36:42 +03:30
MAZE
b990778142 chore: add contribution section to README file 2024-04-30 15:58:16 +03:30
MAZE
672988c36e chore: add support section 2024-04-30 15:51:10 +03:30
MAZE
06d0dfbe7e fix: typo in README file 2024-04-30 15:48:29 +03:30
MAZE
954a1b1ce2 chore: update README file 2024-04-30 15:47:54 +03:30
MAZE
383f898125 chore: update README file 2024-04-30 15:46:53 +03:30
MAZE
8d90344b26 chore: add npm commands to README file 2024-04-29 18:10:57 +03:30
MAZE
c614e3d4f5 chore: add features to README file 2024-04-29 18:01:54 +03:30
MAZE
781adcf17e chore: add emojis 2024-04-29 17:52:29 +03:30
MAZE
3e44516509 chore: add divider 2024-04-29 17:48:48 +03:30
MAZE
aeccf2dabd chore: complete tech stack 2024-04-29 17:47:30 +03:30
MAZE
8e6e690006 chore: add tech stack to README file 2024-04-29 17:41:10 +03:30
MAZE
75e7c48b21 Merge branch 'main' into develop 2024-04-29 15:50:26 +03:30
MAZE
dcef777295 chore: add licenses to README file 2024-04-29 15:48:53 +03:30
MAZE
cc77f9e9c0 fix: make inputs full width 2024-04-29 15:57:07 +04:30
MAZE
8fe90daf1e style: change input styles 2024-04-29 15:46:06 +04:30
MAZE
34d3c72f35 fix: change default values 2024-04-29 15:34:00 +04:30
MAZE
9d458fb60e feat: add form to sleep timer 2024-04-29 15:21:50 +04:30
MAZE
e674738ce7 style: change button styles 2024-04-29 15:06:09 +04:30
MAZE
77e2ec5e79 feat: add description for sleep timer 2024-04-29 00:43:35 +03:30
MAZE
4adfb3ddc9 refactor: relocate generic components 2024-04-29 00:38:15 +03:30
MAZE
ae0cbf1aa3 refactor: reorder menu items 2024-04-29 00:35:53 +03:30
MAZE ✧
dbbd68b73d Merge pull request #32 from SuperMeepBoy/add-sleep-timer
feat: add sleep timer
2024-04-29 00:32:09 +03:30
Jef Roelandt
2e375ad40a fix: play sounds when starting timer if not already playing 2024-04-28 20:40:08 +02:00
Jef Roelandt
58bf28bb24 fix: fix button disabled and reset to 0 2024-04-28 20:40:08 +02:00
Jef Roelandt
0517c31fc1 fix: take remvze comments into account 2024-04-28 18:47:24 +02:00
Jef Roelandt
71b62ed3dd feat: add sleep timer 2024-04-28 16:11:38 +02:00
MAZE
0300df3852 chore: add accessibility addon 2024-04-27 22:49:48 +03:30
MAZE
3f3bcdda21 chore: add autodocs for button 2024-04-27 22:47:23 +03:30
MAZE
f19d151f4a chore: add story for snackbar provider 2024-04-27 22:45:32 +03:30
MAZE
43f6245227 feat: add story for snackbar 2024-04-27 22:41:59 +03:30
MAZE
9b7d3c645b feat: add story for modal 2024-04-27 22:38:45 +03:30
MAZE
f8fb1ed61e chore: add link to story 2024-04-27 22:22:16 +03:30
MAZE
6fe9ce8915 chore: add link to issue 2024-04-27 22:21:07 +03:30
MAZE
603d318e68 chore: write story for button 2024-04-27 21:03:54 +03:30
MAZE
65ca7e1c94 chore: install Storybook 2024-04-27 20:07:39 +03:30
MAZE
583578b315 feat: close notepad on escape 2024-04-27 19:53:59 +03:30
MAZE
60f167c4d7 feat: add shortcuts list 2024-04-26 15:30:27 +03:30
MAZE
99f3a41598 feat: add keyboard shortcut for unselect button 2024-04-26 15:03:02 +03:30
MAZE
d3a2a12e1f feat: add keyboard shortcut for play button 2024-04-26 14:41:57 +03:30
MAZE
ebb35deaf9 style: add hover state to button 2024-04-26 14:24:35 +03:30
MAZE
9ad49d021a fix: make share hotkey conditional 2024-04-26 14:22:39 +03:30
MAZE
8307657628 fix: replace the animation on button 2024-04-26 12:40:04 +03:30
MAZE
3b0c22968e fix: remove auto focus on load 2024-04-25 23:48:27 +03:30
MAZE
e490a1da84 refactor: remove extra types 2024-04-25 21:21:21 +03:30
MAZE
7c6f068d15 fix: remove console log 2024-04-25 20:23:39 +03:30
MAZE
a46a4cdc96 Merge branch 'develop' 2024-04-25 20:00:22 +03:30
MAZE
b955fc93f4 fix: refocus on show more button 2024-04-25 19:59:41 +03:30
MAZE
54c777276d fix: focus on the first new sound 2024-04-25 19:48:09 +03:30
MAZE
136a009379 Merge branch 'develop' 2024-04-25 15:38:41 +03:30
MAZE
601ba6def7 fix: allow empty inputs 2024-04-25 15:35:07 +03:30
MAZE
89a83089c5 fix: reset values on cancel 2024-04-25 14:39:13 +03:30
MAZE
2192335238 refactor: better name 2024-04-24 19:50:44 +03:30
MAZE
af92b1ed90 feat: add close event for modals 2024-04-24 19:13:29 +03:30
MAZE
f81ea9e7bd refactor: better shortcut handling 2024-04-24 16:59:27 +03:30
MAZE
98e5021f56 feat: add better aria labels 2024-04-24 16:04:18 +03:30
MAZE
9774532308 feat: add better aria labels 2024-04-24 15:55:42 +03:30
MAZE
837826fbc1 feat: change shortcuts to shift 2024-04-24 13:29:28 +03:30
MAZE
2f84268017 refactor: rename hook file 2024-04-23 23:22:39 +03:30
MAZE
24a53c81df feat: add autofocus for note 2024-04-23 23:20:58 +03:30
MAZE ✧
ab9d47befb Merge pull request #26 from SuperMeepBoy/improve-accessibility-2
Allow using spacebar or enter to trigger buttons
2024-04-23 23:08:53 +03:30
Jef Roelandt
60cc2e9369 feat: allow using spacebar or enter to trigger buttons
It is a good practice for accessibility.
Cf https://webaim.org/techniques/keyboard/ or
any other resource on the Internet talking about buttons accessibiltiy.
2024-04-23 21:15:32 +02:00
MAZE
42f82ab95d feat: add shortcuts to items 2024-04-23 17:51:51 +03:30
MAZE
669df1f082 feat: add keyboard shortcuts 2024-04-23 17:24:32 +03:30
MAZE
a3cfbb98db style: add outlines to toolbar buttons 2024-04-23 17:08:15 +03:30
MAZE
3c8d75b018 style: better outlines for accessibility 2024-04-23 17:06:35 +03:30
MAZE
e7d7a37a12 style: add outline for better accessibility 2024-04-23 00:02:27 +03:30
MAZE
6f9c941a87 style: change outline color 2024-04-22 23:52:18 +03:30
MAZE
8596a0014c fix: relocate focus trap 2024-04-22 23:47:57 +03:30
MAZE
908fe01c5e Merge branch 'main' into develop 2024-04-22 23:44:09 +03:30
MAZE ✧
8009e1519f Merge pull request #24 from SuperMeepBoy/add-accessibility
Improve accessibility
2024-04-22 20:51:17 +03:30
MAZE
0252fa96ab feat: make the modal more accessible 2024-04-22 18:46:51 +03:30
MAZE
48291a6457 refactor: remove hide delay for tooltips 2024-04-22 18:40:25 +03:30
MAZE
ddae0b660f refactor: add Radix 2024-04-22 18:39:30 +03:30
Jef Roelandt
8669489747 Fix keyboard focus on Sound cards 2024-04-21 16:28:42 +02:00
Jef Roelandt
4f4ffe3e3a Add visibility on buttons focus 2024-04-21 16:28:36 +02:00
Jef Roelandt
42d3bd9e8c Make Dockerfile compatible with podman 2024-04-19 20:41:29 +02:00
MAZE
4b5456a51d chore(release): 1.4.3 2024-04-11 16:19:31 +03:30
MAZE
fa9711a1e0 chore: remove arm/v7 2024-04-11 16:19:04 +03:30
MAZE
73a8e03d66 chore(release): 1.4.2 2024-04-11 15:38:00 +03:30
MAZE
017c27fb2b chore: remove arm/v6 2024-04-11 15:37:39 +03:30
MAZE
43ba975408 style: change font path 2024-04-11 15:37:11 +03:30
MAZE
42bd47bbea chore(release): 1.4.1 2024-04-11 15:14:42 +03:30
MAZE
faf7f78b8c chore: change GitHub workflow 2024-04-11 15:13:49 +03:30
MAZE
7ec7ea74d5 style: widen the container 2024-04-11 15:12:56 +03:30
MAZE
ede480186c feat: add toolbar and portal 2024-04-08 20:55:03 +03:30
MAZE
6dfa998ffe chore(release): 1.4.0 2024-02-29 15:55:04 +03:30
MAZE
a8a8c36434 fix: comment out toolbox section 2024-02-29 15:53:38 +03:30
MAZE
7390a9b3de fix: remove extra headings 2024-02-29 15:52:48 +03:30
MAZE
0eb47ba2e1 feat: add alarm for pomodoro timer 2024-02-29 15:19:57 +03:30
MAZE
110356b2da fix: remove time from tabs array 2024-02-29 15:06:37 +03:30
MAZE
158cffca8c fix: change default times 2024-02-29 15:05:54 +03:30
MAZE
def69de6e4 style: add scroll lock in modals 2024-02-28 23:03:35 +03:30
MAZE
69cb45bff7 style: decrease font size 2024-02-28 22:56:08 +03:30
MAZE
e7fd84bd4e style: change position for toolbar 2024-02-28 22:54:54 +03:30
MAZE
dfd6c1fc4a fix: add min-width to inputs 2024-02-28 20:27:45 +03:30
MAZE
38a9a23790 feat: persist presets 2024-02-28 20:19:36 +03:30
MAZE
2484e01273 feat: add custom presets 2024-02-28 19:59:39 +03:30
MAZE
98d2f76438 style: decrease padding 2024-02-27 20:40:54 +03:30
MAZE
0e12a5203e feat: add CTA button 2024-02-27 20:27:15 +03:30
MAZE
3205145d54 feat: add copy for productivity toolbox 2024-02-27 20:15:51 +03:30
MAZE
8f36c863d7 style: remove hero pattern 2024-02-27 20:14:30 +03:30
MAZE
941e1f0241 feat: change tooltip content 2024-02-25 21:51:31 +03:30
MAZE
240fd9c6e0 feat: add active indicators 2024-02-25 21:42:40 +03:30
MAZE
665e2173f4 feat: persist pomodoro setting 2024-02-25 21:29:52 +03:30
MAZE
1ac52861d1 fix: change completion condition 2024-02-25 21:22:35 +03:30
MAZE
a7e5368591 fix: change initial value 2024-02-25 17:21:18 +03:30
MAZE
f3cb2a1b63 feat: implement time setting 2024-02-25 17:19:06 +03:30
MAZE
586e502c3c style: change unselected style 2024-02-25 15:12:26 +03:30
MAZE
5b83710c75 style: increase pattern opacity 2024-02-25 15:08:56 +03:30
MAZE
7ed016d855 feat: add controls to pomodoro 2024-02-25 15:04:25 +03:30
MAZE
9f7de336e5 feat: add basic pomodoro structure 2024-02-25 13:47:38 +03:30
MAZE
758f2f48dc feat: add scroll for lower heights 2024-02-24 20:22:36 +03:30
MAZE
d055e66dd9 feat: add source code item 2024-02-24 19:54:41 +03:30
MAZE
79afb8d92f fix: change z-index values 2024-02-24 19:35:10 +03:30
MAZE
408734d49f feat: add dividers to menu items 2024-02-24 19:33:13 +03:30
MAZE
7463334053 feat: add toolbar to notepad 2024-02-24 19:23:17 +03:30
MAZE
ae3ea8c74f fix: remove word counter dependency 2024-02-24 16:33:41 +03:30
MAZE
24245235b1 feat: add counter to notepad 2024-02-24 16:25:34 +03:30
MAZE
b143e46e92 Merge branch 'main' into develop 2024-02-24 16:13:33 +03:30
MAZE
e923559709 feat: add simple notepad 2024-02-24 16:06:53 +03:30
MAZE
8930e7b76a style: change description 2024-02-17 18:37:25 +03:30
MAZE
5f40435c0c feat: add titles 2024-02-16 16:46:47 +03:30
MAZE
38c11f124e fix: add key to categories 2024-02-11 19:52:10 +03:30
MAZE
a5d2ba45f8 Merge branch 'main' into develop 2024-02-11 19:34:03 +03:30
MAZE
653d309e64 fix: remove fading 2024-02-11 19:33:56 +03:30
MAZE
663cb92135 feat: add fade in/out 2024-02-11 19:25:25 +03:30
MAZE
1a499be244 style: add effect to about 2024-02-09 20:56:33 +03:30
MAZE
4515aa8e7a style: change the about style 2024-02-09 20:42:42 +03:30
MAZE
831a9c8ea0 refactor: add variant to container 2024-02-09 18:29:00 +03:30
MAZE
f66a6ffde7 fix: make sound count dynamic 2024-02-09 17:29:05 +03:30
MAZE
9028675057 style: hide features 2024-02-09 17:26:45 +03:30
MAZE
37505a6b3f style: show about and features 2024-02-09 15:20:14 +03:30
MAZE
400ea0aeaf style: hide about and features 2024-02-09 14:45:15 +03:30
MAZE
e4e332ad75 feat: add features section 2024-02-09 14:35:49 +03:30
MAZE
341a896924 style: revert changes 2024-02-09 11:54:09 +03:30
MAZE
1a6ecd82ab style: decorate paragraphs 2024-02-09 00:44:28 +03:30
MAZE
d725d59703 feat: add about section 2024-02-08 22:44:22 +03:30
MAZE
52176bc3f9 refactor: move footer to React 2024-02-08 19:49:35 +03:30
MAZE
c505c574a8 refactor: move donation to React 2024-02-08 19:47:31 +03:30
MAZE
3f45be3942 refactor: remove sections 2024-02-08 19:44:30 +03:30
MAZE
a514a364ec feat: add special button 2024-02-08 19:43:50 +03:30
MAZE
81e6666776 fix: add correct count to description 2024-02-08 19:35:44 +03:30
MAZE
56802b67f2 style: decrease opacity 2024-02-08 19:31:20 +03:30
MAZE
d4cc24e468 style: lower opacity 2024-02-08 19:23:29 +03:30
MAZE
f7302dec5b feat: add open-source section 2024-02-08 19:17:14 +03:30
MAZE
1a01a00866 feat: change alignments 2024-02-08 18:59:58 +03:30
MAZE
38da02a0d3 feat: change the copy for features 2024-02-08 18:32:08 +03:30
MAZE
5fc3e7e5d0 style: change the pattern slightly 2024-02-08 18:15:47 +03:30
MAZE
0f32de3c0c style: decrease shine 2024-02-07 21:51:17 +03:30
MAZE
ac24da2940 style: add shine to donation button 2024-02-07 21:46:26 +03:30
MAZE
5916e86d3c style: revert pattern 2024-02-07 21:38:28 +03:30
MAZE
f3e7224267 style: change pattern 2024-02-07 21:31:35 +03:30
MAZE
e1b9a1736c style: change sound counter 2024-02-07 18:50:57 +03:30
MAZE
2078648c66 style: decrease opacity 2024-02-07 18:42:34 +03:30
MAZE
6d30a0123e style: add margin to donate section 2024-02-07 16:23:46 +03:30
MAZE
8471a3ca49 style: change dividers 2024-02-07 16:22:17 +03:30
MAZE
182a8c7aad style: decrease dots 2024-02-07 15:56:15 +03:30
MAZE
0ad4bb72e1 style: decrease dots 2024-02-07 15:37:07 +03:30
MAZE
405fcccd95 style: increase dots 2024-02-07 15:30:28 +03:30
MAZE
2b843747b4 style: decrease dots 2024-02-07 15:25:02 +03:30
MAZE
8e500136ce style: increase padding 2024-02-07 15:16:25 +03:30
MAZE
882d44079c style: increase opacity 2024-02-07 15:10:59 +03:30
MAZE
82e4ea72f4 style: decrease opacity 2024-02-07 15:10:20 +03:30
MAZE
dc22b51548 style: add polka dot pattern 2024-02-07 15:08:08 +03:30
MAZE
75ff67c9e6 chore(release): 1.3.1 2024-02-01 23:40:29 +03:30
MAZE
1f806c4e56 chore: add donation link to README file 2024-02-01 23:39:59 +03:30
MAZE
e6f768a5e6 fix: complete donation links 2024-02-01 23:38:55 +03:30
MAZE
8e0291004a fix: coffee typo 2024-02-01 23:27:06 +03:30
MAZE
d449c29321 feat: add donate section 2024-02-01 22:23:49 +03:30
MAZE
f12ca4806c feat: add donate item 2024-02-01 22:05:42 +03:30
MAZE
17b4f25ff1 feat: add donation header 2024-02-01 21:59:08 +03:30
MAZE
f877e49763 chore(release): 1.3.0 2024-02-01 20:36:46 +03:30
MAZE
f1d212abc8 chore: add binaural beats 2024-02-01 20:16:47 +03:30
MAZE
38f6f7dbe6 chore: add more sounds 2024-01-30 15:29:55 +03:30
MAZE
937bf29d09 chore: add more sounds 2024-01-30 00:04:59 +03:30
MAZE
e2172fd2bb chore: add more sounds 2024-01-29 23:49:07 +03:30
MAZE
1f12afa394 chore: add more sounds 2024-01-29 23:36:44 +03:30
MAZE
d96461d1ea fix: remove fading 2024-01-29 19:16:46 +03:30
MAZE
5467bbbc24 feat: add fading to intro and outro 2024-01-29 19:01:36 +03:30
MAZE
32da26ccfc fix: undo changes 2024-01-28 19:39:57 +03:30
MAZE
81f33d9d37 fix: add media session 2024-01-28 19:33:52 +03:30
MAZE
463667c868 fix: connect audio context to audio element 2024-01-28 19:28:55 +03:30
MAZE
b77c817db2 refactor: remove unmute and media session 2024-01-28 15:45:27 +03:30
MAZE
216b913ccd fix: add media session 2024-01-28 15:40:51 +03:30
MAZE
e422b52436 fix: add unmute for iOS 2024-01-28 15:35:09 +03:30
MAZE
1f635348e3 refactor: remove media session 2024-01-28 15:23:58 +03:30
MAZE
889962babe fix: add audio element 2024-01-28 15:15:30 +03:30
MAZE
5e0a84259f feat: add media session 2024-01-28 15:05:13 +03:30
MAZE
8e4d0531e0 fix: resume audio 2024-01-28 14:44:31 +03:30
MAZE
cd05704a73 chore: add more sounds 2024-01-22 19:58:06 +03:30
MAZE
01b4bdbb57 chore: add more sounds 2024-01-22 18:31:23 +03:30
MAZE
f682a910da feat: add loader for favorites 2024-01-09 16:09:07 +03:30
MAZE
a33ae450cf fix: increase decimal 2024-01-09 15:59:57 +03:30
MAZE
b8bc9c8b4c chore(release): 1.2.0 2024-01-04 20:19:35 +03:30
MAZE
ee606139a8 chore: update GitHub action 2024-01-04 20:18:45 +03:30
MAZE
7823dc7ff4 style: add animation to modal 2024-01-04 19:58:16 +03:30
MAZE
37a0736a0e style: widen the menu 2024-01-04 19:54:38 +03:30
MAZE
c51acd6261 style: change copy 2024-01-04 19:54:06 +03:30
MAZE
ff26597d22 feat: add disabled state 2024-01-04 19:51:58 +03:30
MAZE
c8e51226e5 style: change to primary color 2024-01-03 20:03:32 +03:30
MAZE
131ab29621 style: add icon to menu items 2024-01-03 20:01:58 +03:30
MAZE
0f62f0795c feat: implement override feature 2024-01-03 18:42:06 +03:30
MAZE
1a23e004a6 fix: stringify dependency 2024-01-03 14:14:01 +03:30
MAZE
93ff72a052 feat: implement sharing URL 2024-01-03 00:03:58 +03:30
MAZE
ef81f198ba feat: basic structure for share link 2024-01-02 22:20:59 +03:30
MAZE
35e32152b1 feat: add share modal 2024-01-02 19:48:57 +03:30
MAZE
26bf01690c refactor: better item structure for menu 2024-01-02 18:35:06 +03:30
MAZE
fe2357c995 feat: add share placeholder 2024-01-02 17:35:10 +03:30
MAZE
85b627ecb9 style: change border color 2024-01-02 16:58:41 +03:30
MAZE
8beb42cb1b refactor: rewrite menu with floating ui 2024-01-02 16:54:29 +03:30
MAZE
17027e299b feat: add animation to menu box 2024-01-02 16:28:18 +03:30
MAZE
184bb09f5a feat: add menu button 2024-01-02 16:24:55 +03:30
MAZE
660ee07a23 chore: change docker-compose file 2024-01-01 12:42:56 +03:30
MAZE
cb4bfea5ab chore: change docker workflow 2024-01-01 12:39:22 +03:30
MAZE ✧
210bd234e0 Merge pull request #3 from baldator/main
Add github action to build docker image and docker-compose support
2024-01-01 12:32:17 +03:30
marco
64ef5c5138 . 2023-12-31 13:43:27 +00:00
MAZE ✧
1218751a6f Merge pull request #2 from javigomezo/main
feat(docker): add dockerfile
2023-12-31 12:57:16 +03:30
Javier Gómez
a234bc17a6 feat(docker): add dockerfile 2023-12-30 23:07:10 +01:00
281 changed files with 19962 additions and 2092 deletions

View File

@@ -1,15 +1,12 @@
{
"root": true,
"env": {
"browser": true,
"amd": true,
"node": true,
"es2022": true
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module",
@@ -17,7 +14,6 @@
"jsx": true
}
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
@@ -28,9 +24,9 @@
"plugin:jsx-a11y/recommended",
"plugin:react-hooks/recommended",
"plugin:astro/recommended",
"prettier"
"prettier",
"plugin:storybook/recommended"
],
"plugins": [
"@typescript-eslint",
"typescript-sort-keys",
@@ -38,13 +34,15 @@
"sort-destructure-keys",
"prettier"
],
"rules": {
"@typescript-eslint/ban-ts-comment": "off",
"prettier/prettier": "error",
"sort-keys-fix/sort-keys-fix": ["warn", "asc"],
"sort-destructure-keys/sort-destructure-keys": "warn",
"jsx-a11y/no-static-element-interactions": "off",
"jsx-a11y/media-has-caption": "off",
"jsx-a11y/no-noninteractive-tabindex": "off",
"jsx-a11y/label-has-associated-control": "off",
"react/jsx-sort-props": [
"warn",
{
@@ -53,48 +51,39 @@
}
]
},
"settings": {
"react": {
"version": "detect"
},
"import/parsers": {
"@typescript-eslint/parser": [".ts", ".tsx", ".js", ".jsx"]
},
"import/resolver": {
"typescript": true,
"node": true,
"alias": {
"extensions": [".js", ".jsx", ".ts", ".tsx", ".d.ts"],
"map": [["@", "./src"]]
}
}
},
"overrides": [
{
"files": ["**/*.astro"],
"parser": "astro-eslint-parser",
"parserOptions": {
"parser": "@typescript-eslint/parser",
"extraFileExtensions": [".astro"]
},
"rules": {
"prettier/prettier": "error",
"react/no-unknown-property": "off",
"react/jsx-key": "off"
},
"globals": {
"Astro": "readonly"
}
},
{
"files": ["**/*.astro/*.js"],
"rules": {

40
.github/workflows/build_docker.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Build and push main image
on:
push:
tags:
- '*'
jobs:
push-store-image:
runs-on: ubuntu-latest
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@main
- name: 'Login to GitHub Container Registry'
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{github.actor}}
password: ${{secrets.ACCESS_TOKEN}}
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: 'Build and push Inventory Image'
run: |
IMAGE_NAME="ghcr.io/remvze/moodist"
GIT_TAG=${{ github.ref }}
GIT_TAG=${GIT_TAG#refs/tags/}
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t $IMAGE_NAME:latest \
-t $IMAGE_NAME:$GIT_TAG \
--push .

2
.gitignore vendored
View File

@@ -19,3 +19,5 @@ pnpm-debug.log*
# macOS-specific files
.DS_Store
*storybook.log

46
.storybook/main.ts Normal file
View File

@@ -0,0 +1,46 @@
import path from 'node:path';
import type { StorybookConfig } from '@storybook/react-vite';
const config: StorybookConfig = {
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
addons: [
'@storybook/addon-onboarding',
'@storybook/addon-links',
'@storybook/addon-essentials',
'@chromatic-com/storybook',
'@storybook/addon-interactions',
'@storybook/addon-a11y',
],
framework: {
name: '@storybook/react-vite',
options: {},
},
docs: {
autodocs: 'tag',
},
viteFinal(config) {
return {
...config,
define: {
'process.env.NODE_DEBUG': false, // https://github.com/storybookjs/storybook/issues/18920
},
resolve: {
alias: [
{
find: '@',
replacement: path.resolve(__dirname, '../src'),
},
],
},
}
}
};
export default config;

16
.storybook/preview.ts Normal file
View File

@@ -0,0 +1,16 @@
import '../src/styles/global.css';
import type { Preview } from '@storybook/react';
const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
};
export default preview;

View File

@@ -8,7 +8,8 @@
"rules": {
"import-notation": "string",
"selector-class-pattern": null
"selector-class-pattern": null,
"no-descending-specificity": null
},
"overrides": [

View File

@@ -2,207 +2,540 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [1.1.0](https://github.com/remvze/moodist/compare/v1.0.0...v1.1.0) (2023-12-29)
### [1.5.1](https://github.com/remvze/moodist/compare/v1.5.0...v1.5.1) (2024-06-14)
### ♻️ Code Refactoring
* change ordering config ([a43c679](https://github.com/remvze/moodist/commit/a43c679e214b24c7f547e182aea6e2fbf826228f))
### 🐛 Bug Fixes
* change icon path ([28c3c40](https://github.com/remvze/moodist/commit/28c3c404ad790869b13731e4c3622abe33f1dda2))
* migrate to Astro components ([ffe260f](https://github.com/remvze/moodist/commit/ffe260f4a02238cb83cf92ed06c4f9c75ba189a4))
* rename some functions ([0533460](https://github.com/remvze/moodist/commit/05334606673a6268ca35083ea31e28cdb11f1b86))
* use nullish operator ([9d633a9](https://github.com/remvze/moodist/commit/9d633a963772c3444b6e9effc7920fe190b0614d))
### 🚚 Chores
* add more sounds ([e3864be](https://github.com/remvze/moodist/commit/e3864bede129c102ef5b7258b4688d9177dd284c))
* add more sounds ([55e7f05](https://github.com/remvze/moodist/commit/55e7f05892f6d3200b56a7e06b371bed4b4c4554))
* add more sounds ([318e87c](https://github.com/remvze/moodist/commit/318e87c9f1f3e2509c2b8eeb3a7f6875dd1c02fd))
* add places category ([5970012](https://github.com/remvze/moodist/commit/5970012fa6cbd8222c2be8ce426065f928d81b2b))
* add transport category ([c1c3945](https://github.com/remvze/moodist/commit/c1c3945d43e84e3011de52bffa5116d58283c473))
* change heartbeat audio ([f43a378](https://github.com/remvze/moodist/commit/f43a378697437f671c0c33122b1c9ec5a1e173ff))
* relocate underwater audio ([37bad81](https://github.com/remvze/moodist/commit/37bad8149e1f5170426dc745322c0e65cb9a41ff))
* remove heartbeat audio ([121a8f2](https://github.com/remvze/moodist/commit/121a8f204c6b61490a7ab0e732779031278e6e8c))
* add more sounds ([095e3c7](https://github.com/remvze/moodist/commit/095e3c795ef699e9e99c5eb364badaadce8a884b))
* add washing machine sound ([7e65bb7](https://github.com/remvze/moodist/commit/7e65bb75f9871603c30ecfc578ad109a969a2a58))
* update README file ([a9fe7f7](https://github.com/remvze/moodist/commit/a9fe7f7b4f9ca91704d76a314e3c3368fbc4f1cf))
## [1.5.0](https://github.com/remvze/moodist/compare/v1.4.3...v1.5.0) (2024-05-19)
### 💄 Styling
* add hover states ([2c74dd0](https://github.com/remvze/moodist/commit/2c74dd0d604af86f99edcba2eb573641ac2010fd))
* change button style ([8efb1ce](https://github.com/remvze/moodist/commit/8efb1cee00ec0e0dcd9677729d9136ca8d69073f))
* change sound counter ([00fc5f3](https://github.com/remvze/moodist/commit/00fc5f3a872be51eb875744e254c75ea58e93281))
* change theme ([bd517f8](https://github.com/remvze/moodist/commit/bd517f88c01202eb7e7e5acf70bf4af2e6f91d75))
* add hover state to button ([ebb35de](https://github.com/remvze/moodist/commit/ebb35deaf982348ccea49e3830af77521fbed207))
* add outline for better accessibility ([e7d7a37](https://github.com/remvze/moodist/commit/e7d7a37a12dd79f12933b3ffa91fe6e0557c4f9e))
* add outlines to toolbar buttons ([a3cfbb9](https://github.com/remvze/moodist/commit/a3cfbb98db8a70d8055e86071a4dab4d2b7ab952))
* better outlines for accessibility ([3c8d75b](https://github.com/remvze/moodist/commit/3c8d75b018e657b2c2e13d967b90b635360225fe))
* change button styles ([e674738](https://github.com/remvze/moodist/commit/e674738ce70d1c240c57433824a0b509f24deb88))
* change input styles ([8fe90da](https://github.com/remvze/moodist/commit/8fe90daf1e96def534c62f3241438cf62ea00b18))
* change outline color ([6f9c941](https://github.com/remvze/moodist/commit/6f9c941a8749f2b006c3f352e0a047c5dc1d3d21))
## [1.0.0](https://github.com/remvze/moodist/compare/v0.0.1...v1.0.0) (2023-12-09)
### ♻️ Code Refactoring
* add constants ([81678ea](https://github.com/remvze/moodist/commit/81678ea384bfdc00925e674c988fad85710d705a))
* add Radix ([ddae0b6](https://github.com/remvze/moodist/commit/ddae0b660ff2bb0bc33400ad59159f4525d80429))
* better name ([2192335](https://github.com/remvze/moodist/commit/219233523827ed47a8ebea88a4ce73bb3c027e0c))
* better shortcut handling ([f81ea9e](https://github.com/remvze/moodist/commit/f81ea9e7bdf7c7253587da9312e6fb6caaf14590))
* reduce dependency ([c893e2a](https://github.com/remvze/moodist/commit/c893e2a6adc68bdd40f8e5dd1e2b3ab6642a0145))
* relocate generic components ([4adfb3d](https://github.com/remvze/moodist/commit/4adfb3ddc938a2720c26b9107c8cccdf66c0b913))
* remove extra types ([e490a1d](https://github.com/remvze/moodist/commit/e490a1da84d948c9db2e689414f432aaf53bc0b2))
* remove hide delay for tooltips ([48291a6](https://github.com/remvze/moodist/commit/48291a645776b235918485b737b9272113f838a0))
* rename hook file ([2f84268](https://github.com/remvze/moodist/commit/2f84268017aa4592684c8e3ac47399d0f100669d))
* reorder menu items ([ae0cbf1](https://github.com/remvze/moodist/commit/ae0cbf1aa3392ae775bfee9404c21ed7c145166e))
* rewrite timer logic ([7c57fb6](https://github.com/remvze/moodist/commit/7c57fb686b50fa106ad0663a44f4831295d235c3))
### ✨ Features
* add about section ([4e84419](https://github.com/remvze/moodist/commit/4e84419ab19f4f0c129a76a91be194bbab7f6b11))
* add aria-disabled to play button ([f390f38](https://github.com/remvze/moodist/commit/f390f3801604c49799078298637ea63a06eb9721))
* add auto pause to play button ([7c901b2](https://github.com/remvze/moodist/commit/7c901b2bdc525d02b80a0c42eb2f81f766947ca3))
* add auto play on select ([17d1b23](https://github.com/remvze/moodist/commit/17d1b23c8f1a6c717d846c12d38945e7d3b47be1))
* add basic animations with Framer Motion ([fa7b90e](https://github.com/remvze/moodist/commit/fa7b90eeec5b697446fa5871f8b499a85d0d150f))
* add basic audio player ([5a7a58e](https://github.com/remvze/moodist/commit/5a7a58e883fbb0122d8d6e2c777049a8fc0d9609))
* add basic categories ([8d7e4d2](https://github.com/remvze/moodist/commit/8d7e4d26fd7b53a16f7ce39551b31484eefbe461))
* add basic sound components ([4adb8bf](https://github.com/remvze/moodist/commit/4adb8bfdbc86a475d59e1d636927539592ec4b6c))
* add basic sounds for prototyping ([5791346](https://github.com/remvze/moodist/commit/5791346a881a9f451b967f782257317d8fb04d63))
* add color noise ([7363e8d](https://github.com/remvze/moodist/commit/7363e8d51a347adf3c53cbef9ec3e181912ecc6b))
* add deep merge to Zustand Persist ([01f4031](https://github.com/remvze/moodist/commit/01f40318124ad1e6e09b1f0572f623900192ba9d))
* add footer component ([262bb1a](https://github.com/remvze/moodist/commit/262bb1a9c6153a53e259e5bd9123b8035bd6b6d1))
* add gradient line decoration ([5559152](https://github.com/remvze/moodist/commit/5559152a8492dac335f0e6620ca4ca2d9233c889))
* add help text ([c3521a7](https://github.com/remvze/moodist/commit/c3521a798611aa0ad7297493aa5a790a27bbc991))
* add hero section ([dc33c2c](https://github.com/remvze/moodist/commit/dc33c2cf9cdcb251b7a0cc4dabdd7aafae154aa9))
* add hidden selection indicator ([e2cd75a](https://github.com/remvze/moodist/commit/e2cd75a332fab318a529f4f6e04ecf1867be7fd1))
* add Howler for sounds ([735d9eb](https://github.com/remvze/moodist/commit/735d9ebebfa36dd3e7596e70a0549b24b7b9fc4d))
* add icon for sounds ([1994004](https://github.com/remvze/moodist/commit/199400446cc241fb66722c79e74f882a7ef6a26c))
* add link to reasons ([e2b6eaf](https://github.com/remvze/moodist/commit/e2b6eaf8f3278768ce142ed58594958dcc7821ad))
* add loading state for sounds ([aaccbee](https://github.com/remvze/moodist/commit/aaccbee3d7dd1d4469ee26cea14df7132e8e9e0d))
* add local storage support ([856b3e6](https://github.com/remvze/moodist/commit/856b3e668ed6f24c8aefe532ac673af5e99141d1))
* add more and less button for sounds ([13cd72a](https://github.com/remvze/moodist/commit/13cd72a0655d90f0a6b7658b3357d1e8902f8fb7))
* add more sounds ([0888aaa](https://github.com/remvze/moodist/commit/0888aaa0f09ed549afdb21166ad6d2f048604275))
* add more sounds ([63ed396](https://github.com/remvze/moodist/commit/63ed396a5a74ed2b6e25882a72511ee93935fe04))
* add new sounds ([759e6b0](https://github.com/remvze/moodist/commit/759e6b0ce8f0acc3eb0eed508f7c587804097748))
* add play button ([31c087e](https://github.com/remvze/moodist/commit/31c087ebc8e66220d488226029dcc1435667ce04))
* add ready section ([e372d2f](https://github.com/remvze/moodist/commit/e372d2f398dbdcfad1069b50911ba840f0c9a1fe))
* add scroll to top component ([3c1c27b](https://github.com/remvze/moodist/commit/3c1c27b2fd378eb0f7351a3f511375cbc62f2a7b))
* add simple tooltip ([f2efe3c](https://github.com/remvze/moodist/commit/f2efe3c490ab5429824d10e97979694a4de11dd4))
* add singing bowl sound ([0b49f66](https://github.com/remvze/moodist/commit/0b49f66e5879642da10054046700a160411448a3))
* add sound count to hero ([42ccc7a](https://github.com/remvze/moodist/commit/42ccc7ada780fd5db5c038fa9210ec0e3e75be6e))
* add tooltip to scroll button ([d4401fa](https://github.com/remvze/moodist/commit/d4401faaffcb4351be1a152b89f94c9db63ca213))
* add why section ([3ed610b](https://github.com/remvze/moodist/commit/3ed610bb468293f6b08c2b2444bc47cd570383eb))
* change sound count from round to exact ([8c49453](https://github.com/remvze/moodist/commit/8c49453011d127669774f46720ce6e98ca01aa13))
* complete meta tags ([1cfbf0d](https://github.com/remvze/moodist/commit/1cfbf0dd092d35d2f098c29baf6d6adbc1107cc0))
* create reusable tooltip ([c637e2d](https://github.com/remvze/moodist/commit/c637e2d63109e12886b6f688c643146707967c7a))
* implement basic snackbar ([8090599](https://github.com/remvze/moodist/commit/8090599f2bc9ce58cdb36a6a04555afdb7af2bb2))
* implement basic Zustand store ([22bb65d](https://github.com/remvze/moodist/commit/22bb65de0d4ea9f485e4923b9c8715233df3114e))
* implement favorite sounds functionality ([cb34b59](https://github.com/remvze/moodist/commit/cb34b59d864fb80b930c0c9e1c1269bb7e9c2b18))
* implement shuffle functionality ([26ba017](https://github.com/remvze/moodist/commit/26ba017815d7338f49d2017eda75f86f493bf050))
* implement shuffling functionality ([3ac211e](https://github.com/remvze/moodist/commit/3ac211e3554d26c48fb8e0a588a67f1a4901e9b9))
* implement unselect all functionality ([8966d59](https://github.com/remvze/moodist/commit/8966d59d758496cc94247364833788dcc555ce8b))
* reorder sounds in favorites ([dc9da85](https://github.com/remvze/moodist/commit/dc9da85e6825b3cb70e2e6ad4f35c0db3aeb26c2))
### 💄 Styling
* add animation to more/less button ([b849b3a](https://github.com/remvze/moodist/commit/b849b3aecd6178114b3b27a2daa014b0795ddf42))
* add base and global styles ([05d68e4](https://github.com/remvze/moodist/commit/05d68e4de6f55ebbc08817ed553f7760f570208b))
* add gradient background ([77fed03](https://github.com/remvze/moodist/commit/77fed0308ad55ca32f07b4f30e7a7936063d842a))
* add gradient line ([ea722ea](https://github.com/remvze/moodist/commit/ea722eabd24cb966c65fa45d41f55e1e1a049939))
* add line to titles ([ec1def0](https://github.com/remvze/moodist/commit/ec1def041934d8a9f98084299a0606c5690ef23d))
* add more icons ([41c5ae5](https://github.com/remvze/moodist/commit/41c5ae5db8e72f15f5cc1b7501f397239ba9368a))
* add new font weight for links ([287d7b3](https://github.com/remvze/moodist/commit/287d7b33fb107e81034a17a60e1cd6cd5d40d935))
* add smooth transition ([3b33e09](https://github.com/remvze/moodist/commit/3b33e095479340496a7a11b057daef029f40b70a))
* add smooth transition ([e7fc951](https://github.com/remvze/moodist/commit/e7fc9513109ae48ce407745549085c9449cf3324))
* add text animation ([7810d21](https://github.com/remvze/moodist/commit/7810d212259cfe19befafab33d51110126089a83))
* add theme color ([6de1394](https://github.com/remvze/moodist/commit/6de1394628ccb6b58aec02bcd164e56e9ca0f30a))
* add wrap balancer to desc ([276639b](https://github.com/remvze/moodist/commit/276639b0d3a70ead87dc61e2c8cb7cd621261c3e))
* better line alignment ([1f24812](https://github.com/remvze/moodist/commit/1f24812efa3b64fdbfc794bcb546226cc2ef07d4))
* change border to shadow ([a53800c](https://github.com/remvze/moodist/commit/a53800c6b194e7520d2e7ee13c5e00f77db9f5f7))
* change button animation ([6983559](https://github.com/remvze/moodist/commit/6983559032d731ad6264ad56f0786b1a84f7cf4e))
* change button animation ([c44a863](https://github.com/remvze/moodist/commit/c44a86361ebf3a77d68148564a2983e60b522c29))
* change copy ([6242308](https://github.com/remvze/moodist/commit/624230843c3328fdfb42e0e2f23084cef4dec614))
* change favicon ([a82dc3f](https://github.com/remvze/moodist/commit/a82dc3f36af098071b6be09491e9e25bda190b74))
* change icon backgrounds ([ef825ca](https://github.com/remvze/moodist/commit/ef825cae68f3cd4ef58016212a45820d3b272f96))
* change icon color on selection ([e6abca6](https://github.com/remvze/moodist/commit/e6abca61fe9eb36ca6968339a4cb67beeb5f8fdc))
* change label cursor ([15953ef](https://github.com/remvze/moodist/commit/15953ef8565a27da2b41330753fbc40931987aa7))
* change like color ([d8c9806](https://github.com/remvze/moodist/commit/d8c9806a1964042b787baabf43e2852bab23dcfa))
* change logo ([9f702db](https://github.com/remvze/moodist/commit/9f702dbfa74b524b4553bd1686532bc7d35d9985))
* change primary color ([ed9a027](https://github.com/remvze/moodist/commit/ed9a0271f7c49b499ab07487072cfd7bab5277db))
* change reason copy ([69c4ec1](https://github.com/remvze/moodist/commit/69c4ec150849a15e2aa222ac4b6f2982cc9536df))
* change spacing ([cc26f68](https://github.com/remvze/moodist/commit/cc26f68097bd137bea1f62a9eba566844b1cb069))
* change tagline ([f3603e8](https://github.com/remvze/moodist/commit/f3603e84318a9b69145ae69d3aa02447ed1235e6))
* decrease gradient shine ([8f58794](https://github.com/remvze/moodist/commit/8f587944fd1ad5e11bb6bc3afc7e9380afa43a6c))
* decrease margin ([d700195](https://github.com/remvze/moodist/commit/d7001952f9ce323d746118583e0b34e001a8a517))
* decrease scale animation ([7e668e5](https://github.com/remvze/moodist/commit/7e668e5b393c7df71bec8bf11696acbae22d70e4))
* fix margins ([99775b7](https://github.com/remvze/moodist/commit/99775b7c6487b009bbf87fbd834ed8730508d1ce))
* fix snackbar pointer ([14c9e88](https://github.com/remvze/moodist/commit/14c9e88bfbef4b68dce0a1a8e570c1a9d9894dfd))
* fix tooltip z-index ([fb061c3](https://github.com/remvze/moodist/commit/fb061c3d66d3fa7c3fce63bae1e04e502fcbb891))
* fix z-index ([fa71709](https://github.com/remvze/moodist/commit/fa71709f897cc2b7a5ba03dbc1cb60a3198bf9f4))
* increase padding ([eedbf53](https://github.com/remvze/moodist/commit/eedbf53e0e07ba75161e9f397dc0554204bc004a))
* increase sounds per row ([cd8ec5e](https://github.com/remvze/moodist/commit/cd8ec5e8649f8808d0a89a74c1426b92628efbc7))
* relocate the play button ([403a755](https://github.com/remvze/moodist/commit/403a755ca7a9d93ef6940d1954fcde058505c1b8))
* remove extra colors ([38f05a3](https://github.com/remvze/moodist/commit/38f05a3e757ab0c8d91b1f84938bfb8443450769))
* remove gradient line ([de03cac](https://github.com/remvze/moodist/commit/de03cac6b374e836da65d00b7fe732bf17600554))
* remove gradient line ([6720e86](https://github.com/remvze/moodist/commit/6720e86a0af14c8c05d73f305ee12664f3b264b7))
* remove layout animation ([ef952d0](https://github.com/remvze/moodist/commit/ef952d0a03b2cc3490b65535f1c5707b6578836d))
* remove layout animation ([efd6f99](https://github.com/remvze/moodist/commit/efd6f9941d1483e6a6df8db861ba221084a1f298))
* remove opacity effect on disabled ([4266557](https://github.com/remvze/moodist/commit/4266557366977534a4fba24922904ac51aaae74d))
* reverse gradient line ([87f3a2b](https://github.com/remvze/moodist/commit/87f3a2b51104d635dcaf6e48281b99193a7d931a))
* widen the container ([e7c786f](https://github.com/remvze/moodist/commit/e7c786f25986436606fa723441338588a84b00b3))
* add autofocus for note ([24a53c8](https://github.com/remvze/moodist/commit/24a53c81dffc1a4ba0b46244a87fb49bf562e755))
* add basic fading effect ([6ce766a](https://github.com/remvze/moodist/commit/6ce766af47389e9e3e57226b956b8593a4af06d4))
* add better aria labels ([98e5021](https://github.com/remvze/moodist/commit/98e5021f561458465a544e2b86194e7f52a62169))
* add better aria labels ([9774532](https://github.com/remvze/moodist/commit/977453230847790de86aa7721c059d4fe3ec7eeb))
* add close event for modals ([af92b1e](https://github.com/remvze/moodist/commit/af92b1ed902b4bf221e53315ba431f834915d7c2))
* add countdown timer button ([5f066a4](https://github.com/remvze/moodist/commit/5f066a4eff91996b165de3b86549fffe93800d38))
* add description for sleep timer ([77e2ec5](https://github.com/remvze/moodist/commit/77e2ec5e798771b7719b36882bc68c10265c06f6))
* add form to sleep timer ([9d458fb](https://github.com/remvze/moodist/commit/9d458fb60e8b84210f492541bab2c5dc94adcc8b))
* add keyboard shortcut for play button ([d3a2a12](https://github.com/remvze/moodist/commit/d3a2a12e1fdcca502c0d3d6dc60d3e4c577165f2))
* add keyboard shortcut for unselect button ([99f3a41](https://github.com/remvze/moodist/commit/99f3a41598ea237d2f509825d0b3c0ee27e789d7))
* add keyboard shortcuts ([669df1f](https://github.com/remvze/moodist/commit/669df1f08264e63c0892e7d4fdd2ee7dbcb96b2e))
* add lock while fading ([d9246b6](https://github.com/remvze/moodist/commit/d9246b692bcb75018653cb6f437b1f46af1f925d))
* add media session (wip) ([34d3f07](https://github.com/remvze/moodist/commit/34d3f075816eb821979f1d51a1177ecfa03920f3))
* add media session (wip) ([cf4870b](https://github.com/remvze/moodist/commit/cf4870b0d6b172bd4e6b79ff517af06b2aeac7a5))
* add media session (wip) ([9f0a28d](https://github.com/remvze/moodist/commit/9f0a28d9305954486d4f609f85811982df9710f3))
* add media session (wip) ([56b0e9b](https://github.com/remvze/moodist/commit/56b0e9bf1a16d4e7e2c8d7a552b652f8d30dd800))
* add media session (wip) ([4f752bb](https://github.com/remvze/moodist/commit/4f752bb6d048c0260ff6b2aada59c227624b2d17))
* add media session (wip) ([1547b0a](https://github.com/remvze/moodist/commit/1547b0a436bd9a77c19fc5d37be3cb3e123e6117))
* add media session (wip) ([f311ec1](https://github.com/remvze/moodist/commit/f311ec114e3a8ca61954819334e43195d0980219))
* add media session (wip) ([df1b05f](https://github.com/remvze/moodist/commit/df1b05f7ce3e26128d0bc4a9a022b5300ea88f85))
* add media session (wip) ([ea0dfff](https://github.com/remvze/moodist/commit/ea0dfff9c1e7d8e6e03bccdc0ab15d098b31a10d))
* add media session (wip) ([fc1bd07](https://github.com/remvze/moodist/commit/fc1bd07b7de9532383c66d7e59cc13bbe41f415a))
* add media session (wip) ([f79e941](https://github.com/remvze/moodist/commit/f79e941527e09e96b5eba6ca8c4e2e3df583c071))
* add media session (wip) ([11a4514](https://github.com/remvze/moodist/commit/11a4514a0f63f09954361fdef8145869d369fd29))
* add shortcuts list ([60f167c](https://github.com/remvze/moodist/commit/60f167c4d734bc6238f7c2bb7b39c89ed45ed9eb))
* add shortcuts to items ([42f82ab](https://github.com/remvze/moodist/commit/42f82ab95d684163826e76231fb1dd554f773d68))
* add sleep timer ([71b62ed](https://github.com/remvze/moodist/commit/71b62ed3dd365744435dc4499b9c53684f72849c))
* add story for modal ([9b7d3c6](https://github.com/remvze/moodist/commit/9b7d3c645b8c3469231641e6ec8bbdef88732bbc))
* add story for snackbar ([43f6245](https://github.com/remvze/moodist/commit/43f62452275573f948449190dcfcef89faa4ec51))
* allow using spacebar or enter to trigger buttons ([60cc2e9](https://github.com/remvze/moodist/commit/60cc2e9369aff3a374458cf1c3234eec8cd0530e))
* change shortcuts to shift ([837826f](https://github.com/remvze/moodist/commit/837826fbc13599e51bb7b65cf8b7bdcb1f1fc503))
* close notepad on escape ([583578b](https://github.com/remvze/moodist/commit/583578b31592b3c0e7f5ae6ad3f83e99e64fb6ff))
* make the modal more accessible ([0252fa9](https://github.com/remvze/moodist/commit/0252fa96abed18de71472ffc671b13c263754ed9))
### 🐛 Bug Fixes
* add aria label to shuffle button ([6d02cfb](https://github.com/remvze/moodist/commit/6d02cfb134bc925b9824040307b1b40626312fd1))
* add aria labels ([85768d8](https://github.com/remvze/moodist/commit/85768d8bca10f2732e98d138a3d83ec3116816d4))
* add keys to filler elements ([b7c7d40](https://github.com/remvze/moodist/commit/b7c7d40bf9c47c4a2793335e406ac4173d98a1e0))
* change icon path ([8cceb6e](https://github.com/remvze/moodist/commit/8cceb6ecd1d0183e0d5f0aeb7af4d80b2dc41b34))
* change icon path ([dc6a9e1](https://github.com/remvze/moodist/commit/dc6a9e120a0617761c9a36a3f1268c50d4a1b7c5))
* change icon path ([c184246](https://github.com/remvze/moodist/commit/c184246a1280e9e8cf85c77d1de8d32bf1d7592b))
* change link address ([1b4d216](https://github.com/remvze/moodist/commit/1b4d216b0813f8d336fba93c2e3bb794a988f834))
* change page title ([3bebb3e](https://github.com/remvze/moodist/commit/3bebb3e9d259dd7f87d17f29ea85df67c5e2ada5))
* fix icon imports ([a3eb479](https://github.com/remvze/moodist/commit/a3eb47914024eb7b9493adae95f916be591bb748))
* fix some animation issues ([eccba87](https://github.com/remvze/moodist/commit/eccba87557e0f444adb740e8d6488adad8a2ce42))
* fix some types ([04061e2](https://github.com/remvze/moodist/commit/04061e23c3063279afa493a1e120817f80447840))
* make sound count dynamic ([79458bb](https://github.com/remvze/moodist/commit/79458bba54189147af8b8e3f38b34c756d4bd58e))
* rehydrate store only on mount ([2c443d3](https://github.com/remvze/moodist/commit/2c443d3f33d9d9f4d00ed1e99a8b092597abce97))
* remove extra play calls ([e0164c3](https://github.com/remvze/moodist/commit/e0164c362d72fea7587f67470e4d295007e5ad5e))
* remove history on favorite toggle ([190f06a](https://github.com/remvze/moodist/commit/190f06aa78b1aff931348a65da864404b2d0f4d5))
* remove history on select ([5bd1dd3](https://github.com/remvze/moodist/commit/5bd1dd3016cf97ad397b4371015605473c55dee8))
* remove tooltip ([b634d6f](https://github.com/remvze/moodist/commit/b634d6f3c354a51e4403374b2e3505e4f2c09351))
* rotate the spinner when unselected ([cf7600e](https://github.com/remvze/moodist/commit/cf7600e6c72d9d9638c3a9ad0513675d353422cd))
* set aria label to ID ([7e0a9af](https://github.com/remvze/moodist/commit/7e0a9afb179d228301effe00575c2f67b426e3da))
* typo ([5cfb9a8](https://github.com/remvze/moodist/commit/5cfb9a8293a215b83a826c403d996d00108d49b5))
* allow empty inputs ([601ba6d](https://github.com/remvze/moodist/commit/601ba6def7954ca8f961c461abacfb076863ae18))
* change default values ([34d3c72](https://github.com/remvze/moodist/commit/34d3c72f3512664ac8f26a637b0d0be86b5499df))
* close all modals ([f025213](https://github.com/remvze/moodist/commit/f025213ef2e8ddbc5e6603d045c8bd4d08ad8b7b))
* fix button disabled and reset to 0 ([58bf28b](https://github.com/remvze/moodist/commit/58bf28bb24fd12bc28f4f5e3e79058df60095fd4))
* focus on the first new sound ([54c7772](https://github.com/remvze/moodist/commit/54c777276deccfda20bb7f027cef40d141a445b1))
* make inputs full width ([cc77f9e](https://github.com/remvze/moodist/commit/cc77f9e9c0b0a0d7734353486c93b4ca1509bf36))
* make share hotkey conditional ([9ad49d0](https://github.com/remvze/moodist/commit/9ad49d021a34d47160575ae1349f866ecb26c077))
* play sounds when starting timer if not already playing ([2e375ad](https://github.com/remvze/moodist/commit/2e375ad40a8001ee00c9553ba46d70f3bbe6636c))
* refocus on show more button ([b955fc9](https://github.com/remvze/moodist/commit/b955fc93f42c1bd71d5fb5ff46f9e3a039c7fe83))
* relocate focus trap ([8596a00](https://github.com/remvze/moodist/commit/8596a0014cbbac25ec93b1bb9136219a096cb21f))
* remove auto focus on load ([3b0c229](https://github.com/remvze/moodist/commit/3b0c22968e4209fa5a37a88b69f55492615ec389))
* remove console log ([7c6f068](https://github.com/remvze/moodist/commit/7c6f068d158cda0f8b0fe6bd6352a65002db0e25))
* remove media session ([9338b1d](https://github.com/remvze/moodist/commit/9338b1d30a4ae4602b339bc5c5a391a462a03de2))
* remove media session ([8d01d74](https://github.com/remvze/moodist/commit/8d01d74bd356adce782b95065fadad332ed99e48))
* replace the animation on button ([8307657](https://github.com/remvze/moodist/commit/8307657628c0afc7ef11c3a829344a64777dc1d3))
* reset values on cancel ([89a8308](https://github.com/remvze/moodist/commit/89a83089c568c619fd76a28c268ad9af9913babc))
* take remvze comments into account ([0517c31](https://github.com/remvze/moodist/commit/0517c31fc13e0b82391e18a7d16341421488f1c2))
* turn off spell check ([c66cddc](https://github.com/remvze/moodist/commit/c66cddc4c98c19a8c0ef46ed0ee7555a30fd5059))
* typo in README file ([06d0dfb](https://github.com/remvze/moodist/commit/06d0dfbe7eb0660a97c84627b1751b9a43d2e033))
### 🚚 Chores
* add more sounds ([eed5a13](https://github.com/remvze/moodist/commit/eed5a1329d6fc36d1e6375feaeaf2bba26167bf5))
* add more sounds ([5a7936f](https://github.com/remvze/moodist/commit/5a7936f11c4510886d14400e088ac0d8977a4806))
* add more sounds ([8c75f87](https://github.com/remvze/moodist/commit/8c75f875f0e39d392f8394d67b64d3d6d4e6f4a0))
* add robots.txt file ([6bdf28a](https://github.com/remvze/moodist/commit/6bdf28afdcf218c02f3bddc2a55fc1b6b88ebcff))
* change README banner ([c450028](https://github.com/remvze/moodist/commit/c450028ac7e58e961204de4789231d357d129ca1))
* change README file ([85e42f3](https://github.com/remvze/moodist/commit/85e42f3606f9fba281f2177d0dbffc86851603f9))
* upgrade Astro ([72fa516](https://github.com/remvze/moodist/commit/72fa516316cf1077cf5ab09bc59b76de147c6d38))
* add accessibility addon ([0300df3](https://github.com/remvze/moodist/commit/0300df3852838135245882a8aa1c59dd1a3f8af7))
* add autodocs for button ([3f3bcdd](https://github.com/remvze/moodist/commit/3f3bcdda21b631683028ea1c65e674973c78291d))
* add contributing guide ([5899d1b](https://github.com/remvze/moodist/commit/5899d1bbbb8eb621882e2cbacc1bc1dc9ae2ee06))
* add contribution section to README file ([b990778](https://github.com/remvze/moodist/commit/b9907781424ccd43babd31dd1d939d2e78ba4a11))
* add divider ([3e44516](https://github.com/remvze/moodist/commit/3e445165090472859573e69fad0fdeec87ca858f))
* add emojis ([d09e598](https://github.com/remvze/moodist/commit/d09e598297fb29f005873eb5e1cfad62774fc7f0))
* add emojis ([781adcf](https://github.com/remvze/moodist/commit/781adcf17eecea61bc03b832d8c81f3aac304848))
* add features to README file ([c614e3d](https://github.com/remvze/moodist/commit/c614e3d4f54f814fe3813bc8788a23ecba5e38c8))
* add licenses to README file ([dcef777](https://github.com/remvze/moodist/commit/dcef77729579391706047ad68afd73a07acf5122))
* add link to issue ([6fe9ce8](https://github.com/remvze/moodist/commit/6fe9ce8915600e5ec0140b5bb635ac1a2b092339))
* add link to story ([f8fb1ed](https://github.com/remvze/moodist/commit/f8fb1ed61e071baeba7981773e4dbd1e345c29b1))
* add npm commands to README file ([8d90344](https://github.com/remvze/moodist/commit/8d90344b26d3d52d1649074486d10c7b0bc68b66))
* add story for snackbar provider ([f19d151](https://github.com/remvze/moodist/commit/f19d151f4a5292668e87abb04111e142482baf1e))
* add support section ([672988c](https://github.com/remvze/moodist/commit/672988c36e8630fe775fdf0707bfa3e1a8956231))
* add tech stack to README file ([8e6e690](https://github.com/remvze/moodist/commit/8e6e6900069775df5c29c53b2d2b9a00457ad8f8))
* complete tech stack ([aeccf2d](https://github.com/remvze/moodist/commit/aeccf2dabd7528ff7984b50b7e7c7b8f46d4cef7))
* install Storybook ([65ca7e1](https://github.com/remvze/moodist/commit/65ca7e1c942455a41f8af794861a1875bd6190be))
* remove extra sound ([9ad1630](https://github.com/remvze/moodist/commit/9ad16306cf534ff27e99a537589c0d3c2c483d81))
* update README file ([629f0a5](https://github.com/remvze/moodist/commit/629f0a514ec1ac96f1874b8d6a466bf05577cd4d))
* update README file ([de49d37](https://github.com/remvze/moodist/commit/de49d37f08a90523e9b9b298189b10103e833e15))
* update README file ([7cb0f1c](https://github.com/remvze/moodist/commit/7cb0f1c7521775578bb6d794f43d04aa0da2fcba))
* update README file ([dc139e4](https://github.com/remvze/moodist/commit/dc139e41e628a75756cea99bdca0252267541014))
* update README file ([954a1b1](https://github.com/remvze/moodist/commit/954a1b1ce2c9f334d349fcd140ec18a5c78b7dd7))
* update README file ([383f898](https://github.com/remvze/moodist/commit/383f8981250d2fe646b4f642b36b28b3dbdd178f))
* write story for button ([603d318](https://github.com/remvze/moodist/commit/603d318e68ec786cfbeaad57835a812ca8918fb9))
### [1.4.3](https://github.com/remvze/moodist/compare/v1.4.2...v1.4.3) (2024-04-11)
### 🚚 Chores
- remove arm/v7 ([fa9711a](https://github.com/remvze/moodist/commit/fa9711a1e09e6e979b420556160c3cd69a8c3775))
### [1.4.2](https://github.com/remvze/moodist/compare/v1.4.1...v1.4.2) (2024-04-11)
### 💄 Styling
- change font path ([43ba975](https://github.com/remvze/moodist/commit/43ba9754085d7a710d3d629e70f873b16f267507))
### 🚚 Chores
- remove arm/v6 ([017c27f](https://github.com/remvze/moodist/commit/017c27fb2b20402553011db8f417717dcca6d447))
### [1.4.1](https://github.com/remvze/moodist/compare/v1.4.0...v1.4.1) (2024-04-11)
### ✨ Features
- add toolbar and portal ([ede4801](https://github.com/remvze/moodist/commit/ede480186c4b3f187c82e1d64e4d521ee59da31a))
### 💄 Styling
- widen the container ([7ec7ea7](https://github.com/remvze/moodist/commit/7ec7ea74d53db85cffa3af646c03270793453009))
### 🚚 Chores
- change GitHub workflow ([faf7f78](https://github.com/remvze/moodist/commit/faf7f78b8c10cd7b3688ed5bba3d0c077c020ad2))
## [1.4.0](https://github.com/remvze/moodist/compare/v1.3.1...v1.4.0) (2024-02-29)
### ♻️ Code Refactoring
* better tooltip ([5fecd38](https://github.com/remvze/moodist/commit/5fecd383aaf757dbb563a1abd7eee0e64905902c))
* change data file structure ([c9e8bd4](https://github.com/remvze/moodist/commit/c9e8bd41fd79f6c73c11e6fcdbe8b24c6c0bbeb4))
* relocate sections ([d672bf6](https://github.com/remvze/moodist/commit/d672bf6f85fe7b3a5c20fc53668705ab3d7827c5))
* remove seperate favorite store ([d7fd17e](https://github.com/remvze/moodist/commit/d7fd17ea8bb79ab44220bedfd62c98f9abf1d9f6))
* remove seperate playing context ([daee746](https://github.com/remvze/moodist/commit/daee7465bc4460a11b6aa5885cbd0eb7191c0026))
* rename component ([f5cdb8c](https://github.com/remvze/moodist/commit/f5cdb8c06b44f9cdde27e6e7c7e3d4d156c21dca))
* separate sounds ([a1ea9a1](https://github.com/remvze/moodist/commit/a1ea9a19e64f062c1d63ecef7fb200fbba063fe4))
* seperate buttons ([b117a4b](https://github.com/remvze/moodist/commit/b117a4b495bed8d7b034c42a70e080bc062ad672))
* seperate common types ([bad2d31](https://github.com/remvze/moodist/commit/bad2d31b2dfa6a1f01c1c9cd767209c2c6f58f5c))
* seperate favorite button ([4124beb](https://github.com/remvze/moodist/commit/4124beb5b4818f1eee322fa6a4777f2e422d04ba))
* seperate irrelevant logic ([f1688cb](https://github.com/remvze/moodist/commit/f1688cb53ccf7199759b8a60f1d05787edd05790))
* seperate motion variants ([7fce9e1](https://github.com/remvze/moodist/commit/7fce9e1dff3dfe2b17a92872125bb29f61fee23f))
* seperate range input ([89149dc](https://github.com/remvze/moodist/commit/89149dca78069affadb5633ba1354dd50fb616ae))
* sort interface keys ([c5240ff](https://github.com/remvze/moodist/commit/c5240ff507fba8d979ef842ceba05b712b76220d))
* turn footer into Astro component ([a67083c](https://github.com/remvze/moodist/commit/a67083c0e9812acc1dd71fade41a81f307669116))
* turn hero into Astro component ([77f9fcc](https://github.com/remvze/moodist/commit/77f9fcc50e54cecb31877eaccb3a578c291f99fe))
* turn sections into Astro components ([9398ae0](https://github.com/remvze/moodist/commit/9398ae0eddb4fac9695569a97a829bd518500363))
* use scrollIntoView instead of link ([4d2645f](https://github.com/remvze/moodist/commit/4d2645f06c846eea791f182224be0bc6e3db76dc))
- add variant to container ([831a9c8](https://github.com/remvze/moodist/commit/831a9c8ea019a3d86e994ff0e060dd4337a84d1f))
- move donation to React ([c505c57](https://github.com/remvze/moodist/commit/c505c574a885004e071da63d8255062befc29921))
- move footer to React ([52176bc](https://github.com/remvze/moodist/commit/52176bc3f9eac43d701de0e7f0ca103eeca46858))
- remove sections ([3f45be3](https://github.com/remvze/moodist/commit/3f45be3942bfeff74f3f0126de5e61037a749e61))
### 0.0.1 (2023-10-05)
### 💄 Styling
- add effect to about ([1a499be](https://github.com/remvze/moodist/commit/1a499be2446730d5333dd0d0d6a06bbd47564979))
- add margin to donate section ([6d30a01](https://github.com/remvze/moodist/commit/6d30a0123e0feb509b6c560f405b98d20a89467a))
- add polka dot pattern ([dc22b51](https://github.com/remvze/moodist/commit/dc22b51548f0d6830fcee79eebd75650f3f19dc1))
- add scroll lock in modals ([def69de](https://github.com/remvze/moodist/commit/def69de6e4e11e373280c90f93af0b0369b85ac8))
- add shine to donation button ([ac24da2](https://github.com/remvze/moodist/commit/ac24da294008a34c49dc3502374f1fcf55db5be8))
- change description ([8930e7b](https://github.com/remvze/moodist/commit/8930e7b76abffafd0ace5926de6c1d3f7629febd))
- change dividers ([8471a3c](https://github.com/remvze/moodist/commit/8471a3ca493b0c738ed7de900e82403f0b1ce2b7))
- change pattern ([f3e7224](https://github.com/remvze/moodist/commit/f3e72242670317d938cc8d9619729be95df0f4f0))
- change position for toolbar ([e7fd84b](https://github.com/remvze/moodist/commit/e7fd84bd4e8637e34eb0a59e97fd9c49875f8776))
- change sound counter ([e1b9a17](https://github.com/remvze/moodist/commit/e1b9a1736c1d11827faf900838769194364afbd3))
- change the about style ([4515aa8](https://github.com/remvze/moodist/commit/4515aa8e7a7f6d0fbc839625f74f0583e1a20d18))
- change the pattern slightly ([5fc3e7e](https://github.com/remvze/moodist/commit/5fc3e7e5d048cb4aa189683d147b181fdf2a94b6))
- change unselected style ([586e502](https://github.com/remvze/moodist/commit/586e502c3cc81314bc1e83f4e088a0d9289390fc))
- decorate paragraphs ([1a6ecd8](https://github.com/remvze/moodist/commit/1a6ecd82abe89e1686538c42b31826ccc8a43b2d))
- decrease dots ([182a8c7](https://github.com/remvze/moodist/commit/182a8c7aadc9a253261c56ae7faf8ac5c3c82707))
- decrease dots ([0ad4bb7](https://github.com/remvze/moodist/commit/0ad4bb72e15e8f7d52e7d4b036b71fdb837e3554))
- decrease dots ([2b84374](https://github.com/remvze/moodist/commit/2b843747b41111908bbe5fb8f5abc407114e4f15))
- decrease font size ([69cb45b](https://github.com/remvze/moodist/commit/69cb45bff74d36f654d521e9e7f6b2149b01d630))
- decrease opacity ([56802b6](https://github.com/remvze/moodist/commit/56802b67f2db751dbede9aa58b2158dd250a1420))
- decrease opacity ([2078648](https://github.com/remvze/moodist/commit/2078648c6687aab79a725490335b8ae751f3d4ee))
- decrease opacity ([82e4ea7](https://github.com/remvze/moodist/commit/82e4ea72f4ddb8658824813a64e14970400b1820))
- decrease padding ([98d2f76](https://github.com/remvze/moodist/commit/98d2f764383eaba0dd6163b93826459b614b67d2))
- decrease shine ([0f32de3](https://github.com/remvze/moodist/commit/0f32de3c0ca9f553c8917b786ddcdfb6feccf0c8))
- hide about and features ([400ea0a](https://github.com/remvze/moodist/commit/400ea0aeafe48587fe8596d1b5fe90755995d1c3))
- hide features ([9028675](https://github.com/remvze/moodist/commit/902867505743dd1dcd3f1e2afef010a186586615))
- increase dots ([405fccc](https://github.com/remvze/moodist/commit/405fcccd95d9ce720f0731e8040006bd1d9b8bd2))
- increase opacity ([882d440](https://github.com/remvze/moodist/commit/882d44079cfba8c7536c3713f0abeaa075ecb069))
- increase padding ([8e50013](https://github.com/remvze/moodist/commit/8e500136cec6ba5580146306f25a5956aa3a2a4b))
- increase pattern opacity ([5b83710](https://github.com/remvze/moodist/commit/5b83710c75515352b88c7bd361694d3067cb08fb))
- lower opacity ([d4cc24e](https://github.com/remvze/moodist/commit/d4cc24e468230df51e5676abbd828b2f2edd97f3))
- remove hero pattern ([8f36c86](https://github.com/remvze/moodist/commit/8f36c863d7f7489979691475947dbc8f29f26b39))
- revert changes ([341a896](https://github.com/remvze/moodist/commit/341a896924a6ace70114ad2ae3349f8934a329ba))
- revert pattern ([5916e86](https://github.com/remvze/moodist/commit/5916e86d3c6de9912b2c9bd490fa04cd9a0958dd))
- show about and features ([37505a6](https://github.com/remvze/moodist/commit/37505a6b3f86919ac04b69519e56ddbaf5234843))
### ✨ Features
- add about section ([d725d59](https://github.com/remvze/moodist/commit/d725d597034ead0bb63c5f0667b64ce459477662))
- add active indicators ([240fd9c](https://github.com/remvze/moodist/commit/240fd9c6e05c7385c0de92b8b57776988b902fae))
- add alarm for pomodoro timer ([0eb47ba](https://github.com/remvze/moodist/commit/0eb47ba2e1accaee7dd7d6114ca9a69cbc0656c4))
- add basic pomodoro structure ([9f7de33](https://github.com/remvze/moodist/commit/9f7de336e5add254b40c5694fc4c619ee00602ba))
- add controls to pomodoro ([7ed016d](https://github.com/remvze/moodist/commit/7ed016d8558a73d8d2bf05823cf80633882c1d69))
- add copy for productivity toolbox ([3205145](https://github.com/remvze/moodist/commit/3205145d5425c7a7a8660b46aa9de0b273a04ff0))
- add counter to notepad ([2424523](https://github.com/remvze/moodist/commit/24245235b14f9d59f86d2e988657a45a8a6d1eb7))
- add CTA button ([0e12a52](https://github.com/remvze/moodist/commit/0e12a5203ef836bd262b3d4cc02aaeb9048f461e))
- add custom presets ([2484e01](https://github.com/remvze/moodist/commit/2484e01273cf5e7ef5b44395cab26095891118fd))
- add dividers to menu items ([408734d](https://github.com/remvze/moodist/commit/408734d49fd89fbd47d29527c03927e49c834f30))
- add fade in/out ([663cb92](https://github.com/remvze/moodist/commit/663cb921350c083f1991665d147a3820bcdd9321))
- add features section ([e4e332a](https://github.com/remvze/moodist/commit/e4e332ad75aad1a58fd97acb71660b8dec9dfa09))
- add open-source section ([f7302de](https://github.com/remvze/moodist/commit/f7302dec5b7e182ad465bc30b63457a6e629a5b3))
- add scroll for lower heights ([758f2f4](https://github.com/remvze/moodist/commit/758f2f48dc6a4e520b7a1e937f96eed28c8e8c20))
- add simple notepad ([e923559](https://github.com/remvze/moodist/commit/e923559709796698257772cced4e20de584c6c80))
- add source code item ([d055e66](https://github.com/remvze/moodist/commit/d055e66dd9dd5789c88d1a002686457ea89db073))
- add special button ([a514a36](https://github.com/remvze/moodist/commit/a514a364ec5b6e2e34e7901ad51219d7be2aee86))
- add titles ([5f40435](https://github.com/remvze/moodist/commit/5f40435c0ccfec0cb87d9ac0c14723fb8265fa8d))
- add toolbar to notepad ([7463334](https://github.com/remvze/moodist/commit/7463334053ecd35a53cae535674169f5b50c81c2))
- change alignments ([1a01a00](https://github.com/remvze/moodist/commit/1a01a0086648c7564ecab30b79df0d67e93eb392))
- change the copy for features ([38da02a](https://github.com/remvze/moodist/commit/38da02a0d3b08e8f8802d6cf76a04ae656e10b76))
- change tooltip content ([941e1f0](https://github.com/remvze/moodist/commit/941e1f024189143340d663a0c117c08a0b315599))
- implement time setting ([f3cb2a1](https://github.com/remvze/moodist/commit/f3cb2a1b63e40f4f742ee2591b9353aa373f9783))
- persist pomodoro setting ([665e217](https://github.com/remvze/moodist/commit/665e2173f4083128687a6302a6f2fd82674f07c1))
- persist presets ([38a9a23](https://github.com/remvze/moodist/commit/38a9a23790248d5af522fc0d3cf6e99970e59637))
### 🐛 Bug Fixes
- add correct count to description ([81e6666](https://github.com/remvze/moodist/commit/81e66667765879da624544c5d915c1562f2ab34c))
- add key to categories ([38c11f1](https://github.com/remvze/moodist/commit/38c11f124e2235bc32de1e469b00ccaa22467a7e))
- add min-width to inputs ([dfd6c1f](https://github.com/remvze/moodist/commit/dfd6c1fc4a41845e686fc6ee96f71b696213fe69))
- change completion condition ([1ac5286](https://github.com/remvze/moodist/commit/1ac52861d1de651f8245d1e343307c6cf7a13dde))
- change default times ([158cffc](https://github.com/remvze/moodist/commit/158cffca8c4b138f33e2df03e046706d2b122478))
- change initial value ([a7e5368](https://github.com/remvze/moodist/commit/a7e53685918187c47d4fc2935418786b772c189e))
- change z-index values ([79afb8d](https://github.com/remvze/moodist/commit/79afb8d92f9cb8e551bf101267018af1ab58815d))
- comment out toolbox section ([a8a8c36](https://github.com/remvze/moodist/commit/a8a8c3643478d3da531e1da6c3640eb327acad3b))
- make sound count dynamic ([f66a6ff](https://github.com/remvze/moodist/commit/f66a6ffde770992353a5b21fe65c20fe50ab4328))
- remove extra headings ([7390a9b](https://github.com/remvze/moodist/commit/7390a9b3de0c52163d63b42ad48a882087886b65))
- remove fading ([653d309](https://github.com/remvze/moodist/commit/653d309e64b770c2b270d2435bcd02345b686fec))
- remove time from tabs array ([110356b](https://github.com/remvze/moodist/commit/110356b2da82e0f1e971ee9dc486664027d886ff))
- remove word counter dependency ([ae3ea8c](https://github.com/remvze/moodist/commit/ae3ea8c74f9a94ae56a0eb4b165bc36d990dea7b))
### [1.3.1](https://github.com/remvze/moodist/compare/v1.3.0...v1.3.1) (2024-02-01)
### ✨ Features
- add donate item ([f12ca48](https://github.com/remvze/moodist/commit/f12ca4806c9279f69f298bef770f8cac69a0860a))
- add donate section ([d449c29](https://github.com/remvze/moodist/commit/d449c29321024a43517e92cc59223b4b22fe2e82))
- add donation header ([17b4f25](https://github.com/remvze/moodist/commit/17b4f25ff10e09a917203e67cf963cac8358de1a))
### 🐛 Bug Fixes
- coffee typo ([8e02910](https://github.com/remvze/moodist/commit/8e0291004a90e55b67a921b9ffb483b409109ae4))
- complete donation links ([e6f768a](https://github.com/remvze/moodist/commit/e6f768a5e6dc983ae04b70f6c434fd4c13aeb506))
### 🚚 Chores
* add Commitizen 9d7cdde
* add Commitlint 50341d1
* add Editor Config a7d3495
* add ESLint be2a66e
* add Husky 3bed00a
* add Lint Staged 6cad460
* add npm config 297f7a7
* add path alias 123839d
* add PostCSS 332bd49
* add Prettier 110359b
* add Standard Version afc330e
* add Stylelint 0e5948f
- add donation link to README file ([1f806c4](https://github.com/remvze/moodist/commit/1f806c4e561d79a00850130eda09376299d85ed2))
## [1.3.0](https://github.com/remvze/moodist/compare/v1.2.0...v1.3.0) (2024-02-01)
### ♻️ Code Refactoring
- remove media session ([1f63534](https://github.com/remvze/moodist/commit/1f635348e3e5cf73ee76e1c5fac7b5f5b7f7ea6a))
- remove unmute and media session ([b77c817](https://github.com/remvze/moodist/commit/b77c817db25e1a738b6770b1ae86d792e0d42240))
### ✨ Features
- add fading to intro and outro ([5467bbb](https://github.com/remvze/moodist/commit/5467bbbc2437a5504e157122a995ad7a565ff0b8))
- add loader for favorites ([f682a91](https://github.com/remvze/moodist/commit/f682a910da97eb53cfb90ce955e953f05088e686))
- add media session ([5e0a842](https://github.com/remvze/moodist/commit/5e0a84259ff5586700c4e10087485d905be7ccee))
### 🐛 Bug Fixes
- add audio element ([889962b](https://github.com/remvze/moodist/commit/889962babe6e940ff283a41b145620d2a0477c70))
- add media session ([81f33d9](https://github.com/remvze/moodist/commit/81f33d9d375f63b4dd0bf58ad28a72354d85706e))
- add media session ([216b913](https://github.com/remvze/moodist/commit/216b913ccd0a7dfe0d03575f842aac9711ef0216))
- add unmute for iOS ([e422b52](https://github.com/remvze/moodist/commit/e422b52436c7dfc0b6cf866afa2b74dc219dcf2f))
- connect audio context to audio element ([463667c](https://github.com/remvze/moodist/commit/463667c868371540c46c9007e686961f9a4be7e5))
- increase decimal ([a33ae45](https://github.com/remvze/moodist/commit/a33ae450cf2c883228c76d04df8df75839c12753))
- remove fading ([d96461d](https://github.com/remvze/moodist/commit/d96461d1ea83c72bfe651d84cf34fabc029c200e))
- resume audio ([8e4d053](https://github.com/remvze/moodist/commit/8e4d0531e0e9aaf4e52b3b3a8666b74ff0c0222e))
- undo changes ([32da26c](https://github.com/remvze/moodist/commit/32da26ccfc0c5bdbe031e26ea48363ea0d8a7b23))
### 🚚 Chores
- add binaural beats ([f1d212a](https://github.com/remvze/moodist/commit/f1d212abc8b69a614bbdc4a23876e2eab7cbb574))
- add more sounds ([38f6f7d](https://github.com/remvze/moodist/commit/38f6f7dbe6898ed78e51eb3f0c7936f003ddca08))
- add more sounds ([937bf29](https://github.com/remvze/moodist/commit/937bf29d09cbce20ea0b6b0c87879f3a7dd1d497))
- add more sounds ([e2172fd](https://github.com/remvze/moodist/commit/e2172fd2bbd0e12a705c9efc98c72ad99d86d006))
- add more sounds ([1f12afa](https://github.com/remvze/moodist/commit/1f12afa3943154d70145ef6adc6aeee79f7a7af3))
- add more sounds ([cd05704](https://github.com/remvze/moodist/commit/cd05704a73ffb33aa0ccf5d789328a4cefc320f1))
- add more sounds ([01b4bdb](https://github.com/remvze/moodist/commit/01b4bdbb572285984bcdc9bb94c1a1b6dd2630c5))
## [1.2.0](https://github.com/remvze/moodist/compare/v1.1.0...v1.2.0) (2024-01-04)
### ♻️ Code Refactoring
- better item structure for menu ([26bf016](https://github.com/remvze/moodist/commit/26bf01690cfcc105b661951bcb2347394a67fb68))
- rewrite menu with floating ui ([8beb42c](https://github.com/remvze/moodist/commit/8beb42cb1b92c99aa9656b35cd7d82094e5baf72))
### 🐛 Bug Fixes
- stringify dependency ([1a23e00](https://github.com/remvze/moodist/commit/1a23e004a65960ce169990211f150db25762fead))
### ✨ Features
- add animation to menu box ([17027e2](https://github.com/remvze/moodist/commit/17027e299bb9bf958aebaf735c40e7664ad71e8b))
- add disabled state ([ff26597](https://github.com/remvze/moodist/commit/ff26597d22d444d18d2874a5c278eccc288972de))
- add menu button ([184bb09](https://github.com/remvze/moodist/commit/184bb09f5ab09fcf877e6a904023d9de72be9a89))
- add share modal ([35e3215](https://github.com/remvze/moodist/commit/35e32152b153f4dfaf9e071f526f6d7602ea97fc))
- add share placeholder ([fe2357c](https://github.com/remvze/moodist/commit/fe2357c995713cd0fb8335b325266859dc47a769))
- basic structure for share link ([ef81f19](https://github.com/remvze/moodist/commit/ef81f198baeb927e3b1768570f75e6638a7bd0b6))
- **docker:** add dockerfile ([a234bc1](https://github.com/remvze/moodist/commit/a234bc17a66331acbbc1d980cd1f53d58646f534))
- implement override feature ([0f62f07](https://github.com/remvze/moodist/commit/0f62f0795c5a9e06fa4e62b6b7b1e6c0774dfe0f))
- implement sharing URL ([93ff72a](https://github.com/remvze/moodist/commit/93ff72a052484b36c9ac821b94b632865b4a3550))
### 💄 Styling
- add animation to modal ([7823dc7](https://github.com/remvze/moodist/commit/7823dc7ff473278ef8ee401e69796c17b33da794))
- add icon to menu items ([131ab29](https://github.com/remvze/moodist/commit/131ab296215812e45a0c60486d75683f3de25d16))
- change border color ([85b627e](https://github.com/remvze/moodist/commit/85b627ecb96a4f52ecacdb53ed4484c050adba5e))
- change copy ([c51acd6](https://github.com/remvze/moodist/commit/c51acd62618cc705902dc01f0574a2c9124264c5))
- change to primary color ([c8e5122](https://github.com/remvze/moodist/commit/c8e51226e57bfa72ad91318de25fc5f9b5751634))
- widen the menu ([37a0736](https://github.com/remvze/moodist/commit/37a0736a0e7edd09c33940099c884e5b48afbbf1))
### 🚚 Chores
- change docker workflow ([cb4bfea](https://github.com/remvze/moodist/commit/cb4bfea5ab4326dee17c78554f12a08ffcb9dd0e))
- change docker-compose file ([660ee07](https://github.com/remvze/moodist/commit/660ee07a2359ec77c9d56bbe552541246e0f79c5))
- update GitHub action ([ee60613](https://github.com/remvze/moodist/commit/ee606139a80121fd6ee1b8233f82af994c4e1178))
## [1.1.0](https://github.com/remvze/moodist/compare/v1.0.0...v1.1.0) (2023-12-29)
### ♻️ Code Refactoring
- change ordering config ([a43c679](https://github.com/remvze/moodist/commit/a43c679e214b24c7f547e182aea6e2fbf826228f))
### 🐛 Bug Fixes
- change icon path ([28c3c40](https://github.com/remvze/moodist/commit/28c3c404ad790869b13731e4c3622abe33f1dda2))
### 🚚 Chores
- add more sounds ([e3864be](https://github.com/remvze/moodist/commit/e3864bede129c102ef5b7258b4688d9177dd284c))
- add more sounds ([55e7f05](https://github.com/remvze/moodist/commit/55e7f05892f6d3200b56a7e06b371bed4b4c4554))
- add more sounds ([318e87c](https://github.com/remvze/moodist/commit/318e87c9f1f3e2509c2b8eeb3a7f6875dd1c02fd))
- add places category ([5970012](https://github.com/remvze/moodist/commit/5970012fa6cbd8222c2be8ce426065f928d81b2b))
- add transport category ([c1c3945](https://github.com/remvze/moodist/commit/c1c3945d43e84e3011de52bffa5116d58283c473))
- change heartbeat audio ([f43a378](https://github.com/remvze/moodist/commit/f43a378697437f671c0c33122b1c9ec5a1e173ff))
- relocate underwater audio ([37bad81](https://github.com/remvze/moodist/commit/37bad8149e1f5170426dc745322c0e65cb9a41ff))
- remove heartbeat audio ([121a8f2](https://github.com/remvze/moodist/commit/121a8f204c6b61490a7ab0e732779031278e6e8c))
### 💄 Styling
- add hover states ([2c74dd0](https://github.com/remvze/moodist/commit/2c74dd0d604af86f99edcba2eb573641ac2010fd))
- change button style ([8efb1ce](https://github.com/remvze/moodist/commit/8efb1cee00ec0e0dcd9677729d9136ca8d69073f))
- change sound counter ([00fc5f3](https://github.com/remvze/moodist/commit/00fc5f3a872be51eb875744e254c75ea58e93281))
- change theme ([bd517f8](https://github.com/remvze/moodist/commit/bd517f88c01202eb7e7e5acf70bf4af2e6f91d75))
## [1.0.0](https://github.com/remvze/moodist/compare/v0.0.1...v1.0.0) (2023-12-09)
### ✨ Features
- add about section ([4e84419](https://github.com/remvze/moodist/commit/4e84419ab19f4f0c129a76a91be194bbab7f6b11))
- add aria-disabled to play button ([f390f38](https://github.com/remvze/moodist/commit/f390f3801604c49799078298637ea63a06eb9721))
- add auto pause to play button ([7c901b2](https://github.com/remvze/moodist/commit/7c901b2bdc525d02b80a0c42eb2f81f766947ca3))
- add auto play on select ([17d1b23](https://github.com/remvze/moodist/commit/17d1b23c8f1a6c717d846c12d38945e7d3b47be1))
- add basic animations with Framer Motion ([fa7b90e](https://github.com/remvze/moodist/commit/fa7b90eeec5b697446fa5871f8b499a85d0d150f))
- add basic audio player ([5a7a58e](https://github.com/remvze/moodist/commit/5a7a58e883fbb0122d8d6e2c777049a8fc0d9609))
- add basic categories ([8d7e4d2](https://github.com/remvze/moodist/commit/8d7e4d26fd7b53a16f7ce39551b31484eefbe461))
- add basic sound components ([4adb8bf](https://github.com/remvze/moodist/commit/4adb8bfdbc86a475d59e1d636927539592ec4b6c))
- add basic sounds for prototyping ([5791346](https://github.com/remvze/moodist/commit/5791346a881a9f451b967f782257317d8fb04d63))
- add color noise ([7363e8d](https://github.com/remvze/moodist/commit/7363e8d51a347adf3c53cbef9ec3e181912ecc6b))
- add deep merge to Zustand Persist ([01f4031](https://github.com/remvze/moodist/commit/01f40318124ad1e6e09b1f0572f623900192ba9d))
- add footer component ([262bb1a](https://github.com/remvze/moodist/commit/262bb1a9c6153a53e259e5bd9123b8035bd6b6d1))
- add gradient line decoration ([5559152](https://github.com/remvze/moodist/commit/5559152a8492dac335f0e6620ca4ca2d9233c889))
- add help text ([c3521a7](https://github.com/remvze/moodist/commit/c3521a798611aa0ad7297493aa5a790a27bbc991))
- add hero section ([dc33c2c](https://github.com/remvze/moodist/commit/dc33c2cf9cdcb251b7a0cc4dabdd7aafae154aa9))
- add hidden selection indicator ([e2cd75a](https://github.com/remvze/moodist/commit/e2cd75a332fab318a529f4f6e04ecf1867be7fd1))
- add Howler for sounds ([735d9eb](https://github.com/remvze/moodist/commit/735d9ebebfa36dd3e7596e70a0549b24b7b9fc4d))
- add icon for sounds ([1994004](https://github.com/remvze/moodist/commit/199400446cc241fb66722c79e74f882a7ef6a26c))
- add link to reasons ([e2b6eaf](https://github.com/remvze/moodist/commit/e2b6eaf8f3278768ce142ed58594958dcc7821ad))
- add loading state for sounds ([aaccbee](https://github.com/remvze/moodist/commit/aaccbee3d7dd1d4469ee26cea14df7132e8e9e0d))
- add local storage support ([856b3e6](https://github.com/remvze/moodist/commit/856b3e668ed6f24c8aefe532ac673af5e99141d1))
- add more and less button for sounds ([13cd72a](https://github.com/remvze/moodist/commit/13cd72a0655d90f0a6b7658b3357d1e8902f8fb7))
- add more sounds ([0888aaa](https://github.com/remvze/moodist/commit/0888aaa0f09ed549afdb21166ad6d2f048604275))
- add more sounds ([63ed396](https://github.com/remvze/moodist/commit/63ed396a5a74ed2b6e25882a72511ee93935fe04))
- add new sounds ([759e6b0](https://github.com/remvze/moodist/commit/759e6b0ce8f0acc3eb0eed508f7c587804097748))
- add play button ([31c087e](https://github.com/remvze/moodist/commit/31c087ebc8e66220d488226029dcc1435667ce04))
- add ready section ([e372d2f](https://github.com/remvze/moodist/commit/e372d2f398dbdcfad1069b50911ba840f0c9a1fe))
- add scroll to top component ([3c1c27b](https://github.com/remvze/moodist/commit/3c1c27b2fd378eb0f7351a3f511375cbc62f2a7b))
- add simple tooltip ([f2efe3c](https://github.com/remvze/moodist/commit/f2efe3c490ab5429824d10e97979694a4de11dd4))
- add singing bowl sound ([0b49f66](https://github.com/remvze/moodist/commit/0b49f66e5879642da10054046700a160411448a3))
- add sound count to hero ([42ccc7a](https://github.com/remvze/moodist/commit/42ccc7ada780fd5db5c038fa9210ec0e3e75be6e))
- add tooltip to scroll button ([d4401fa](https://github.com/remvze/moodist/commit/d4401faaffcb4351be1a152b89f94c9db63ca213))
- add why section ([3ed610b](https://github.com/remvze/moodist/commit/3ed610bb468293f6b08c2b2444bc47cd570383eb))
- change sound count from round to exact ([8c49453](https://github.com/remvze/moodist/commit/8c49453011d127669774f46720ce6e98ca01aa13))
- complete meta tags ([1cfbf0d](https://github.com/remvze/moodist/commit/1cfbf0dd092d35d2f098c29baf6d6adbc1107cc0))
- create reusable tooltip ([c637e2d](https://github.com/remvze/moodist/commit/c637e2d63109e12886b6f688c643146707967c7a))
- implement basic snackbar ([8090599](https://github.com/remvze/moodist/commit/8090599f2bc9ce58cdb36a6a04555afdb7af2bb2))
- implement basic Zustand store ([22bb65d](https://github.com/remvze/moodist/commit/22bb65de0d4ea9f485e4923b9c8715233df3114e))
- implement favorite sounds functionality ([cb34b59](https://github.com/remvze/moodist/commit/cb34b59d864fb80b930c0c9e1c1269bb7e9c2b18))
- implement shuffle functionality ([26ba017](https://github.com/remvze/moodist/commit/26ba017815d7338f49d2017eda75f86f493bf050))
- implement shuffling functionality ([3ac211e](https://github.com/remvze/moodist/commit/3ac211e3554d26c48fb8e0a588a67f1a4901e9b9))
- implement unselect all functionality ([8966d59](https://github.com/remvze/moodist/commit/8966d59d758496cc94247364833788dcc555ce8b))
- reorder sounds in favorites ([dc9da85](https://github.com/remvze/moodist/commit/dc9da85e6825b3cb70e2e6ad4f35c0db3aeb26c2))
### 💄 Styling
- add animation to more/less button ([b849b3a](https://github.com/remvze/moodist/commit/b849b3aecd6178114b3b27a2daa014b0795ddf42))
- add base and global styles ([05d68e4](https://github.com/remvze/moodist/commit/05d68e4de6f55ebbc08817ed553f7760f570208b))
- add gradient background ([77fed03](https://github.com/remvze/moodist/commit/77fed0308ad55ca32f07b4f30e7a7936063d842a))
- add gradient line ([ea722ea](https://github.com/remvze/moodist/commit/ea722eabd24cb966c65fa45d41f55e1e1a049939))
- add line to titles ([ec1def0](https://github.com/remvze/moodist/commit/ec1def041934d8a9f98084299a0606c5690ef23d))
- add more icons ([41c5ae5](https://github.com/remvze/moodist/commit/41c5ae5db8e72f15f5cc1b7501f397239ba9368a))
- add new font weight for links ([287d7b3](https://github.com/remvze/moodist/commit/287d7b33fb107e81034a17a60e1cd6cd5d40d935))
- add smooth transition ([3b33e09](https://github.com/remvze/moodist/commit/3b33e095479340496a7a11b057daef029f40b70a))
- add smooth transition ([e7fc951](https://github.com/remvze/moodist/commit/e7fc9513109ae48ce407745549085c9449cf3324))
- add text animation ([7810d21](https://github.com/remvze/moodist/commit/7810d212259cfe19befafab33d51110126089a83))
- add theme color ([6de1394](https://github.com/remvze/moodist/commit/6de1394628ccb6b58aec02bcd164e56e9ca0f30a))
- add wrap balancer to desc ([276639b](https://github.com/remvze/moodist/commit/276639b0d3a70ead87dc61e2c8cb7cd621261c3e))
- better line alignment ([1f24812](https://github.com/remvze/moodist/commit/1f24812efa3b64fdbfc794bcb546226cc2ef07d4))
- change border to shadow ([a53800c](https://github.com/remvze/moodist/commit/a53800c6b194e7520d2e7ee13c5e00f77db9f5f7))
- change button animation ([6983559](https://github.com/remvze/moodist/commit/6983559032d731ad6264ad56f0786b1a84f7cf4e))
- change button animation ([c44a863](https://github.com/remvze/moodist/commit/c44a86361ebf3a77d68148564a2983e60b522c29))
- change copy ([6242308](https://github.com/remvze/moodist/commit/624230843c3328fdfb42e0e2f23084cef4dec614))
- change favicon ([a82dc3f](https://github.com/remvze/moodist/commit/a82dc3f36af098071b6be09491e9e25bda190b74))
- change icon backgrounds ([ef825ca](https://github.com/remvze/moodist/commit/ef825cae68f3cd4ef58016212a45820d3b272f96))
- change icon color on selection ([e6abca6](https://github.com/remvze/moodist/commit/e6abca61fe9eb36ca6968339a4cb67beeb5f8fdc))
- change label cursor ([15953ef](https://github.com/remvze/moodist/commit/15953ef8565a27da2b41330753fbc40931987aa7))
- change like color ([d8c9806](https://github.com/remvze/moodist/commit/d8c9806a1964042b787baabf43e2852bab23dcfa))
- change logo ([9f702db](https://github.com/remvze/moodist/commit/9f702dbfa74b524b4553bd1686532bc7d35d9985))
- change primary color ([ed9a027](https://github.com/remvze/moodist/commit/ed9a0271f7c49b499ab07487072cfd7bab5277db))
- change reason copy ([69c4ec1](https://github.com/remvze/moodist/commit/69c4ec150849a15e2aa222ac4b6f2982cc9536df))
- change spacing ([cc26f68](https://github.com/remvze/moodist/commit/cc26f68097bd137bea1f62a9eba566844b1cb069))
- change tagline ([f3603e8](https://github.com/remvze/moodist/commit/f3603e84318a9b69145ae69d3aa02447ed1235e6))
- decrease gradient shine ([8f58794](https://github.com/remvze/moodist/commit/8f587944fd1ad5e11bb6bc3afc7e9380afa43a6c))
- decrease margin ([d700195](https://github.com/remvze/moodist/commit/d7001952f9ce323d746118583e0b34e001a8a517))
- decrease scale animation ([7e668e5](https://github.com/remvze/moodist/commit/7e668e5b393c7df71bec8bf11696acbae22d70e4))
- fix margins ([99775b7](https://github.com/remvze/moodist/commit/99775b7c6487b009bbf87fbd834ed8730508d1ce))
- fix snackbar pointer ([14c9e88](https://github.com/remvze/moodist/commit/14c9e88bfbef4b68dce0a1a8e570c1a9d9894dfd))
- fix tooltip z-index ([fb061c3](https://github.com/remvze/moodist/commit/fb061c3d66d3fa7c3fce63bae1e04e502fcbb891))
- fix z-index ([fa71709](https://github.com/remvze/moodist/commit/fa71709f897cc2b7a5ba03dbc1cb60a3198bf9f4))
- increase padding ([eedbf53](https://github.com/remvze/moodist/commit/eedbf53e0e07ba75161e9f397dc0554204bc004a))
- increase sounds per row ([cd8ec5e](https://github.com/remvze/moodist/commit/cd8ec5e8649f8808d0a89a74c1426b92628efbc7))
- relocate the play button ([403a755](https://github.com/remvze/moodist/commit/403a755ca7a9d93ef6940d1954fcde058505c1b8))
- remove extra colors ([38f05a3](https://github.com/remvze/moodist/commit/38f05a3e757ab0c8d91b1f84938bfb8443450769))
- remove gradient line ([de03cac](https://github.com/remvze/moodist/commit/de03cac6b374e836da65d00b7fe732bf17600554))
- remove gradient line ([6720e86](https://github.com/remvze/moodist/commit/6720e86a0af14c8c05d73f305ee12664f3b264b7))
- remove layout animation ([ef952d0](https://github.com/remvze/moodist/commit/ef952d0a03b2cc3490b65535f1c5707b6578836d))
- remove layout animation ([efd6f99](https://github.com/remvze/moodist/commit/efd6f9941d1483e6a6df8db861ba221084a1f298))
- remove opacity effect on disabled ([4266557](https://github.com/remvze/moodist/commit/4266557366977534a4fba24922904ac51aaae74d))
- reverse gradient line ([87f3a2b](https://github.com/remvze/moodist/commit/87f3a2b51104d635dcaf6e48281b99193a7d931a))
- widen the container ([e7c786f](https://github.com/remvze/moodist/commit/e7c786f25986436606fa723441338588a84b00b3))
### 🐛 Bug Fixes
- add aria label to shuffle button ([6d02cfb](https://github.com/remvze/moodist/commit/6d02cfb134bc925b9824040307b1b40626312fd1))
- add aria labels ([85768d8](https://github.com/remvze/moodist/commit/85768d8bca10f2732e98d138a3d83ec3116816d4))
- add keys to filler elements ([b7c7d40](https://github.com/remvze/moodist/commit/b7c7d40bf9c47c4a2793335e406ac4173d98a1e0))
- change icon path ([8cceb6e](https://github.com/remvze/moodist/commit/8cceb6ecd1d0183e0d5f0aeb7af4d80b2dc41b34))
- change icon path ([dc6a9e1](https://github.com/remvze/moodist/commit/dc6a9e120a0617761c9a36a3f1268c50d4a1b7c5))
- change icon path ([c184246](https://github.com/remvze/moodist/commit/c184246a1280e9e8cf85c77d1de8d32bf1d7592b))
- change link address ([1b4d216](https://github.com/remvze/moodist/commit/1b4d216b0813f8d336fba93c2e3bb794a988f834))
- change page title ([3bebb3e](https://github.com/remvze/moodist/commit/3bebb3e9d259dd7f87d17f29ea85df67c5e2ada5))
- fix icon imports ([a3eb479](https://github.com/remvze/moodist/commit/a3eb47914024eb7b9493adae95f916be591bb748))
- fix some animation issues ([eccba87](https://github.com/remvze/moodist/commit/eccba87557e0f444adb740e8d6488adad8a2ce42))
- fix some types ([04061e2](https://github.com/remvze/moodist/commit/04061e23c3063279afa493a1e120817f80447840))
- make sound count dynamic ([79458bb](https://github.com/remvze/moodist/commit/79458bba54189147af8b8e3f38b34c756d4bd58e))
- rehydrate store only on mount ([2c443d3](https://github.com/remvze/moodist/commit/2c443d3f33d9d9f4d00ed1e99a8b092597abce97))
- remove extra play calls ([e0164c3](https://github.com/remvze/moodist/commit/e0164c362d72fea7587f67470e4d295007e5ad5e))
- remove history on favorite toggle ([190f06a](https://github.com/remvze/moodist/commit/190f06aa78b1aff931348a65da864404b2d0f4d5))
- remove history on select ([5bd1dd3](https://github.com/remvze/moodist/commit/5bd1dd3016cf97ad397b4371015605473c55dee8))
- remove tooltip ([b634d6f](https://github.com/remvze/moodist/commit/b634d6f3c354a51e4403374b2e3505e4f2c09351))
- rotate the spinner when unselected ([cf7600e](https://github.com/remvze/moodist/commit/cf7600e6c72d9d9638c3a9ad0513675d353422cd))
- set aria label to ID ([7e0a9af](https://github.com/remvze/moodist/commit/7e0a9afb179d228301effe00575c2f67b426e3da))
- typo ([5cfb9a8](https://github.com/remvze/moodist/commit/5cfb9a8293a215b83a826c403d996d00108d49b5))
### 🚚 Chores
- add more sounds ([eed5a13](https://github.com/remvze/moodist/commit/eed5a1329d6fc36d1e6375feaeaf2bba26167bf5))
- add more sounds ([5a7936f](https://github.com/remvze/moodist/commit/5a7936f11c4510886d14400e088ac0d8977a4806))
- add more sounds ([8c75f87](https://github.com/remvze/moodist/commit/8c75f875f0e39d392f8394d67b64d3d6d4e6f4a0))
- add robots.txt file ([6bdf28a](https://github.com/remvze/moodist/commit/6bdf28afdcf218c02f3bddc2a55fc1b6b88ebcff))
- change README banner ([c450028](https://github.com/remvze/moodist/commit/c450028ac7e58e961204de4789231d357d129ca1))
- change README file ([85e42f3](https://github.com/remvze/moodist/commit/85e42f3606f9fba281f2177d0dbffc86851603f9))
- upgrade Astro ([72fa516](https://github.com/remvze/moodist/commit/72fa516316cf1077cf5ab09bc59b76de147c6d38))
### ♻️ Code Refactoring
- better tooltip ([5fecd38](https://github.com/remvze/moodist/commit/5fecd383aaf757dbb563a1abd7eee0e64905902c))
- change data file structure ([c9e8bd4](https://github.com/remvze/moodist/commit/c9e8bd41fd79f6c73c11e6fcdbe8b24c6c0bbeb4))
- relocate sections ([d672bf6](https://github.com/remvze/moodist/commit/d672bf6f85fe7b3a5c20fc53668705ab3d7827c5))
- remove seperate favorite store ([d7fd17e](https://github.com/remvze/moodist/commit/d7fd17ea8bb79ab44220bedfd62c98f9abf1d9f6))
- remove seperate playing context ([daee746](https://github.com/remvze/moodist/commit/daee7465bc4460a11b6aa5885cbd0eb7191c0026))
- rename component ([f5cdb8c](https://github.com/remvze/moodist/commit/f5cdb8c06b44f9cdde27e6e7c7e3d4d156c21dca))
- separate sounds ([a1ea9a1](https://github.com/remvze/moodist/commit/a1ea9a19e64f062c1d63ecef7fb200fbba063fe4))
- seperate buttons ([b117a4b](https://github.com/remvze/moodist/commit/b117a4b495bed8d7b034c42a70e080bc062ad672))
- seperate common types ([bad2d31](https://github.com/remvze/moodist/commit/bad2d31b2dfa6a1f01c1c9cd767209c2c6f58f5c))
- seperate favorite button ([4124beb](https://github.com/remvze/moodist/commit/4124beb5b4818f1eee322fa6a4777f2e422d04ba))
- seperate irrelevant logic ([f1688cb](https://github.com/remvze/moodist/commit/f1688cb53ccf7199759b8a60f1d05787edd05790))
- seperate motion variants ([7fce9e1](https://github.com/remvze/moodist/commit/7fce9e1dff3dfe2b17a92872125bb29f61fee23f))
- seperate range input ([89149dc](https://github.com/remvze/moodist/commit/89149dca78069affadb5633ba1354dd50fb616ae))
- sort interface keys ([c5240ff](https://github.com/remvze/moodist/commit/c5240ff507fba8d979ef842ceba05b712b76220d))
- turn footer into Astro component ([a67083c](https://github.com/remvze/moodist/commit/a67083c0e9812acc1dd71fade41a81f307669116))
- turn hero into Astro component ([77f9fcc](https://github.com/remvze/moodist/commit/77f9fcc50e54cecb31877eaccb3a578c291f99fe))
- turn sections into Astro components ([9398ae0](https://github.com/remvze/moodist/commit/9398ae0eddb4fac9695569a97a829bd518500363))
- use scrollIntoView instead of link ([4d2645f](https://github.com/remvze/moodist/commit/4d2645f06c846eea791f182224be0bc6e3db76dc))
### 0.0.1 (2023-10-05)
### 🚚 Chores
- add Commitizen 9d7cdde
- add Commitlint 50341d1
- add Editor Config a7d3495
- add ESLint be2a66e
- add Husky 3bed00a
- add Lint Staged 6cad460
- add npm config 297f7a7
- add path alias 123839d
- add PostCSS 332bd49
- add Prettier 110359b
- add Standard Version afc330e
- add Stylelint 0e5948f

25
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,25 @@
# Contributing Guidelines
Thank you for considering contributing to our project! We welcome your contributions.
## How to Contribute
1. Fork the repository.
2. Create a new branch: `git checkout -b feature/your-feature-name`.
3. Make your changes and commit them: `git commit -m 'feat: add some feature'`.
4. Push to the branch: `git push origin feature/your-feature-name`.
5. Submit a pull request. ⚡
⚠️ **Notice**: Commit messages should follow [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/).
## Report Bugs
To report a bug, please open an issue on GitHub and provide detailed information about the bug, including steps to reproduce it.
## Request Features
To request a new feature, open an issue on GitHub and describe the feature you would like to see added.
## License
By contributing, you agree that your contributions will be licensed under the project's [LICENSE](LICENSE).

12
Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM docker.io/node:20-alpine3.18 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM docker.io/nginx:alpine AS runtime
COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 8080

View File

@@ -2,5 +2,88 @@
<img src="/assets/banner.svg" alt="Moodist Logo Banner" />
<h2>Moodist 🌲</h2>
<p>Ambient sounds for focus and calm.</p>
<a href="https://moodist.app">Visit <strong>Moodist</strong></a>
<a href="https://moodist.app">Visit <strong>Moodist</strong></a> | <a href="https://buymeacoffee.com/remvze">Buy Me a Coffee</a>
</div>
## Table of Contents
- ⚡ [Features](#features)
- 🧰 [Tools](#tools)
- 🔮 [Commands](#commands)
- 🚧 [Contributing](#contributing)
- ⭐ [Support](#support-moodist)
- 📜 [License](#license)
## Features
1. 🎵 Over 75 ambient sounds.
1. 📝 Persistent sound selection.
1. ✈️ Sharing sound selections with others.
1. 🧰 Custom sound presets.
1. 🌙 Sleep timer for sounds.
1. 📓 Notepad for quick notes.
1. 🍅 Pomodoro timer.
1. ✅ Simple to-do list (soon).
1. ⏯️ Media controls.
1. ⌨️ Keyboard shortcuts for everything.
1. 🥷 Privacy focused: no data collection.
1. 💰 Completely free, open-source, and self-hostable.
## Tools
-**TypeScript**: Programming Language
- 🔨 **React**: UI Library
- 🧑‍🚀 **Astro**: Meta Framework
- 🎨 **CSS Modules**: Styling
- 🐻 **Zustand**: State Management
- 🎭 **Framer Motion**: Animation Library
- ⚙️ **Radix**: Accessible Components
- 📕 **Storybook**: Component Documentation
- 🧪 **Vitest**: Unit Testing (soon)
- 🔭 **Playwright**: End-To-End Testing (soon)
- 🔍 **ESLint**: Code Linting
- 🧹 **Prettier**: Code Formatting
- 🧼 **Stylelint**: CSS Linting
- 🐶 **Husky**: Git Hooks
- 📝 **Lint Staged**: Running Linters on Staged Files
- 🧽 **Commitlint**: Git Commit Linting
- 🧭 **Commitizen**: Git Commit Message Helper
- 📓 **Standard Version**: Versioning and CHANGLOG Generation
- 🧰 **PostCSS**: CSS Transformations
## Commands
- `npm run dev`: run development server
- `npm run build`: build for production
- `npm run preview`: preview the built app
- `npm run lint`: lint files using ESLint
- `npm run lint:fix`: lint and fix using ESLint
- `npm run lint:style`: lint styles using Stylelint
- `npm run lint:style:fix`: lint and fix styles using Stylelint
- `npm run format`: format files using Prettier
- `npm run commit`: commit message using Commitizen
- `npm run release:major`: release major version
- `npm run release:minor`: release minor version
- `npm run release:patch`: release patch version
- `npm run storybook`: run Storybook
## Contributing
🚧 Please check [CONTRIBUTING.md](CONTRIBUTING.md) file.
## Support Moodist
⭐ Give a star if you liked this project.
☕ [Buy Me a Coffee](https://buymeacoffee.com/remvze) to help me maintain Moodist.
## License
This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.
### ⚠️ Third-Party Assets
Some sounds used in this project are sourced from third-party providers and **are subject to different licenses**:
- Sounds licensed under the **Pixabay Content License**: [Pixabay Content License](https://pixabay.com/service/license-summary/)
- Sounds licensed under **CC0**: [Creative Commons Zero License](https://creativecommons.org/publicdomain/zero/1.0/)

View File

@@ -1,8 +1,7 @@
import { defineConfig } from 'astro/config';
import react from "@astrojs/react";
import react from '@astrojs/react';
// https://astro.build/config
export default defineConfig({
integrations: [react()]
});
integrations: [react()],
});

10
docker-compose.yml Normal file
View File

@@ -0,0 +1,10 @@
version: '3.9'
services:
moodist:
image: ghcr.io/remvze/moodist
logging:
options:
max-size: 1g
restart: always
ports:
- '8080:8080'

31
docker/nginx/nginx.conf Normal file
View File

@@ -0,0 +1,31 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
server_name _;
root /usr/share/nginx/html;
index index.html index.htm;
include /etc/nginx/mime.types;
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
internal;
}
location / {
try_files $uri $uri/index.html =404;
}
}
}

12631
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,14 @@
{
"name": "moodist",
"type": "module",
"version": "1.1.0",
"version": "1.5.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro",
"test": "vitest",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx,.astro",
"lint:fix": "npm run lint -- --fix",
"lint:style": "stylelint ./**/*.{css,astro,html}",
@@ -18,27 +19,48 @@
"release": "standard-version --no-verify",
"release:major": "npm run release -- --release-as major",
"release:minor": "npm run release -- --release-as minor",
"release:patch": "npm run release -- --release-as patch"
"release:patch": "npm run release -- --release-as patch",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"
},
"dependencies": {
"@astrojs/react": "^3.0.3",
"@astrojs/react": "3.6.0",
"@floating-ui/react": "0.26.0",
"@formkit/auto-animate": "0.8.2",
"@radix-ui/react-checkbox": "1.1.4",
"@radix-ui/react-dropdown-menu": "2.0.6",
"@radix-ui/react-slider": "1.2.3",
"@radix-ui/react-tooltip": "1.0.7",
"@types/howler": "2.2.10",
"@types/react": "^18.2.25",
"@types/react-dom": "^18.2.10",
"astro": "4.0.3",
"astro": "4.10.3",
"deepmerge": "4.3.1",
"focus-trap-react": "10.2.3",
"framer-motion": "10.16.4",
"howler": "2.2.4",
"js-confetti": "0.12.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hotkeys-hook": "3.2.1",
"react-icons": "4.11.0",
"react-wrap-balancer": "1.1.0",
"uuid": "10.0.0",
"zustand": "4.4.3"
},
"devDependencies": {
"@chromatic-com/storybook": "1.3.3",
"@commitlint/cli": "17.7.2",
"@commitlint/config-conventional": "17.7.0",
"@storybook/addon-a11y": "8.0.9",
"@storybook/addon-essentials": "8.0.9",
"@storybook/addon-interactions": "8.0.9",
"@storybook/addon-links": "8.0.9",
"@storybook/addon-onboarding": "8.0.9",
"@storybook/blocks": "8.0.9",
"@storybook/react": "8.0.9",
"@storybook/react-vite": "8.0.9",
"@storybook/test": "8.0.9",
"@typescript-eslint/eslint-plugin": "6.7.4",
"@typescript-eslint/parser": "6.7.4",
"astro-eslint-parser": "0.16.0",
@@ -57,6 +79,7 @@
"eslint-plugin-react-hooks": "4.6.0",
"eslint-plugin-sort-destructure-keys": "1.5.0",
"eslint-plugin-sort-keys-fix": "1.1.2",
"eslint-plugin-storybook": "0.8.0",
"eslint-plugin-typescript-sort-keys": "3.1.0",
"husky": "8.0.3",
"lint-staged": "14.0.1",
@@ -64,11 +87,14 @@
"postcss-nesting": "12.0.1",
"prettier": "3.0.3",
"prettier-plugin-astro": "0.12.0",
"prop-types": "15.8.1",
"standard-version": "9.5.0",
"storybook": "8.0.9",
"stylelint": "15.10.3",
"stylelint-config-html": "1.1.0",
"stylelint-config-recess-order": "4.4.0",
"stylelint-config-standard": "34.0.0",
"stylelint-prettier": "4.0.2"
"stylelint-prettier": "4.0.2",
"vitest": "1.6.0"
}
}

View File

@@ -1,12 +1,11 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="128" height="128" rx="25" fill="#09090B"/>
<path d="M64 19C76.4264 19 86.5 29.0736 86.5 41.5H75.25C75.25 35.2868 70.2132 30.25 64 30.25C57.7868 30.25 52.75 35.2868 52.75 41.5L41.5 41.5C41.5 29.0736 51.5736 19 64 19Z" fill="white"/>
<path d="M41.5 86.5C29.0736 86.5 19 76.4264 19 64C19 51.5736 29.0736 41.5 41.5 41.5V52.75C35.2868 52.75 30.25 57.7868 30.25 64C30.25 70.2132 35.2868 75.25 41.5 75.25V86.5Z" fill="white"/>
<path d="M86.5 86.5C86.5 98.9264 76.4264 109 64 109C51.5736 109 41.5 98.9264 41.5 86.5H52.75C52.75 92.7132 57.7868 97.75 64 97.75C70.2132 97.75 75.25 92.7132 75.25 86.5H86.5Z" fill="white"/>
<path d="M86.5 86.5C98.9264 86.5 109 76.4264 109 64C109 51.5736 98.9264 41.5 86.5 41.5V52.75C92.7132 52.75 97.75 57.7868 97.75 64C97.75 70.2132 92.7132 75.25 86.5 75.25V86.5Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M64 86.5C76.4264 86.5 86.5 76.4264 86.5 64C86.5 51.5736 76.4264 41.5 64 41.5C51.5736 41.5 41.5 51.5736 41.5 64C41.5 76.4264 51.5736 86.5 64 86.5ZM64 75.25C70.2132 75.25 75.25 70.2132 75.25 64C75.25 57.7868 70.2132 52.75 64 52.75C57.7868 52.75 52.75 57.7868 52.75 64C52.75 70.2132 57.7868 75.25 64 75.25Z" fill="white"/>
<path d="M30.25 41.5C30.25 35.2868 35.2868 30.25 41.5 30.25V19C29.0736 19 19 29.0736 19 41.5H30.25Z" fill="white"/>
<path d="M97.75 41.5C97.75 35.2868 92.7132 30.25 86.5 30.25V19C98.9264 19 109 29.0736 109 41.5H97.75Z" fill="white"/>
<path d="M97.75 86.5C97.75 92.7132 92.7132 97.75 86.5 97.75V109C98.9264 109 109 98.9264 109 86.5H97.75Z" fill="white"/>
<path d="M30.25 86.5C30.25 92.7132 35.2868 97.75 41.5 97.75V109C29.0736 109 19 98.9264 19 86.5H30.25Z" fill="white"/>
<path d="M64 49.7864C64 47.4488 64.5643 45.2429 65.5642 43.2976L65.5645 43.2971L65.5711 43.2843C66.0791 42.2986 66.6989 41.3799 67.4139 40.5452C68.8566 38.8609 70.6864 37.518 72.7654 36.6545C72.5386 36.3807 72.2969 36.1151 72.0404 35.8586C70.7047 34.5229 69.1194 33.589 67.4346 33.0568C66.4711 33.6789 65.5647 34.382 64.7252 35.1564C64.6766 35.2012 64.6282 35.2463 64.5801 35.2916C64.3829 35.4771 64.1895 35.6667 64 35.86C63.8105 35.6667 63.6171 35.4771 63.4199 35.2916C62.54 34.4636 61.5846 33.7149 60.5653 33.0568C59.5394 32.3945 58.4487 31.8239 57.3048 31.3568C55.0096 30.4195 52.5001 29.8985 49.8702 29.8876C49.8423 29.8875 49.8144 29.8875 49.7864 29.8875C48.4122 29.8875 47.0706 30.0267 45.7748 30.292C38.0036 31.8827 31.8827 38.0036 30.292 45.7748C32.6037 44.0448 35.1703 42.8117 37.8441 42.0757C38.9389 40.3836 40.3836 38.9389 42.0757 37.8442C43.173 37.1342 44.3744 36.5713 45.652 36.1836C46.9602 35.7864 48.3484 35.5729 49.7864 35.5729C50.6505 35.5729 51.4966 35.65 52.3182 35.7977C53.3317 35.9799 54.3079 36.2696 55.2346 36.6545C57.3136 37.518 59.1434 38.8609 60.586 40.5452C61.3042 41.3837 61.9265 42.3069 62.4358 43.2976C62.4924 43.4079 62.5477 43.5189 62.6015 43.6308C63.4978 45.4933 64 47.5812 64 49.7864Z" fill="#FAFAFA"/>
<path d="M74.0505 53.9495C75.7035 52.2965 77.6623 51.1358 79.7449 50.4673C79.8233 50.4421 79.9019 50.4176 79.9807 50.3938C80.9672 50.096 81.9797 49.9077 82.9991 49.8289C85.2102 49.6581 87.4536 50.0024 89.5343 50.8619C89.5675 50.5079 89.5844 50.1492 89.5844 49.7864C89.5844 47.8975 89.1238 46.1161 88.3088 44.5485C87.1735 44.3041 86.021 44.1598 84.8654 44.1156C84.8136 44.1136 84.7619 44.1119 84.7101 44.1103C84.4395 44.102 84.1687 44.0993 83.898 44.102C83.9007 43.8313 83.898 43.5605 83.8897 43.2899C83.853 42.0823 83.7069 40.8773 83.4515 39.6912C83.1944 38.4974 82.8266 37.3228 82.348 36.1836C81.3878 33.8978 79.9817 31.7549 78.1298 29.8876C78.1102 29.8678 78.0905 29.848 78.0707 29.8283C77.099 28.8566 76.0518 28.0064 74.948 27.2777C68.3281 22.9074 59.6719 22.9074 53.052 27.2777C55.9099 27.689 58.5967 28.6319 61.0079 30.0022C62.9785 29.5798 65.0215 29.5798 66.9921 30.0022C68.2701 30.2761 69.5176 30.7276 70.6952 31.3568C71.9011 32.0011 73.0337 32.8316 74.0505 33.8485C74.6615 34.4595 75.2053 35.1123 75.6818 35.7977C76.2696 36.6432 76.755 37.5383 77.1381 38.4657C77.9976 40.5464 78.3419 42.7898 78.171 45.0009C78.086 46.1017 77.8732 47.1945 77.5327 48.2552C77.4948 48.3732 77.4554 48.4908 77.4143 48.608C76.7311 50.5587 75.6098 52.3902 74.0505 53.9495Z" fill="#FAFAFA"/>
<path d="M78.2135 64C80.5512 64 82.7571 64.5643 84.7023 65.5642L84.7157 65.5711C85.7014 66.0791 86.6201 66.699 87.4548 67.414C89.1391 68.8566 90.482 70.6864 91.3455 72.7654C91.6193 72.5386 91.8849 72.2969 92.1414 72.0404C93.4771 70.7047 94.411 69.1194 94.9432 67.4347C94.2851 66.4154 93.5363 65.46 92.7084 64.5801C92.5228 64.3829 92.3333 64.1895 92.1399 64C92.3333 63.8105 92.5228 63.6171 92.7084 63.4199C93.5363 62.54 94.2851 61.5846 94.9432 60.5653C95.6055 59.5394 96.1761 58.4487 96.6432 57.3048C97.5805 55.0095 98.1015 52.5 98.1124 49.8702C98.1125 49.8423 98.1125 49.8144 98.1125 49.7864C98.1125 48.4122 97.9732 47.0706 97.708 45.7748C96.1172 38.0036 89.9964 31.8828 82.2252 30.292C83.9552 32.6037 85.1883 35.1703 85.9243 37.8442C87.6164 38.939 89.061 40.3836 90.1558 42.0757C90.8658 43.173 91.4286 44.3744 91.8164 45.652C92.2136 46.9602 92.4271 48.3484 92.4271 49.7864C92.4271 50.6505 92.35 51.4966 92.2023 52.3182C92.0201 53.3317 91.7304 54.3079 91.3455 55.2346C90.482 57.3136 89.1391 59.1434 87.4548 60.586C86.6163 61.3043 85.6931 61.9265 84.7023 62.4358C84.5921 62.4924 84.481 62.5477 84.3691 62.6015C82.5067 63.4978 80.4187 64 78.2135 64Z" fill="#FAFAFA"/>
<path d="M74.0505 74.0505C75.7035 75.7035 76.8642 77.6623 77.5327 79.7449C77.5579 79.8233 77.5824 79.9019 77.6061 79.9807C77.904 80.9672 78.0923 81.9797 78.171 82.9991C78.3419 85.2102 77.9976 87.4536 77.1381 89.5343C77.4921 89.5675 77.8508 89.5844 78.2135 89.5844C80.1025 89.5844 81.8839 89.1238 83.4515 88.3088C83.6959 87.1735 83.8402 86.021 83.8844 84.8654C83.8864 84.8136 83.8881 84.7619 83.8897 84.7101C83.898 84.4395 83.9007 84.1687 83.898 83.898C84.1687 83.9007 84.4395 83.898 84.7101 83.8897C85.9177 83.853 87.1227 83.7069 88.3088 83.4515C89.5025 83.1944 90.6772 82.8266 91.8164 82.348C94.1022 81.3878 96.2451 79.9818 98.1124 78.1298C98.1322 78.1102 98.152 78.0905 98.1717 78.0707C99.1434 77.099 99.9936 76.0518 100.722 74.948C105.093 68.3281 105.093 59.6719 100.722 53.052C100.311 55.9099 99.368 58.5967 97.9978 61.0078C98.4202 62.9785 98.4202 65.0215 97.9978 66.9922C97.7239 68.2701 97.2724 69.5176 96.6432 70.6952C95.9989 71.9011 95.1684 73.0337 94.1515 74.0505C93.5405 74.6615 92.8877 75.2053 92.2023 75.6818C91.3568 76.2696 90.4617 76.755 89.5343 77.1381C87.4536 77.9976 85.2102 78.3419 82.9991 78.171C81.8983 78.086 80.8055 77.8732 79.7449 77.5327C79.6268 77.4948 79.5092 77.4554 79.392 77.4143C77.4413 76.7311 75.6098 75.6098 74.0505 74.0505Z" fill="#FAFAFA"/>
<path d="M64 78.2136C64 80.5512 63.4356 82.7571 62.4358 84.7024L62.4289 84.7157C61.9209 85.7014 61.301 86.6201 60.586 87.4548C59.1434 89.1391 57.3136 90.482 55.2346 91.3455C55.4614 91.6193 55.7031 91.8849 55.9596 92.1414C57.2953 93.4771 58.8806 94.411 60.5653 94.9432C61.5791 94.2886 62.5296 93.5445 63.4056 92.7219L63.4199 92.7084C63.6171 92.5229 63.8105 92.3333 64 92.14C64.1895 92.3333 64.3829 92.5229 64.5801 92.7084C65.46 93.5364 66.4153 94.2851 67.4347 94.9432C68.4605 95.6055 69.5512 96.1761 70.6952 96.6432C72.9904 97.5805 75.4999 98.1015 78.1298 98.1124C78.1577 98.1125 78.1856 98.1126 78.2135 98.1126C79.5877 98.1126 80.9294 97.9733 82.2252 97.708C89.9964 96.1172 96.1172 89.9964 97.708 82.2252C95.3963 83.9552 92.8297 85.1883 90.1558 85.9243C89.061 87.6164 87.6164 89.061 85.9243 90.1558C84.827 90.8658 83.6256 91.4286 82.348 91.8164C81.0397 92.2136 79.6516 92.4271 78.2135 92.4271C77.3494 92.4271 76.5034 92.35 75.6818 92.2023C74.6683 92.0201 73.6921 91.7304 72.7654 91.3455C70.6864 90.482 68.8566 89.1391 67.4139 87.4548C66.6957 86.6163 66.0735 85.6931 65.5642 84.7024C65.5075 84.5921 65.4523 84.4811 65.3984 84.3692C64.5022 82.5067 64 80.4188 64 78.2136Z" fill="#FAFAFA"/>
<path d="M53.9495 74.0505C52.2965 75.7035 50.3377 76.8642 48.2551 77.5327C48.1767 77.5579 48.0981 77.5824 48.0193 77.6061C47.0328 77.904 46.0203 78.0923 45.0009 78.171C42.7898 78.3419 40.5464 77.9976 38.4657 77.1381C38.4325 77.4921 38.4156 77.8508 38.4156 78.2136C38.4156 80.1025 38.8762 81.8839 39.6912 83.4515C40.8773 83.7069 42.0822 83.853 43.2899 83.8897C43.5605 83.898 43.8313 83.9007 44.102 83.898C44.0993 84.1687 44.102 84.4395 44.1103 84.7101C44.147 85.9178 44.2931 87.1227 44.5485 88.3088C44.8056 89.5026 45.1734 90.6773 45.652 91.8164C46.6122 94.1022 48.0183 96.2451 49.8702 98.1124C49.8898 98.1322 49.9095 98.152 49.9293 98.1717C50.901 99.1434 51.9482 99.9936 53.052 100.722C59.6719 105.093 68.3281 105.093 74.948 100.722C72.0901 100.311 69.4033 99.3681 66.9921 97.9978C65.0215 98.4202 62.9785 98.4202 61.0078 97.9978C59.7299 97.7239 58.4824 97.2724 57.3048 96.6432C56.0989 95.9989 54.9663 95.1684 53.9495 94.1515C53.3385 93.5405 52.7947 92.8877 52.3182 92.2023C51.7304 91.3568 51.245 90.4617 50.8619 89.5343C50.0024 87.4536 49.6581 85.2102 49.829 82.9991C49.914 81.8983 50.1268 80.8055 50.4673 79.7449C50.5052 79.6268 50.5446 79.5092 50.5857 79.392C51.2689 77.4413 52.3902 75.6098 53.9495 74.0505Z" fill="#FAFAFA"/>
<path d="M40.5451 67.414C41.3837 66.6957 42.3068 66.0735 43.2976 65.5642C43.4079 65.5076 43.5189 65.4523 43.6308 65.3985C45.4933 64.5022 47.5812 64 49.7864 64C47.4487 64 45.2429 63.4357 43.2976 62.4358L43.2971 62.4355L43.2843 62.4289C42.2986 61.9209 41.3799 61.301 40.5451 60.586C38.8608 59.1434 37.518 57.3136 36.6544 55.2346C36.3807 55.4614 36.1151 55.7031 35.8586 55.9596C34.5229 57.2953 33.589 58.8806 33.0568 60.5654C33.511 61.2689 34.0084 61.9419 34.5452 62.5807C34.7861 62.8674 35.0351 63.1473 35.2916 63.4199C35.4771 63.6171 35.6666 63.8105 35.86 64C35.6666 64.1895 35.4771 64.3829 35.2916 64.5801C34.4636 65.46 33.7149 66.4153 33.0568 67.4346C32.3945 68.4605 31.8239 69.5512 31.3568 70.6951C30.4194 72.9904 29.8984 75.4999 29.8876 78.1298C29.8875 78.1577 29.8874 78.1856 29.8874 78.2136C29.8874 79.5878 30.0267 80.9294 30.292 82.2252C31.8827 89.9964 38.0036 96.1173 45.7748 97.708C44.0448 95.3963 42.8117 92.8297 42.0757 90.1558C40.3836 89.0611 38.9389 87.6164 37.8441 85.9243C37.1342 84.827 36.5713 83.6256 36.1835 82.348C35.7864 81.0397 35.5729 79.6516 35.5729 78.2136C35.5729 77.3494 35.65 76.5034 35.7977 75.6818C35.9799 74.6683 36.2696 73.6921 36.6544 72.7654C37.518 70.6864 38.8608 68.8566 40.5451 67.414Z" fill="#FAFAFA"/>
<path d="M45.0009 49.8289C46.1017 49.914 47.1945 50.1268 48.2551 50.4673C48.3732 50.5052 48.4908 50.5446 48.608 50.5857C50.5587 51.2689 52.3902 52.3902 53.9495 53.9495C52.2965 52.2965 51.1358 50.3377 50.4673 48.2552C50.4421 48.1767 50.4176 48.0981 50.3938 48.0193C50.096 47.0328 49.9077 46.0203 49.829 45.0009C49.6581 42.7898 50.0024 40.5464 50.8619 38.4657C50.5079 38.4325 50.1491 38.4156 49.7864 38.4156C47.8975 38.4156 46.1161 38.8762 44.5485 39.6912C44.2931 40.8773 44.147 42.0823 44.1103 43.2899C44.102 43.5605 44.0993 43.8313 44.102 44.102C43.8313 44.0993 43.5605 44.102 43.2899 44.1103C42.0822 44.147 40.8773 44.2931 39.6912 44.5485C38.4974 44.8056 37.3227 45.1734 36.1835 45.652C33.8978 46.6122 31.7549 48.0183 29.8876 49.8702C29.8678 49.8899 29.848 49.9095 29.8283 49.9293C28.8566 50.901 28.0064 51.9482 27.2777 53.052C22.9074 59.6719 22.9074 68.3281 27.2777 74.948C27.689 72.0901 28.6319 69.4033 30.0022 66.9921C29.5798 65.0215 29.5798 62.9785 30.0022 61.0079C30.2761 59.7299 30.7276 58.4824 31.3568 57.3048C32.0011 56.0989 32.8316 54.9663 33.8485 53.9495C34.4595 53.3385 35.1123 52.7947 35.7977 52.3182C36.6432 51.7304 37.5383 51.245 38.4657 50.8619C40.5464 50.0024 42.7898 49.6581 45.0009 49.8289Z" fill="#FAFAFA"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

BIN
public/logo-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
public/logo-light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -1,11 +1,10 @@
<svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M100 150C127.614 150 150 127.614 150 100C150 72.3858 127.614 50 100 50C72.3858 50 50 72.3858 50 100C50 127.614 72.3858 150 100 150ZM100 125C113.807 125 125 113.807 125 100C125 86.1929 113.807 75 100 75C86.1929 75 75 86.1929 75 100C75 113.807 86.1929 125 100 125Z" fill="#FAFAFA"/>
<path d="M50 50C22.3858 50 2.00172e-06 72.3857 7.94663e-07 100C-4.12393e-07 127.614 22.3858 150 50 150V125C36.1929 125 25 113.807 25 100C25 86.1929 36.1929 75 50 75V50Z" fill="#D4D4D8"/>
<path d="M150 50C150 22.3858 127.614 2.41411e-06 100 0C72.3858 -2.41411e-06 50 22.3858 50 50L75 50C75 36.1929 86.1929 25 100 25C113.807 25 125 36.1929 125 50H150Z" fill="#D4D4D8"/>
<path d="M150 150C177.614 150 200 127.614 200 100C200 72.3858 177.614 50 150 50V75C163.807 75 175 86.1929 175 100C175 113.807 163.807 125 150 125V150Z" fill="#D4D4D8"/>
<path d="M50 150C50 177.614 72.3857 200 100 200C127.614 200 150 177.614 150 150H125C125 163.807 113.807 175 100 175C86.1929 175 75 163.807 75 150H50Z" fill="#D4D4D8"/>
<path d="M25 50C25 36.1929 36.1929 25 50 25V1.39091e-06C22.3858 1.83851e-07 2.00172e-06 22.3857 7.94663e-07 50H25Z" fill="#A1A1AA"/>
<path d="M150 25C163.807 25 175 36.1929 175 50H200C200 22.3858 177.614 3.24858e-06 150 8.34465e-07L150 25Z" fill="#A1A1AA"/>
<path d="M175 150C175 163.807 163.807 175 150 175V200C177.614 200 200 177.614 200 150H175Z" fill="#A1A1AA"/>
<path d="M50 175C36.1929 175 25 163.807 25 150H0C0 177.614 22.3857 200 50 200V175Z" fill="#A1A1AA"/>
<path d="M100 64.4661C100 58.6219 101.411 53.1072 103.911 48.2441L103.911 48.2429L103.928 48.2107C105.198 45.7464 106.747 43.4498 108.535 41.3629C112.141 37.1521 116.716 33.7949 121.914 31.6361C121.346 30.9518 120.742 30.2877 120.101 29.6465C116.762 26.3072 112.799 23.9724 108.587 22.642C106.178 24.1973 103.912 25.9549 101.813 27.891C101.691 28.0031 101.571 28.1157 101.45 28.229C100.957 28.6929 100.474 29.1667 100 29.6501C99.5262 29.1667 99.0427 28.6929 98.5497 28.229C96.3499 26.1591 93.9616 24.2873 91.4133 22.642C88.8486 20.9862 86.1219 19.5598 83.2621 18.392C77.5239 16.0487 71.2502 14.7462 64.6755 14.7191C64.6057 14.7188 64.5359 14.7186 64.4661 14.7186C61.0306 14.7186 57.6765 15.0669 54.4371 15.73C35.009 19.7068 19.7068 35.009 15.7299 54.4371C21.5092 50.112 27.9257 47.0293 34.6104 45.1892C37.3473 40.959 40.9589 37.3474 45.1892 34.6104C47.9325 32.8355 50.936 31.4284 54.1299 30.4589C57.4006 29.4661 60.871 28.9322 64.4661 28.9322C66.6264 28.9322 68.7416 29.125 70.7956 29.4943C73.3293 29.9498 75.7698 30.6739 78.0864 31.6362C83.2841 33.795 87.8585 37.1521 91.4651 41.3629C93.2606 43.4592 94.8163 45.7672 96.0894 48.2441C96.2311 48.5197 96.3692 48.7973 96.5039 49.0771C98.7445 53.7333 100 58.9531 100 64.4661Z" fill="#FAFAFA"/>
<path d="M125.126 74.8737C129.259 70.7413 134.156 67.8394 139.362 66.1682C139.558 66.1053 139.755 66.0441 139.952 65.9846C142.418 65.2401 144.949 64.7693 147.498 64.5724C153.025 64.1451 158.634 65.0059 163.836 67.1547C163.919 66.2697 163.961 65.3729 163.961 64.4661C163.961 59.7437 162.81 55.2903 160.772 51.3713C157.934 50.7602 155.053 50.3994 152.163 50.289C152.034 50.2841 151.905 50.2796 151.775 50.2757C151.099 50.2551 150.422 50.2482 149.745 50.2551C149.752 49.5783 149.745 48.9014 149.724 48.2248C149.632 45.2056 149.267 42.1933 148.629 39.228C147.986 36.2436 147.067 33.3069 145.87 30.4589C143.47 24.7444 139.954 19.3872 135.325 14.7191C135.275 14.6695 135.226 14.6201 135.177 14.5707C132.748 12.1414 130.13 10.0159 127.37 8.1942C110.82 -2.7314 89.1798 -2.7314 72.63 8.19421C79.7748 9.2225 86.4918 11.5799 92.5196 15.0055C97.4462 13.9496 102.554 13.9496 107.48 15.0055C110.675 15.6902 113.794 16.8191 116.738 18.3919C119.753 20.0027 122.584 22.0791 125.126 24.6212C126.654 26.1487 128.013 27.7808 129.204 29.4942C130.674 31.608 131.888 33.8457 132.845 36.1642C134.994 41.366 135.855 46.9746 135.428 52.5022C135.215 55.2542 134.683 57.9862 133.832 60.6379C133.737 60.9329 133.638 61.2269 133.536 61.5199C131.828 66.3968 129.025 70.9754 125.126 74.8737Z" fill="#FAFAFA"/>
<path d="M135.534 100C141.378 100 146.893 101.411 151.756 103.911L151.789 103.928C154.254 105.198 156.55 106.747 158.637 108.535C162.848 112.141 166.205 116.716 168.364 121.914C169.048 121.346 169.712 120.742 170.354 120.101C173.693 116.762 176.028 112.799 177.358 108.587C175.713 106.038 173.841 103.65 171.771 101.45C171.307 100.957 170.833 100.474 170.35 100C170.833 99.5263 171.307 99.0427 171.771 98.5497C173.841 96.3499 175.713 93.9616 177.358 91.4133C179.014 88.8486 180.44 86.1218 181.608 83.262C183.951 77.5238 185.254 71.2501 185.281 64.6754C185.281 64.6057 185.281 64.5359 185.281 64.4661C185.281 61.0306 184.933 57.6764 184.27 54.437C180.293 35.009 164.991 19.7069 145.563 15.73C149.888 21.5092 152.971 27.9258 154.811 34.6104C159.041 37.3474 162.653 40.959 165.39 45.1892C167.165 47.9325 168.572 50.936 169.541 54.1299C170.534 57.4006 171.068 60.871 171.068 64.4661C171.068 66.6264 170.875 68.7416 170.506 70.7955C170.05 73.3293 169.326 75.7697 168.364 78.0864C166.205 83.2841 162.848 87.8586 158.637 91.4651C156.541 93.2607 154.233 94.8163 151.756 96.0894C151.48 96.2311 151.203 96.3693 150.923 96.5039C146.267 98.7445 141.047 100 135.534 100Z" fill="#FAFAFA"/>
<path d="M125.126 125.126C129.259 129.259 132.161 134.156 133.832 139.362C133.895 139.558 133.956 139.755 134.015 139.952C134.76 142.418 135.231 144.949 135.428 147.498C135.855 153.025 134.994 158.634 132.845 163.836C133.73 163.919 134.627 163.961 135.534 163.961C140.256 163.961 144.71 162.81 148.629 160.772C149.24 157.934 149.601 155.052 149.711 152.163C149.716 152.034 149.72 151.905 149.724 151.775C149.745 151.099 149.752 150.422 149.745 149.745C150.422 149.752 151.099 149.745 151.775 149.724C154.794 149.632 157.807 149.267 160.772 148.629C163.756 147.986 166.693 147.066 169.541 145.87C175.256 143.47 180.613 139.954 185.281 135.325C185.33 135.275 185.38 135.226 185.429 135.177C187.859 132.748 189.984 130.13 191.806 127.37C202.731 110.82 202.731 89.1797 191.806 72.6299C190.777 79.7747 188.42 86.4917 184.995 92.5196C186.05 97.4462 186.05 102.554 184.995 107.48C184.31 110.675 183.181 113.794 181.608 116.738C179.997 119.753 177.921 122.584 175.379 125.126C173.851 126.654 172.219 128.013 170.506 129.204C168.392 130.674 166.154 131.888 163.836 132.845C158.634 134.994 153.025 135.855 147.498 135.428C144.746 135.215 142.014 134.683 139.362 133.832C139.067 133.737 138.773 133.638 138.48 133.536C133.603 131.828 129.025 129.025 125.126 125.126Z" fill="#FAFAFA"/>
<path d="M100 135.534C100 141.378 98.5891 146.893 96.0894 151.756L96.0723 151.789C94.8023 154.254 93.2526 156.55 91.4651 158.637C87.8585 162.848 83.284 166.205 78.0864 168.364C78.6536 169.048 79.2578 169.712 79.899 170.354C83.2382 173.693 87.2014 176.028 91.4133 177.358C93.9478 175.722 96.324 173.861 98.514 171.805L98.5497 171.771C99.0427 171.307 99.5262 170.833 100 170.35C100.474 170.833 100.957 171.307 101.45 171.771C103.65 173.841 106.038 175.713 108.587 177.358C111.151 179.014 113.878 180.44 116.738 181.608C122.476 183.951 128.75 185.254 135.325 185.281C135.394 185.281 135.464 185.281 135.534 185.281C138.969 185.281 142.324 184.933 145.563 184.27C164.991 180.293 180.293 164.991 184.27 145.563C178.491 149.888 172.074 152.971 165.39 154.811C162.653 159.041 159.041 162.653 154.811 165.39C152.068 167.164 149.064 168.572 145.87 169.541C142.599 170.534 139.129 171.068 135.534 171.068C133.374 171.068 131.258 170.875 129.204 170.506C126.671 170.05 124.23 169.326 121.914 168.364C116.716 166.205 112.141 162.848 108.535 158.637C106.739 156.541 105.184 154.233 103.911 151.756C103.769 151.48 103.631 151.203 103.496 150.923C101.255 146.267 100 141.047 100 135.534Z" fill="#FAFAFA"/>
<path d="M74.8737 125.126C70.7413 129.259 65.8442 132.161 60.6379 133.832C60.4418 133.895 60.2453 133.956 60.0483 134.015C57.582 134.76 55.0507 135.231 52.5022 135.428C46.9745 135.855 41.366 134.994 36.1642 132.845C36.0813 133.73 36.0389 134.627 36.0389 135.534C36.0389 140.256 37.1904 144.71 39.2279 148.629C42.1932 149.267 45.2056 149.632 48.2247 149.724C48.9013 149.745 49.5783 149.752 50.2551 149.745C50.2483 150.422 50.2551 151.099 50.2757 151.775C50.3676 154.794 50.7328 157.807 51.3714 160.772C52.014 163.756 52.9335 166.693 54.1299 169.541C56.5304 175.256 60.0456 180.613 64.6755 185.281C64.7246 185.33 64.7739 185.38 64.8232 185.429C67.2525 187.859 69.8705 189.984 72.63 191.806C89.1798 202.731 110.82 202.731 127.37 191.806C120.225 190.778 113.508 188.42 107.48 184.995C102.554 186.05 97.4462 186.05 92.5196 184.994C89.3248 184.31 86.206 183.181 83.2621 181.608C80.2473 179.997 77.4159 177.921 74.8737 175.379C73.3462 173.851 71.9868 172.219 70.7956 170.506C69.3261 168.392 68.1125 166.154 67.1547 163.836C65.0059 158.634 64.1451 153.025 64.5724 147.498C64.7851 144.746 65.317 142.014 66.1682 139.362C66.2629 139.067 66.3616 138.773 66.4642 138.48C68.1723 133.603 70.9755 129.025 74.8737 125.126Z" fill="#FAFAFA"/>
<path d="M41.3629 108.535C43.4592 106.739 45.7671 105.184 48.2441 103.911C48.5197 103.769 48.7973 103.631 49.0771 103.496C53.7333 101.255 58.9531 100 64.4661 100C58.6219 100 53.1072 98.5891 48.2441 96.0894L48.2428 96.0888L48.2107 96.0723C45.7464 94.8023 43.4498 93.2526 41.3629 91.4651C37.1521 87.8586 33.7949 83.2841 31.6361 78.0864C30.9517 78.6536 30.2877 79.2578 29.6465 79.899C26.3072 83.2382 23.9724 87.2015 22.642 91.4134C23.7775 93.1722 25.021 94.8547 26.363 96.4517C26.9654 97.1686 27.5877 97.8682 28.2289 98.5498C28.6928 99.0427 29.1666 99.5263 29.6501 100C29.1666 100.474 28.6928 100.957 28.2289 101.45C26.1591 103.65 24.2873 106.038 22.642 108.587C20.9862 111.151 19.5598 113.878 18.3919 116.738C16.0486 122.476 14.7461 128.75 14.719 135.324C14.7187 135.394 14.7186 135.464 14.7186 135.534C14.7186 138.969 15.0668 142.324 15.7299 145.563C19.7068 164.991 35.009 180.293 54.437 184.27C50.112 178.491 47.0293 172.074 45.1892 165.39C40.959 162.653 37.3474 159.041 34.6104 154.811C32.8354 152.067 31.4283 149.064 30.4588 145.87C29.466 142.599 28.9321 139.129 28.9321 135.534C28.9321 133.374 29.1249 131.258 29.4942 129.204C29.9498 126.671 30.6739 124.23 31.6361 121.914C33.7949 116.716 37.1521 112.141 41.3629 108.535Z" fill="#FAFAFA"/>
<path d="M52.5022 64.5724C55.2542 64.7851 57.9862 65.317 60.6379 66.1682C60.9329 66.2629 61.227 66.3616 61.5199 66.4642C66.3968 68.1723 70.9755 70.9754 74.8737 74.8737C70.7413 70.7413 67.8394 65.8442 66.1682 60.6379C66.1053 60.4418 66.0441 60.2453 65.9846 60.0483C65.2401 57.582 64.7694 55.0507 64.5724 52.5022C64.1451 46.9746 65.0059 41.366 67.1547 36.1642C66.2697 36.0813 65.3729 36.039 64.4661 36.039C59.7437 36.039 55.2903 37.1904 51.3714 39.2279C50.7328 42.1933 50.3676 45.2056 50.2757 48.2248C50.2551 48.9014 50.2483 49.5783 50.2551 50.2551C49.5783 50.2482 48.9014 50.2551 48.2248 50.2757C45.2056 50.3676 42.1933 50.7328 39.2279 51.3714C36.2435 52.014 33.3068 52.9335 30.4589 54.1299C24.7444 56.5305 19.3872 60.0457 14.719 64.6755C14.6695 64.7246 14.6201 64.7739 14.5707 64.8232C12.1414 67.2525 10.0159 69.8705 8.19417 72.63C-2.73139 89.1798 -2.73139 110.82 8.19418 127.37C9.22247 120.225 11.5798 113.508 15.0055 107.48C13.9496 102.554 13.9496 97.4463 15.0055 92.5197C15.6902 89.3248 16.8191 86.2061 18.3919 83.2621C20.0027 80.2473 22.0791 77.4159 24.6212 74.8737C26.1487 73.3462 27.7807 71.9868 29.4942 70.7956C31.6079 69.3261 33.8457 68.1125 36.1642 67.1547C41.366 65.0059 46.9745 64.1451 52.5022 64.5724Z" fill="#FAFAFA"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/sounds/alarm.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

156
src/components/about.astro Normal file
View File

@@ -0,0 +1,156 @@
---
import { Container } from '@/components/container';
import { count as soundCount } from '@/lib/sounds';
const count = soundCount();
const paragraphs = [
{
body: 'Craving a calming escape from the daily grind? Do you need the perfect soundscape to boost your focus or lull you into peaceful sleep? Look no further than Moodist, your free and open-source ambient sound generator! Ditch the subscriptions and registrations with Moodist, you unlock a world of soothing and immersive audio experiences, entirely for free.',
title: 'Free Ambient Sounds',
},
{
body: `Dive into an expansive library of ${count} carefully curated sounds. Nature lovers will find solace in the gentle murmur of streams, the rhythmic crash of waves, or the crackling warmth of a campfire. Cityscapes come alive with the soft hum of cafes, the rhythmic clatter of trains, or the calming white noise of traffic. And for those seeking deeper focus or relaxation, Moodist offers binaural beats and color noise designed to enhance your state of mind.`,
title: 'Carefully Curated Sounds',
},
{
body: 'The beauty of Moodist lies in its simplicity and customization. No complex menus or confusing options just choose your desired sounds, adjust the volume balance, and hit play. Want to blend the gentle chirping of birds with the soothing sound of rain? No problem! Layer as many sounds as you like to create your personalized soundscape oasis.',
title: 'Create Your Soundscape',
},
{
body: "Whether you're looking to unwind after a long day, enhance your focus during work, or lull yourself into a peaceful sleep, Moodist has the perfect soundscape waiting for you. The best part? It's completely free and open-source, so you can enjoy its benefits without any strings attached. Start using Moodist today and discover your new haven of tranquility and focus!",
title: 'Sounds for Every Moment',
},
];
---
<section class="about">
<div class="effect"></div>
<Container tight>
{
paragraphs.map((paragraph, index) => (
<div class="paragraph">
<div class="counter">
<span>0{index + 1}</span> / 0{paragraphs.length}
</div>
<h2 class="title">{paragraph.title}</h2>
<p class="body">{paragraph.body}</p>
</div>
))
}
<button class="button" id="use-moodist"> Use Moodist</button>
</Container>
</section>
<script lang="ts">
const button = document.getElementById('use-moodist');
button.addEventListener('click', () => {
const app = document.getElementById('app');
app?.scrollIntoView();
});
</script>
<style>
.about {
padding-top: 10px;
& .effect {
position: sticky;
top: 0;
height: 80px;
background: linear-gradient(var(--color-neutral-50), transparent);
}
& .paragraph {
padding: 30px 0;
background: linear-gradient(
transparent,
var(--color-neutral-50) 10%,
var(--color-neutral-50) 90%,
transparent
);
&:last-of-type {
padding-bottom: 0;
}
& .counter {
width: max-content;
padding: 6px 16px;
margin-bottom: 16px;
font-size: var(--font-xsm);
color: var(--color-foreground-subtle);
background: linear-gradient(var(--color-neutral-100), transparent);
border: 1px solid var(--color-neutral-300);
border-radius: 20px 20px 20px 8px;
& span {
font-weight: 500;
color: var(--color-foreground);
}
}
& .title {
margin-bottom: 8px;
font-family: var(--font-heading);
font-size: var(--font-md);
font-weight: 600;
}
& .body {
line-height: 1.6;
color: var(--color-foreground-subtle);
}
}
.button {
position: relative;
display: flex;
align-items: center;
justify-content: center;
padding: 10px 16px;
margin-top: 20px;
font-size: var(--font-xsm);
font-weight: 500;
color: var(--color-foreground);
cursor: pointer;
background-color: transparent;
border: 1px solid var(--color-neutral-200);
border-radius: 50px;
outline: none;
transition: 0.2s;
&::before {
position: absolute;
top: -1px;
left: 50%;
width: 70%;
height: 1px;
content: '';
background: linear-gradient(
90deg,
transparent,
var(--color-neutral-300),
transparent
);
transform: translateX(-50%);
}
&:hover,
&:focus-visible {
background-color: var(--color-neutral-100);
}
&:focus-visible {
outline: 2px solid var(--color-neutral-400);
outline-offset: 2px;
}
}
}
</style>

View File

@@ -1,25 +1,103 @@
import { useMemo } from 'react';
import { useMemo, useEffect } from 'react';
import { useShallow } from 'zustand/react/shallow';
import { BiSolidHeart } from 'react-icons/bi/index';
import { Howler } from 'howler';
import { useSoundStore } from '@/store';
import { useSoundStore } from '@/stores/sound';
import { Container } from '@/components/container';
import { StoreConsumer } from '@/components/store-consumer';
import { Buttons } from '@/components/buttons';
import { Categories } from '@/components/categories';
import { ScrollToTop } from '@/components/scroll-to-top';
import { Shuffle } from '@/components/shuffle';
import { SharedModal } from '@/components/modals/shared';
import { Toolbar } from '@/components/toolbar';
import { SnackbarProvider } from '@/contexts/snackbar';
import { MediaControls } from '@/components/media-controls';
import { sounds } from '@/data/sounds';
import { FADE_OUT } from '@/constants/events';
import type { Sound } from '@/data/types';
import { subscribe } from '@/lib/event';
/**
* =========================================
*/
declare global {
interface Window {
__howlerStreamPatched?: boolean;
}
}
/**
* Patches Howler's master gain node to route its output into a hidden HTML audio element.
* An intermediate splitter node is used in an attempt to reduce the banging noise observed on iOS.
* Also adds a listener to resume the AudioContext when the document becomes visible.
*/
export function setupAudioStream(): void {
if (
typeof window !== 'undefined' &&
Howler.ctx &&
!window.__howlerStreamPatched
) {
const audioCtx = Howler.ctx;
// Create a MediaStream destination node to capture the output.
const streamDestination = audioCtx.createMediaStreamDestination();
// Create a splitter gain node to help split the signal cleanly.
const splitter = audioCtx.createGain();
// Disconnect the master gain.
Howler.masterGain.disconnect();
// Reconnect masterGain: one branch to the AudioContext's default destination,
// and one branch through the splitter to the MediaStream destination.
Howler.masterGain.connect(audioCtx.destination);
Howler.masterGain.connect(splitter);
splitter.connect(streamDestination);
// Create a hidden HTML audio element to play the captured stream.
const audioElement = document.createElement('audio');
audioElement.setAttribute('playsinline', 'true'); // crucial for iOS playback
audioElement.srcObject = streamDestination.stream;
audioElement.style.display = 'none';
document.body.appendChild(audioElement);
// Attempt to start playback (must be triggered by a user gesture).
audioElement.play().catch((err: unknown) => {
console.error('Failed to play background stream:', err);
});
// Listen for visibility changes: if the document becomes visible and the AudioContext is suspended, resume it.
document.addEventListener('visibilitychange', () => {
if (
document.visibilityState === 'visible' &&
audioCtx.state === 'suspended'
) {
audioCtx
.resume()
.catch((err: unknown) =>
console.error('Error resuming AudioContext:', err),
);
}
});
window.__howlerStreamPatched = true;
}
}
/**
* =========================================
*/
export function App() {
const categories = useMemo(() => sounds.categories, []);
const favorites = useSoundStore(useShallow(state => state.getFavorites()));
const pause = useSoundStore(state => state.pause);
const lock = useSoundStore(state => state.lock);
const unlock = useSoundStore(state => state.unlock);
const favoriteSounds = useMemo(() => {
const favoriteSounds = categories
@@ -35,6 +113,35 @@ export function App() {
);
}, [favorites, categories]);
useEffect(() => {
const onChange = () => {
const { ctx } = Howler;
if (ctx && !document.hidden) {
setTimeout(() => {
ctx.resume();
}, 100);
}
};
document.addEventListener('visibilitychange', onChange, false);
return () => document.removeEventListener('visibilitychange', onChange);
}, []);
useEffect(() => {
const unsubscribe = subscribe(FADE_OUT, (e: { duration: number }) => {
lock();
setTimeout(() => {
pause();
unlock();
}, e.duration);
});
return unsubscribe;
}, [pause, lock, unlock]);
const allCategories = useMemo(() => {
const favorites = [];
@@ -50,17 +157,31 @@ export function App() {
return [...favorites, ...categories];
}, [favoriteSounds, categories]);
useEffect(() => {
const handleUserInteraction = () => {
setupAudioStream();
document.removeEventListener('click', handleUserInteraction);
};
document.addEventListener('click', handleUserInteraction);
return () => {
document.removeEventListener('click', handleUserInteraction);
};
}, []);
return (
<SnackbarProvider>
<StoreConsumer>
<MediaControls />
<Container>
<div id="app" />
<Buttons />
<Categories categories={allCategories} />
</Container>
<ScrollToTop />
<Shuffle />
<Toolbar />
<SharedModal />
</StoreConsumer>
</SnackbarProvider>
);

17
src/components/binary.tsx Normal file
View File

@@ -0,0 +1,17 @@
import { useState, useEffect } from 'react';
import { generateRandomBinaryString } from '@/helpers/binary';
export function Binary() {
const [binary, setBinary] = useState('');
useEffect(() => {
setBinary(generateRandomBinaryString(1000));
setInterval(() => {
setBinary(generateRandomBinaryString(1000));
}, 200);
}, []);
return <span>{binary}</span>;
}

View File

@@ -12,7 +12,6 @@
background-color: var(--color-neutral-950);
border: 1px solid var(--color-neutral-50);
border-radius: 100px;
outline: none;
transition: 0.2s;
&:hover {
@@ -27,4 +26,9 @@
& span {
font-size: var(--font-lg);
}
&:focus-visible {
outline: 2px solid var(--color-neutral-400);
outline-offset: 2px;
}
}

View File

@@ -1,7 +1,8 @@
import { useEffect } from 'react';
import { useCallback, useEffect } from 'react';
import { BiPause, BiPlay } from 'react-icons/bi/index';
import { useHotkeys } from 'react-hotkeys-hook';
import { useSoundStore } from '@/store';
import { useSoundStore } from '@/stores/sound';
import { useSnackbar } from '@/contexts/snackbar';
import { cn } from '@/helpers/styles';
@@ -12,35 +13,40 @@ export function PlayButton() {
const pause = useSoundStore(state => state.pause);
const toggle = useSoundStore(state => state.togglePlay);
const noSelected = useSoundStore(state => state.noSelected());
const locked = useSoundStore(state => state.locked);
const showSnackbar = useSnackbar();
const handleClick = () => {
const handleToggle = useCallback(() => {
if (locked) return;
if (noSelected) return showSnackbar('Please first select a sound to play.');
toggle();
};
}, [showSnackbar, toggle, noSelected, locked]);
useEffect(() => {
if (isPlaying && noSelected) pause();
}, [isPlaying, pause, noSelected]);
useHotkeys('shift+space', handleToggle, {}, [handleToggle]);
return (
<button
aria-disabled={noSelected}
className={cn(styles.playButton, noSelected && styles.disabled)}
onClick={handleClick}
onClick={handleToggle}
>
{isPlaying ? (
<>
<span>
<span aria-hidden="true">
<BiPause />
</span>{' '}
Pause
</>
) : (
<>
<span>
<span aria-hidden="true">
<BiPlay />
</span>{' '}
Play

View File

@@ -12,7 +12,6 @@
background-color: var(--color-neutral-100);
border: 1px solid var(--color-neutral-300);
border-radius: 100px;
outline: none;
transition: 0.2s;
&:disabled,
@@ -20,9 +19,15 @@
cursor: not-allowed;
}
&:hover {
&:hover,
&:focus-visible {
background-color: var(--color-neutral-200);
}
&:focus-visible {
outline: 2px solid var(--color-neutral-400);
outline-offset: 2px;
}
}
.tooltip {

View File

@@ -1,9 +1,11 @@
import { useCallback } from 'react';
import { BiUndo, BiTrash } from 'react-icons/bi/index';
import { AnimatePresence, motion } from 'framer-motion';
import { useHotkeys } from 'react-hotkeys-hook';
import { Tooltip } from '@/components/tooltip';
import { useSoundStore } from '@/store';
import { useSoundStore } from '@/stores/sound';
import { cn } from '@/helpers/styles';
import { fade, mix, slideX } from '@/lib/motion';
@@ -14,12 +16,21 @@ export function UnselectButton() {
const restoreHistory = useSoundStore(state => state.restoreHistory);
const hasHistory = useSoundStore(state => !!state.history);
const unselectAll = useSoundStore(state => state.unselectAll);
const locked = useSoundStore(state => state.locked);
const variants = {
...mix(fade(), slideX(15)),
exit: { opacity: 0 },
};
const handleToggle = useCallback(() => {
if (locked) return;
if (hasHistory) restoreHistory();
else if (!noSelected) unselectAll(true);
}, [hasHistory, noSelected, unselectAll, restoreHistory, locked]);
useHotkeys('shift+r', handleToggle, {}, [handleToggle]);
return (
<>
<AnimatePresence mode="wait">
@@ -31,7 +42,6 @@ export function UnselectButton() {
variants={variants}
>
<Tooltip
hideDelay={0}
showDelay={0}
content={
hasHistory
@@ -50,10 +60,7 @@ export function UnselectButton() {
styles.unselectButton,
noSelected && !hasHistory && styles.disabled,
)}
onClick={() => {
if (hasHistory) restoreHistory();
else if (!noSelected) unselectAll(true);
}}
onClick={handleToggle}
>
{hasHistory ? <BiUndo /> : <BiTrash />}
</button>

View File

@@ -1,6 +1,7 @@
import { AnimatePresence } from 'framer-motion';
import { Category } from '@/components/category';
import { Category } from './category';
import { Donate } from './donate';
import type { Categories } from '@/data/types';
@@ -11,12 +12,12 @@ interface CategoriesProps {
export function Categories({ categories }: CategoriesProps) {
return (
<AnimatePresence initial={false}>
{categories.map(category => (
<Category
functional={category.id !== 'favorites'}
{...category}
key={category.id}
/>
{categories.map((category, index) => (
<div key={category.id}>
<Category functional={category.id !== 'favorites'} {...category} />
{index === 3 && <Donate />}
</div>
))}
</AnimatePresence>
);

View File

@@ -22,7 +22,10 @@
width: 45px;
height: 45px;
font-size: var(--font-md);
background-color: var(--color-neutral-100);
background: linear-gradient(
var(--color-neutral-50),
var(--color-neutral-100)
);
border: 1px solid var(--color-neutral-300);
border-radius: 50%;
}

View File

@@ -16,13 +16,15 @@ export function Category({
title,
}: CategoryProps) {
return (
<div className={styles.category}>
<div className={styles.category} id={`category-${id}`}>
<div className={styles.iconContainer}>
<div className={styles.tail} />
<div className={styles.icon}>{icon}</div>
<div aria-hidden="true" className={styles.icon}>
{icon}
</div>
</div>
<h2 className={styles.title}>{title}</h2>
<div className={styles.title}>{title}</div>
<Sounds functional={functional} id={id} sounds={sounds} />
</div>

View File

@@ -0,0 +1,58 @@
.donate {
margin-bottom: 20px;
& .iconContainer {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 15px;
& .tail {
width: 1px;
height: 75px;
background: linear-gradient(transparent, var(--color-neutral-300));
}
& .icon {
display: flex;
align-items: center;
justify-content: center;
width: 45px;
height: 45px;
font-size: var(--font-md);
background: linear-gradient(
var(--color-neutral-50),
var(--color-neutral-100)
);
border: 1px solid var(--color-neutral-300);
border-radius: 50%;
}
}
& .title {
font-family: var(--font-display);
font-size: var(--font-lg);
font-weight: 600;
text-align: center;
& span {
background: linear-gradient(
135deg,
var(--color-foreground),
var(--color-foreground-subtle)
);
background-clip: text;
-webkit-text-fill-color: transparent;
}
}
& .desc {
margin-top: 8px;
color: var(--color-foreground-subtle);
text-align: center;
}
.button {
margin: 16px auto 0;
}
}

View File

@@ -0,0 +1,29 @@
import { FaCoffee } from 'react-icons/fa/index';
import { SpecialButton } from '@/components/special-button';
import styles from './donate.module.css';
export function Donate() {
return (
<div className={styles.donate}>
<div className={styles.iconContainer}>
<div className={styles.tail} />
<div aria-hidden="true" className={styles.icon}>
<FaCoffee />
</div>
</div>
<div className={styles.title}>
<span>Support Me</span>
</div>
<p className={styles.desc}>Help me keep Moodist ad-free.</p>
<SpecialButton
className={styles.button}
href="https://buymeacoffee.com/remvze"
>
Donate Today
</SpecialButton>
</div>
);
}

View File

@@ -0,0 +1 @@
export { Donate } from './donate';

View File

@@ -0,0 +1,23 @@
.checkboxRoot {
display: flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
cursor: pointer;
background: var(--color-neutral-100);
border: 2px solid var(--color-neutral-300);
border-radius: 4px;
transition: 0.2s;
}
.checkboxRoot[data-state='checked'] {
background: var(--color-neutral-950);
border: 2px solid var(--color-neutral-950);
}
.checkboxIndicator {
font-size: var(--font-2xsm);
color: var(--color-neutral-50);
transform: translateY(2px);
}

View File

@@ -0,0 +1,38 @@
import * as RadixCheckbox from '@radix-ui/react-checkbox';
import { FaCheck } from 'react-icons/fa6/index';
import styles from './checkbox.module.css';
type CheckboxInputProps = {
checked?: boolean;
className?: string;
defaultChecked?: boolean;
disabled?: boolean;
onChange?: (checked: boolean) => void;
};
export function Checkbox({
checked,
className,
defaultChecked = false,
disabled = false,
onChange,
}: CheckboxInputProps) {
const handleCheckedChange = (checked: boolean) => {
if (onChange) onChange(checked);
};
return (
<RadixCheckbox.Root
checked={checked}
className={`${styles.checkboxRoot} ${className}`}
defaultChecked={defaultChecked}
disabled={disabled}
onCheckedChange={handleCheckedChange}
>
<RadixCheckbox.Indicator className={styles.checkboxIndicator}>
<FaCheck />
</RadixCheckbox.Indicator>
</RadixCheckbox.Root>
);
}

View File

@@ -0,0 +1 @@
export { Checkbox } from './checkbox';

59
src/components/cipher.tsx Normal file
View File

@@ -0,0 +1,59 @@
import { useState, useEffect } from 'react';
interface CipherTextProps {
interval?: number;
text: string;
}
const chars = '-_~`!@#$%^&*()+=[]{}|;:,.<>?';
export function CipherText({ interval = 50, text }: CipherTextProps) {
const [outputText, setOutputText] = useState('');
const [isMounted, setIsMounted] = useState(false);
useEffect(() => {
setIsMounted(true);
}, []);
useEffect(() => {
let timer: NodeJS.Timeout;
if (outputText !== text) {
timer = setInterval(() => {
if (outputText.length < text.length) {
setOutputText(prev => prev + text[prev.length]);
} else {
clearInterval(timer);
}
}, interval);
}
return () => clearInterval(timer);
}, [text, interval, outputText]);
useEffect(() => {
if (outputText === text) {
setTimeout(() => setOutputText(''), 6000);
}
}, [outputText, text]);
const remainder =
outputText.length < text.length
? text
.slice(outputText.length)
.split('')
.map(() => chars[Math.floor(Math.random() * chars.length)])
.join('')
: '';
if (!isMounted) {
return <span>{text}</span>;
}
return (
<span className="text-white">
{outputText}
{remainder}
</span>
);
}

View File

@@ -2,4 +2,12 @@
width: 90%;
max-width: 600px;
margin: 0 auto;
&.tight {
max-width: 450px;
}
&.wide {
max-width: 760px;
}
}

View File

@@ -1,9 +1,30 @@
import { cn } from '@/helpers/styles';
import styles from './container.module.css';
interface ContainerProps {
children: React.ReactNode;
className?: string;
tight?: boolean;
wide?: boolean;
}
export function Container({ children }: ContainerProps) {
return <div className={styles.container}>{children}</div>;
export function Container({
children,
className,
tight,
wide,
}: ContainerProps) {
return (
<div
className={cn(
styles.container,
className,
tight && styles.tight,
wide && styles.wide,
)}
>
{children}
</div>
);
}

View File

@@ -0,0 +1,57 @@
---
import { Container } from './container';
---
<Container>
<section class="wrapper">
<p class="text">
Enjoy Moodist?{' '}
<a
href="https://buymeacoffee.com/remvze"
rel="noreferrer"
target="_blank"
>
Support with a donation!
</a>
</p>
</section>
</Container>
<style>
.wrapper {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
padding: 16px;
font-size: var(--font-xsm);
color: var(--color-foreground-subtle);
&::after {
position: absolute;
bottom: 0;
left: 50%;
width: 80%;
height: 1px;
content: '';
background: linear-gradient(
90deg,
transparent,
var(--color-neutral-200),
transparent
);
transform: translateX(-50%);
}
& .text {
text-align: center;
& a {
font-weight: 500;
color: var(--color-foreground);
text-decoration: none;
}
}
}
</style>

View File

@@ -0,0 +1,99 @@
.featuresSection {
margin-top: 40px;
& .iconContainer {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 15px;
& .tail {
width: 1px;
height: 75px;
background: linear-gradient(transparent, var(--color-neutral-300));
}
& .icon {
display: flex;
align-items: center;
justify-content: center;
width: 45px;
height: 45px;
font-size: var(--font-md);
background-color: var(--color-neutral-100);
border: 1px solid var(--color-neutral-300);
border-radius: 50%;
}
}
& .title {
margin-bottom: 8px;
font-family: var(--font-display);
font-size: var(--font-lg);
font-weight: 600;
text-align: center;
}
& .features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
row-gap: 32px;
column-gap: 20px;
margin-top: 24px;
& .icon {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
margin: 0 auto;
margin-bottom: 12px;
font-size: var(--font-md);
color: var(--color-foreground-subtle);
background: linear-gradient(var(--color-neutral-100), transparent);
border: 1px solid var(--color-neutral-200);
border-radius: 12px;
}
& .label {
margin-bottom: 8px;
font-family: var(--font-heading);
font-weight: 600;
text-align: center;
}
& .body {
width: 100%;
max-width: 275px;
margin: 0 auto;
line-height: 1.6;
color: var(--color-foreground-subtle);
text-align: center;
}
& .link {
display: block;
margin-top: 8px;
font-size: var(--font-sm);
font-weight: 500;
color: var(--color-foreground);
text-align: center;
text-decoration: none;
}
& .soon {
display: flex;
width: max-content;
padding: 6px 12px;
margin: 0 auto;
margin-top: 8px;
font-size: var(--font-2xsm);
font-weight: 500;
line-height: 1;
background: linear-gradient(var(--color-neutral-100), transparent);
border: 1px solid var(--color-neutral-300);
border-radius: 100px;
}
}
}

View File

@@ -0,0 +1,107 @@
import { BiMoney, BiUserCircle, BiLogoGithub } from 'react-icons/bi/index';
import { BsSoundwave, BsStars } from 'react-icons/bs/index';
import { RxMixerHorizontal } from 'react-icons/rx/index';
import { Balancer } from 'react-wrap-balancer';
import { Container } from '@/components/container';
import { count as soundCount } from '@/lib/sounds';
import styles from './features.module.css';
export function Features() {
const count = soundCount();
const features = [
{
Icon: BiMoney,
body: 'Immerse yourself in sound without spending a dime.',
id: 'free-access',
label: 'Free Access',
},
{
Icon: BiUserCircle,
body: 'Dive right in, no sign-up hoops to jump through.',
id: 'no-registration',
label: 'No Registration',
},
{
Icon: BsSoundwave,
body: `Explore ${count} unique soundscapes, from rainforests to cityscapes.`,
id: 'diverse-sounds',
label: 'Diverse Sounds',
},
{
Icon: RxMixerHorizontal,
body: 'Craft your perfect soundscape by blending and adjusting sounds.',
id: 'customizable-mixes',
label: 'Customizable Mixes',
},
{
Icon: BiLogoGithub,
body: 'Contribute and collaborate, making the best even better.',
id: 'open-source',
label: 'Open-Source',
link: {
label: 'Source Code',
url: 'https://github.com/remvze/moodist',
},
},
{
Icon: BsStars,
body: 'Uninterrupted immersion, focus on the sounds, not the tech.',
id: 'seamless-experience',
label: 'Seamless Experience',
},
{
Icon: BsStars,
body: 'Spread the calm, easily share your customized sound blends.',
id: 'share-selections',
label: 'Share Selections',
},
{
Icon: BsStars,
body: 'Lock in your favorite mixes for instant return to your sonic haven.',
id: 'save-presets',
label: 'Save Presets',
soon: true,
},
];
return (
<section className={styles.featuresSection}>
<Container>
<div className={styles.iconContainer}>
<div className={styles.tail} />
<div className={styles.icon}>
<BsStars />
</div>
</div>
<h2 className={styles.title}>Features</h2>
<div className={styles.features}>
{features.map(feature => (
<div className={styles.reason} key={feature.id}>
<div className={styles.icon}>
<feature.Icon />
</div>
<h3 className={styles.label}>{feature.label}</h3>
<p className={styles.body}>
<Balancer>{feature.body}</Balancer>
</p>
{feature.link && (
<a className={styles.link} href={feature.link.url}>
{feature.link.label}
</a>
)}
{feature.soon && <div className={styles.soon}>Coming Soon</div>}
</div>
))}
</div>
</Container>
</section>
);
}

View File

@@ -0,0 +1 @@
export { Features } from './features';

View File

@@ -1,14 +1,11 @@
---
import { Container } from '@/components/container';
import { Container } from './container';
---
<footer class="footer">
<Container>
<p>
Created by{' '}
<a href="https://twitter.com/remvze">
Maze <span>✦</span>
</a>
Created by <a href="https://twitter.com/remvze">Maze ✦</a>
</p>
</Container>
</footer>
@@ -28,10 +25,6 @@ import { Container } from '@/components/container';
font-weight: 500;
color: var(--color-foreground);
text-decoration: none;
& span {
color: #c0eb75;
}
}
}
}

View File

@@ -1,8 +1,9 @@
---
import { Balancer } from 'react-wrap-balancer';
import { BsSoundwave } from 'react-icons/bs/index';
import { Container } from '@/components/container';
import { Container } from './container';
import { CipherText } from './cipher';
import { count as soundCount } from '@/lib/sounds';
const count = soundCount();
@@ -10,77 +11,100 @@ const count = soundCount();
<div class="hero">
<Container>
<img
alt="Faded Moodist Logo"
class="logo"
height={45}
src="/logo.svg"
width={45}
/>
<div class="wrapper">
<div class="pattern"></div>
<img
alt="Faded Moodist Logo"
aria-hidden="true"
class="logo"
height={45}
src="/logo.svg"
width={45}
/>
<div class="title">
<div class="left"></div>
<h1>Moodist</h1>
<div class="right"></div>
<h1 class="title">
Ambient Sounds<span class="line">For Focus and Calm</span>
</h1>
<h2 class="desc">
Free and <CipherText client:load text="Open-Source" />.
</h2>
<p class="sounds">
<span aria-hidden="true" class="icon">
<BsSoundwave />
</span>
<span>{count} Sounds</span>
</p>
</div>
<p class="desc">
<Balancer>Ambient sounds for focus and calm.</Balancer>
</p>
<p class="sounds">
<span class="icon"><BsSoundwave /></span>
<span>{count} Sounds</span>
</p>
</Container>
</div>
<style>
.hero {
padding: 140px 0 60px;
text-align: center;
.wrapper {
position: relative;
padding: 120px 0 80px;
& .pattern {
position: absolute;
top: 0;
left: 0;
z-index: -1;
width: 100%;
height: 100%;
background-image: radial-gradient(
var(--color-neutral-500) 5%,
transparent 5%
);
background-position: top center;
background-size: 21px 21px;
opacity: 0.8;
mask-image: linear-gradient(#fff, transparent, transparent);
}
}
& .logo {
display: block;
width: 45px;
margin: 0 auto 12px;
margin: 0 auto 16px;
animation-name: logo;
animation-duration: 45s;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
& .title {
display: flex;
column-gap: 15px;
align-items: center;
font-family: var(--font-display);
font-size: var(--font-xlg);
font-weight: 600;
line-height: 1;
& div {
flex-grow: 1;
height: 1px;
/* & .gradient {
background: linear-gradient(
135deg,
var(--color-foreground),
var(--color-foreground-subtle)
);
background-clip: text;
-webkit-text-fill-color: transparent;
} */
&.left {
background: linear-gradient(
90deg,
transparent,
var(--color-neutral-300)
);
}
&.right {
background: linear-gradient(
90deg,
var(--color-neutral-300),
transparent
);
}
}
& h1 {
font-family: var(--font-display);
font-size: var(--font-2xlg);
font-weight: 600;
& .line {
display: block;
margin-top: 2px;
background: linear-gradient(
var(--color-foreground-subtler),
var(--color-foreground-subtle)
);
background-clip: text;
-webkit-text-fill-color: transparent;
}
}
& .desc {
margin-top: 5px;
margin-top: 12px;
line-height: 1.6;
color: var(--color-foreground-subtle);
}
@@ -97,7 +121,7 @@ const count = soundCount();
margin: 20px auto 0;
font-size: var(--font-xsm);
color: var(--color-foreground-subtle);
background-color: var(--color-neutral-100);
background: linear-gradient(var(--color-neutral-100), transparent);
border: 1px solid var(--color-neutral-200);
border-radius: 100px;
@@ -106,9 +130,10 @@ const count = soundCount();
align-items: center;
justify-content: center;
height: 100%;
padding: 0 8px 0 12px;
padding: 0 10px;
color: var(--color-foreground);
border-right: 1px solid var(--color-neutral-200);
border-radius: 0 100px 100px 0;
}
&::before {
@@ -128,4 +153,14 @@ const count = soundCount();
}
}
}
@keyframes logo {
0% {
transform: rotate(0);
}
100% {
transform: rotate(360deg);
}
}
</style>

View File

@@ -0,0 +1 @@
export { MediaControls } from './media-controls';

View File

@@ -0,0 +1,20 @@
import { MediaSessionTrack } from './media-session-track';
import { useEffect, useState } from 'react';
import { useSSR } from '@/hooks/use-ssr';
export function MediaControls() {
const [mediaControlsEnabled, setMediaControlsEnabled] = useState(false);
const { isBrowser } = useSSR();
useEffect(() => {
if (!isBrowser) return;
setMediaControlsEnabled('mediaSession' in navigator);
}, [isBrowser]);
if (!mediaControlsEnabled) {
return null;
}
return <MediaSessionTrack />;
}

View File

@@ -0,0 +1,104 @@
import { useCallback, useEffect, useRef, useState } from 'react';
import { getSilenceDataURL } from '@/helpers/sound';
import { BrowserDetect } from '@/helpers/browser-detect';
import { useSoundStore } from '@/stores/sound';
import { useSSR } from '@/hooks/use-ssr';
import { useDarkTheme } from '@/hooks/use-dark-theme';
const metadata: MediaMetadataInit = {
artist: 'Moodist',
title: 'Ambient Sounds for Focus and Calm',
};
export function MediaSessionTrack() {
const { isBrowser } = useSSR();
const isDarkTheme = useDarkTheme();
const [isGenerated, setIsGenerated] = useState(false);
const isPlaying = useSoundStore(state => state.isPlaying);
const play = useSoundStore(state => state.play);
const pause = useSoundStore(state => state.pause);
const masterAudioSoundRef = useRef<HTMLAudioElement>(null);
const artworkURL = isDarkTheme ? '/logo-dark.png' : '/logo-light.png';
const generateSilence = useCallback(async () => {
if (!masterAudioSoundRef.current) return;
masterAudioSoundRef.current.src = await getSilenceDataURL();
setIsGenerated(true);
}, []);
useEffect(() => {
if (!isBrowser || !isPlaying || !isGenerated) return;
navigator.mediaSession.metadata = new MediaMetadata({
...metadata,
artwork: [
{
sizes: '200x200',
src: artworkURL,
type: 'image/png',
},
],
});
}, [artworkURL, isBrowser, isDarkTheme, isGenerated, isPlaying]);
useEffect(() => {
generateSilence();
}, [generateSilence]);
const startMasterAudio = useCallback(async () => {
if (!masterAudioSoundRef.current) return;
if (!masterAudioSoundRef.current.paused) return;
try {
await masterAudioSoundRef.current.play();
navigator.mediaSession.playbackState = 'playing';
navigator.mediaSession.setActionHandler('play', play);
navigator.mediaSession.setActionHandler('pause', pause);
} catch {
// Do nothing
}
}, [pause, play]);
const stopMasterAudio = useCallback(() => {
if (!masterAudioSoundRef.current) return;
/**
* Otherwise in Safari we cannot play the audio again
* through the media session controls
*/
if (BrowserDetect.isSafari()) {
masterAudioSoundRef.current.load();
} else {
masterAudioSoundRef.current.pause();
}
navigator.mediaSession.playbackState = 'paused';
}, []);
useEffect(() => {
if (!isGenerated) return;
if (!masterAudioSoundRef.current) return;
if (isPlaying) {
startMasterAudio();
} else {
stopMasterAudio();
}
}, [isGenerated, isPlaying, startMasterAudio, stopMasterAudio]);
useEffect(() => {
const masterAudioSound = masterAudioSoundRef.current;
return () => {
masterAudioSound?.pause();
navigator.mediaSession.setActionHandler('play', null);
navigator.mediaSession.setActionHandler('pause', null);
navigator.mediaSession.playbackState = 'none';
};
}, []);
return <audio id="media-session-track" loop ref={masterAudioSoundRef} />;
}

View File

@@ -0,0 +1 @@
export { Modal } from './modal';

View File

@@ -0,0 +1,62 @@
.overlay {
position: fixed;
inset: 0;
z-index: 20;
background-color: rgb(9 9 11 / 40%);
backdrop-filter: blur(5px);
}
.modal {
position: fixed;
top: 50%;
left: 50%;
z-index: 20;
width: 100%;
max-height: 100%;
padding: 50px 0;
overflow-y: auto;
pointer-events: none;
transform: translate(-50%, -50%);
& .content {
position: relative;
width: 90%;
max-width: 500px;
padding: 20px;
padding-top: 40px;
margin: 0 auto;
pointer-events: fill;
background-color: var(--color-neutral-100);
border-radius: 8px;
&.wide {
width: 95%;
max-width: 600px;
padding: 12px;
padding-top: 40px;
}
& .close {
position: absolute;
top: 10px;
right: 10px;
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
font-size: 16px;
color: var(--color-foreground-subtle);
cursor: pointer;
background-color: transparent;
border: none;
border-radius: 4px;
outline: none;
&:focus-visible {
outline: 2px solid var(--color-neutral-400);
outline-offset: 2px;
}
}
}
}

View File

@@ -0,0 +1,26 @@
import type { Meta, StoryObj } from '@storybook/react';
import { Modal } from './modal';
const meta: Meta<typeof Modal> = {
component: Modal,
title: 'Modal',
};
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {
args: {
children: 'Hello World',
show: true,
},
};
export const Wide: Story = {
args: {
...Default.args,
wide: true,
},
};

View File

@@ -0,0 +1,107 @@
import { useEffect } from 'react';
import { AnimatePresence, motion } from 'framer-motion';
import { IoClose } from 'react-icons/io5/index';
import FocusTrap from 'focus-trap-react';
import { Portal } from '@/components/portal';
import { fade, mix, slideY } from '@/lib/motion';
import { cn } from '@/helpers/styles';
import styles from './modal.module.css';
interface ModalProps {
children: React.ReactNode;
lockBody?: boolean;
onClose: () => void;
persist?: boolean;
show: boolean;
wide?: boolean;
}
const TRANSITION_DURATION = 300;
export function Modal({
children,
lockBody = true,
onClose,
persist = false,
show,
wide,
}: ModalProps) {
const variants = {
modal: mix(fade(), slideY(20)),
overlay: fade(),
};
useEffect(() => {
if (show && lockBody) {
document.body.style.overflowY = 'hidden';
} else if (lockBody) {
// Wait for transition to finish before allowing scrollbar to return
setTimeout(() => {
document.body.style.overflowY = 'auto';
}, TRANSITION_DURATION);
}
}, [show, lockBody]);
useEffect(() => {
function keyListener(e: KeyboardEvent) {
if (show && e.key === 'Escape') {
onClose();
}
}
document.addEventListener('keydown', keyListener);
return () => document.removeEventListener('keydown', keyListener);
}, [onClose, show]);
const animationProps = persist
? {
animate: show ? 'show' : 'hidden',
}
: {
animate: 'show',
exit: 'hidden',
initial: 'hidden',
};
const content = (
<FocusTrap active={show}>
<div>
<motion.div
{...animationProps}
className={styles.overlay}
transition={{ duration: TRANSITION_DURATION / 1000 }}
variants={variants.overlay}
onClick={onClose}
onKeyDown={onClose}
/>
<div className={styles.modal}>
<motion.div
{...animationProps}
className={cn(styles.content, wide && styles.wide)}
transition={{ duration: TRANSITION_DURATION / 1000 }}
variants={variants.modal}
>
<button className={styles.close} onClick={onClose}>
<IoClose />
</button>
{children}
</motion.div>
</div>
</div>
</FocusTrap>
);
return (
<Portal>
{persist ? (
<div style={{ display: show ? 'block' : 'none' }}>{content}</div>
) : (
<AnimatePresence>{show && content}</AnimatePresence>
)}
</Portal>
);
}

View File

@@ -0,0 +1,76 @@
.header {
margin-bottom: 16px;
& .title {
margin-bottom: 4px;
font-family: var(--font-heading);
font-size: var(--font-md);
font-weight: 600;
}
& .desc {
color: var(--color-foreground-subtle);
}
}
.fieldWrapper {
margin-bottom: 12px;
& label {
display: block;
font-size: var(--font-sm);
font-weight: 500;
color: var(--color-foreground);
& input,
select {
display: block;
width: 100%;
min-width: 0;
height: 45px;
padding: 0 8px;
margin-top: 4px;
color: var(--color-foreground);
background-color: var(--color-neutral-50);
border: 1px solid var(--color-neutral-200);
border-radius: 8px;
outline: none;
}
& .volume {
margin-top: 4px;
}
}
}
.buttons {
display: flex;
column-gap: 8px;
align-items: center;
margin-top: 12px;
& button {
display: flex;
flex-grow: 1;
align-items: center;
justify-content: center;
height: 45px;
font-weight: 500;
color: var(--color-foreground);
cursor: pointer;
background-color: var(--color-neutral-200);
border: none;
border-radius: 8px;
outline: none;
&:disabled {
cursor: not-allowed;
opacity: 0.3;
}
&.primary {
color: var(--color-neutral-50);
background-color: var(--color-neutral-950);
}
}
}

View File

@@ -0,0 +1,223 @@
import { useEffect, useState, useRef, useCallback } from 'react';
import { Modal } from '@/components/modal';
import { Slider } from '@/components/slider';
import styles from './binaural.module.css';
interface BinauralProps {
onClose: () => void;
show: boolean;
}
interface Preset {
baseFrequency: number;
beatFrequency: number;
name: string;
}
const presets: Preset[] = [
{ baseFrequency: 100, beatFrequency: 2, name: 'Delta (Deep Sleep) 2 Hz' },
{ baseFrequency: 100, beatFrequency: 5, name: 'Theta (Meditation) 5 Hz' },
{ baseFrequency: 100, beatFrequency: 10, name: 'Alpha (Relaxation) 10 Hz' },
{ baseFrequency: 100, beatFrequency: 20, name: 'Beta (Focus) 20 Hz' },
{ baseFrequency: 100, beatFrequency: 40, name: 'Gamma (Cognition) 40 Hz' },
{ baseFrequency: 440, beatFrequency: 10, name: 'Custom' },
];
export function BinauralModal({ onClose, show }: BinauralProps) {
const [baseFrequency, setBaseFrequency] = useState<number>(440); // Default to A4 note
const [beatFrequency, setBeatFrequency] = useState<number>(10); // Default to 10 Hz difference
const [volume, setVolume] = useState<number>(0.5); // Default volume at 50%
const [isPlaying, setIsPlaying] = useState<boolean>(false);
const [selectedPreset, setSelectedPreset] = useState<string>('Custom');
const audioContextRef = useRef<AudioContext | null>(null);
const leftOscillatorRef = useRef<OscillatorNode | null>(null);
const rightOscillatorRef = useRef<OscillatorNode | null>(null);
const gainNodeRef = useRef<GainNode | null>(null);
const startSound = () => {
if (isPlaying) return;
// Initialize the AudioContext
audioContextRef.current = new window.AudioContext();
const audioContext = audioContextRef.current;
if (!audioContext) return;
// Create a gain node for volume control
gainNodeRef.current = audioContext.createGain();
gainNodeRef.current.gain.value = volume; // Set volume based on state
// Create oscillators for left and right channels
leftOscillatorRef.current = audioContext.createOscillator();
rightOscillatorRef.current = audioContext.createOscillator();
if (
!leftOscillatorRef.current ||
!rightOscillatorRef.current ||
!gainNodeRef.current
)
return;
leftOscillatorRef.current.frequency.value =
baseFrequency - beatFrequency / 2;
rightOscillatorRef.current.frequency.value =
baseFrequency + beatFrequency / 2;
// Pan oscillators to left and right
const leftPanner = audioContext.createStereoPanner();
leftPanner.pan.value = -1;
const rightPanner = audioContext.createStereoPanner();
rightPanner.pan.value = 1;
// Connect nodes
leftOscillatorRef.current.connect(leftPanner).connect(gainNodeRef.current);
rightOscillatorRef.current
.connect(rightPanner)
.connect(gainNodeRef.current);
gainNodeRef.current.connect(audioContext.destination);
// Start oscillators
leftOscillatorRef.current.start();
rightOscillatorRef.current.start();
setIsPlaying(true);
};
const stopSound = useCallback(() => {
if (!isPlaying) return;
leftOscillatorRef.current?.stop();
rightOscillatorRef.current?.stop();
audioContextRef.current?.close();
setIsPlaying(false);
}, [isPlaying]);
useEffect(() => {
// Update gain node when volume changes
if (gainNodeRef.current) {
gainNodeRef.current.gain.value = volume;
}
}, [volume]);
useEffect(() => {
// Cleanup when component unmounts
return () => {
if (isPlaying) {
stopSound();
}
};
}, [isPlaying, stopSound]);
useEffect(() => {
// Update frequencies when a preset is selected
if (selectedPreset !== 'Custom') {
const preset = presets.find(p => p.name === selectedPreset);
if (preset) {
setBaseFrequency(preset.baseFrequency);
setBeatFrequency(preset.beatFrequency);
}
}
}, [selectedPreset]);
const handlePresetChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
const selected = e.target.value;
setSelectedPreset(selected);
if (selected === 'Custom') {
// Allow user to input custom frequencies
return;
}
const preset = presets.find(p => p.name === selected);
if (preset) {
setBaseFrequency(preset.baseFrequency);
setBeatFrequency(preset.beatFrequency);
}
};
return (
<Modal show={show} onClose={onClose}>
<header className={styles.header}>
<h2 className={styles.title}>Binaural Beat</h2>
<p className={styles.desc}>Binaural beat generator.</p>
</header>
<div className={styles.fieldWrapper}>
<label>
Presets:
<select value={selectedPreset} onChange={handlePresetChange}>
{presets.map(preset => (
<option key={preset.name} value={preset.name}>
{preset.name}
</option>
))}
</select>
</label>
</div>
{selectedPreset === 'Custom' && (
<>
<div className={styles.fieldWrapper}>
<label>
Base Frequency (Hz):
<input
max="1500"
min="20"
step="0.1"
type="number"
value={baseFrequency}
onChange={e =>
setBaseFrequency(parseFloat(e.target.value || '0'))
}
/>
</label>
</div>
<div className={styles.fieldWrapper}>
<label>
Beat Frequency (Hz):
<input
max="40"
min="0.1"
step="0.1"
type="number"
value={beatFrequency}
onChange={e =>
setBeatFrequency(parseFloat(e.target.value || '0'))
}
/>
</label>
</div>
</>
)}
<div className={styles.fieldWrapper}>
<label>
Volume:
<Slider
className={styles.volume}
max={1}
min={0}
step={0.01}
value={volume}
onChange={value => setVolume(value)}
/>
</label>
</div>
<div className={styles.buttons}>
<button
className={styles.primary}
disabled={isPlaying}
onClick={startSound}
>
Start
</button>
<button disabled={!isPlaying} onClick={stopSound}>
Stop
</button>
</div>
</Modal>
);
}

View File

@@ -0,0 +1 @@
export { BinauralModal } from './binaural';

View File

@@ -0,0 +1 @@
/* WIP */

View File

@@ -0,0 +1,18 @@
import { Modal } from '@/components/modal';
import { Exercise } from './exercise';
import styles from './breathing.module.css';
interface TimerProps {
onClose: () => void;
show: boolean;
}
export function BreathingExerciseModal({ onClose, show }: TimerProps) {
return (
<Modal show={show} onClose={onClose}>
<h2 className={styles.title}>Breathing Exercise</h2>
<Exercise />
</Modal>
);
}

View File

@@ -0,0 +1,91 @@
.exercise {
position: relative;
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
padding: 75px 0;
margin-top: 12px;
background-color: var(--color-neutral-50);
border: 1px solid var(--color-neutral-200);
border-radius: 8px;
& .timer {
position: absolute;
top: 4px;
left: 4px;
padding: 4px 12px;
font-size: var(--font-xsm);
color: var(--color-foreground-subtle);
background: linear-gradient(
var(--color-neutral-100),
var(--color-neutral-50)
);
border: 1px solid var(--color-neutral-200);
border-radius: 4px;
}
& .phase {
font-family: var(--font-display);
font-size: var(--font-lg);
font-weight: 600;
}
& .circle {
position: absolute;
top: 50%;
left: 50%;
z-index: -1;
height: 55%;
aspect-ratio: 1 / 1;
background-image: radial-gradient(
var(--color-neutral-50),
var(--color-neutral-100)
);
border: 1px solid var(--color-neutral-200);
border-radius: 50%;
transform: translate(-50%, -50%);
}
}
.selectWrapper {
position: relative;
width: 100%;
height: 45px;
padding: 0 12px;
margin-top: 8px;
background-color: var(--color-neutral-50);
border: 1px solid var(--color-neutral-200);
border-radius: 8px;
&::before {
position: absolute;
top: -1px;
left: 50%;
width: 80%;
height: 1px;
content: '';
background: linear-gradient(
90deg,
transparent,
var(--color-neutral-300),
transparent
);
transform: translateX(-50%);
}
& .selectBox {
width: 100%;
min-width: 0;
height: 100%;
font-size: var(--font-sm);
color: var(--color-foreground);
background-color: transparent;
border: none;
outline: none;
& option {
color: var(--color-neutral-50);
}
}
}

View File

@@ -0,0 +1,126 @@
import { useState, useEffect, useMemo, useCallback } from 'react';
import { motion } from 'framer-motion';
import { padNumber } from '@/helpers/number';
import styles from './exercise.module.css';
type Exercise = 'Box Breathing' | 'Resonant Breathing' | '4-7-8 Breathing';
type Phase = 'inhale' | 'exhale' | 'holdInhale' | 'holdExhale';
const EXERCISE_PHASES: Record<Exercise, Phase[]> = {
'4-7-8 Breathing': ['inhale', 'holdInhale', 'exhale'],
'Box Breathing': ['inhale', 'holdInhale', 'exhale', 'holdExhale'],
'Resonant Breathing': ['inhale', 'exhale'],
};
const EXERCISE_DURATIONS: Record<Exercise, Partial<Record<Phase, number>>> = {
'4-7-8 Breathing': { exhale: 8, holdInhale: 7, inhale: 4 },
'Box Breathing': { exhale: 4, holdExhale: 4, holdInhale: 4, inhale: 4 },
'Resonant Breathing': { exhale: 5, inhale: 5 }, // No holdExhale
};
const PHASE_LABELS: Record<Phase, string> = {
exhale: 'Exhale',
holdExhale: 'Hold',
holdInhale: 'Hold',
inhale: 'Inhale',
};
export function Exercise() {
const [selectedExercise, setSelectedExercise] =
useState<Exercise>('4-7-8 Breathing');
const [phaseIndex, setPhaseIndex] = useState(0);
const phases = useMemo(
() => EXERCISE_PHASES[selectedExercise],
[selectedExercise],
);
const durations = useMemo(
() => EXERCISE_DURATIONS[selectedExercise],
[selectedExercise],
);
const currentPhase = phases[phaseIndex];
const animationVariants = useMemo(
() => ({
exhale: {
transform: 'translate(-50%, -50%) scale(1)',
transition: { duration: durations.exhale },
},
holdExhale: {
transform: 'translate(-50%, -50%) scale(1)',
transition: { duration: durations.holdExhale },
},
holdInhale: {
transform: 'translate(-50%, -50%) scale(1.5)',
transition: { duration: durations.holdInhale },
},
inhale: {
transform: 'translate(-50%, -50%) scale(1.5)',
transition: { duration: durations.inhale },
},
}),
[durations],
);
const resetExercise = useCallback(() => {
setPhaseIndex(0);
}, []);
const updatePhase = useCallback(() => {
setPhaseIndex(prevIndex => (prevIndex + 1) % phases.length);
}, [phases.length]);
useEffect(() => {
resetExercise();
}, [selectedExercise, resetExercise]);
useEffect(() => {
const intervalDuration = (durations[currentPhase] || 4) * 1000;
const interval = setInterval(updatePhase, intervalDuration);
return () => clearInterval(interval);
}, [currentPhase, durations, updatePhase]);
const [timer, setTimer] = useState(0);
useEffect(() => {
const interval = setInterval(() => setTimer(prev => prev + 1), 1000);
return () => clearInterval(interval);
}, []);
return (
<>
<div className={styles.exercise}>
<div className={styles.timer}>
{padNumber(Math.floor(timer / 60))}:{padNumber(timer % 60)}
</div>
<motion.div
animate={currentPhase}
className={styles.circle}
key={selectedExercise}
variants={animationVariants}
/>
<p className={styles.phase}>{PHASE_LABELS[currentPhase]}</p>
</div>
<div className={styles.selectWrapper}>
<select
className={styles.selectBox}
value={selectedExercise}
onChange={e => setSelectedExercise(e.target.value as Exercise)}
>
{Object.keys(EXERCISE_PHASES).map(exercise => (
<option key={exercise} value={exercise}>
{exercise}
</option>
))}
</select>
</div>
</>
);
}

View File

@@ -0,0 +1 @@
export { Exercise } from './exercise';

View File

@@ -0,0 +1 @@
export { BreathingExerciseModal } from './breathing';

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