aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-03-28 05:08:14 -0700
committerFuwn <[email protected]>2024-03-28 05:08:14 -0700
commit1a283a0764e0870ba83c7f176d899f1f1902db45 (patch)
tree1faa46ddf8ec6351f40183fdf2def0140ec9e009 /src/lib
parentfix(birthdays): properly fix names (diff)
downloaddue.moe-1a283a0764e0870ba83c7f176d899f1f1902db45.tar.xz
due.moe-1a283a0764e0870ba83c7f176d899f1f1902db45.zip
feat(tools): hololive birthdays
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Data/Static/hololiveBirthdays.json614
-rw-r--r--src/lib/Tools/HololiveBirthdays.svelte95
-rw-r--r--src/lib/Tools/tools.ts6
3 files changed, 715 insertions, 0 deletions
diff --git a/src/lib/Data/Static/hololiveBirthdays.json b/src/lib/Data/Static/hololiveBirthdays.json
new file mode 100644
index 00000000..bcc1a3c9
--- /dev/null
+++ b/src/lib/Data/Static/hololiveBirthdays.json
@@ -0,0 +1,614 @@
+[
+ {
+ "name": "Watson Amelia",
+ "month": 1,
+ "day": 6,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/watson-amelia-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Usada Pekora",
+ "month": 1,
+ "day": 12,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/usada-pekora-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Ayunda Risu",
+ "month": 1,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/ayunda-risu-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Aragami Oga",
+ "month": 1,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/aragami-oga-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Uruha Rushia",
+ "month": 1,
+ "day": 22,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/uruha-rushia-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Regis Altare",
+ "month": 1,
+ "day": 29,
+ "image": "https://hololist.net/wp-content/uploads/2022/07/regis-altare-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Omaru Polka",
+ "month": 1,
+ "day": 30,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/omaru-polka-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Fuwawa Abyssgard",
+ "month": 2,
+ "day": 1,
+ "image": "https://hololist.net/wp-content/uploads/2023/07/fuwawa-abyssgard-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Mococo Abyssgard",
+ "month": 2,
+ "day": 2,
+ "image": "https://hololist.net/wp-content/uploads/2023/07/mococo-abyssgard-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Juufuutei Raden",
+ "month": 2,
+ "day": 4,
+ "image": "https://hololist.net/wp-content/uploads/2023/09/juufuutei-raden-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Jurard T Rexford",
+ "month": 2,
+ "day": 7,
+ "image": "https://hololist.net/wp-content/uploads/2023/11/jurard-t-rexford-portrait-66-1-300x300.jpg"
+ },
+ {
+ "name": "Hizaki Gamma",
+ "month": 2,
+ "day": 9,
+ "image": "https://hololist.net/wp-content/uploads/2022/03/hizaki-gamma-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Noir Vesper",
+ "month": 2,
+ "day": 13,
+ "image": "https://hololist.net/wp-content/uploads/2022/07/noir-vesper-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Yuzuki Choco",
+ "month": 2,
+ "day": 14,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/yuzuki-choco-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Moona Hoshinova",
+ "month": 2,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/moona-hoshinova-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Aki Rosenthal",
+ "month": 2,
+ "day": 17,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/aki-rosenthal-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Nekomata Okayu",
+ "month": 2,
+ "day": 22,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/nekomata-okayu-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kageyama Shien",
+ "month": 2,
+ "day": 25,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/kageyama-shien-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Hiodoshi Ao",
+ "month": 2,
+ "day": 27,
+ "image": "https://hololist.net/wp-content/uploads/2023/09/hiodoshi-ao-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Hakos Baelz",
+ "month": 2,
+ "day": 29,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/hakos-baelz-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Momosuzu Nene",
+ "month": 3,
+ "day": 2,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/momosuzu-nene-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Hanasaki Miyabi",
+ "month": 3,
+ "day": 3,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/hanasaki-miyabi-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Sakura Miko",
+ "month": 3,
+ "day": 5,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/sakura-miko-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "IRyS",
+ "month": 3,
+ "day": 7,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/irys-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Anya Melfissa",
+ "month": 3,
+ "day": 12,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/anya-melfissa-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Ouro Kronii",
+ "month": 3,
+ "day": 14,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/ouro-kronii-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Hakui Koyori",
+ "month": 3,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/hakui-koyori-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Artia",
+ "month": 3,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/artia-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Ceres Fauna",
+ "month": 3,
+ "day": 21,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/ceres-fauna-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Hoshimachi Suisei",
+ "month": 3,
+ "day": 22,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/hoshimachi-suisei-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Yakushiji Suzaku",
+ "month": 3,
+ "day": 24,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/yakushiji-suzaku-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Yogiri",
+ "month": 4,
+ "day": 1,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/yogiri-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Shiranui Flare",
+ "month": 4,
+ "day": 2,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/shiranui-flare-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Mori Calliope",
+ "month": 4,
+ "day": 4,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/mori-calliope-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Octavio",
+ "month": 4,
+ "day": 8,
+ "image": "https://hololist.net/wp-content/uploads/2023/11/octavio-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Koseki Bijou",
+ "month": 4,
+ "day": 14,
+ "image": "https://hololist.net/wp-content/uploads/2023/07/koseki-bijou-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Rikka",
+ "month": 4,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/rikka-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kishido Temma",
+ "month": 4,
+ "day": 18,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/kishido-temma-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Otonose Kanade",
+ "month": 4,
+ "day": 20,
+ "image": "https://hololist.net/wp-content/uploads/2023/09/otonose-kanade-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Banzoin Hakka",
+ "month": 4,
+ "day": 21,
+ "image": "https://hololist.net/wp-content/uploads/2023/01/banzoin-hakka-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Amane Kanata",
+ "month": 4,
+ "day": 22,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/amane-kanata-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Shiori Novella",
+ "month": 5,
+ "day": 2,
+ "image": "https://hololist.net/wp-content/uploads/2023/07/shiori-novella-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Utsugi Uyu",
+ "month": 5,
+ "day": 10,
+ "image": "https://hololist.net/wp-content/uploads/2022/03/utsugi-uyu-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Ichijou Ririka",
+ "month": 5,
+ "day": 12,
+ "image": "https://hololist.net/wp-content/uploads/2023/09/ichijou-ririka-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Tokino Sora",
+ "month": 5,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/tokino-sora-portrait-66_-300x300.jpg"
+ },
+ {
+ "name": "Gavis Bettel",
+ "month": 5,
+ "day": 17,
+ "image": "https://hololist.net/wp-content/uploads/2023/01/gavis-bettel-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Sakamata Chloe",
+ "month": 5,
+ "day": 18,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/sakamata-chloe-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Ninomae Ina'nis",
+ "month": 5,
+ "day": 20,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/ninomae-inanis-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Roboco",
+ "month": 5,
+ "day": 23,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/roboco-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "La+ Darknesss",
+ "month": 5,
+ "day": 25,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/laplus-darknesss-portrait-66-1-300x300.jpg"
+ },
+ {
+ "name": "Spade Echo",
+ "month": 5,
+ "day": 30,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/spade-echo-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Doris",
+ "month": 6,
+ "day": 1,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/doris-portrait-66_-300x300.jpg"
+ },
+ {
+ "name": "Machina X Flayon",
+ "month": 6,
+ "day": 5,
+ "image": "https://hololist.net/wp-content/uploads/2023/01/machina-x-flayon-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Tsunomaki Watame",
+ "month": 6,
+ "day": 6,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/tsunomaki-watame-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Astel Leda",
+ "month": 6,
+ "day": 6,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/astel-leda-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Todoroki Hajime",
+ "month": 6,
+ "day": 7,
+ "image": "https://hololist.net/wp-content/uploads/2023/09/todoroki-hajime-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Tsukumo Sana",
+ "month": 6,
+ "day": 10,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/tsukumo-sana-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Takane Lui",
+ "month": 6,
+ "day": 11,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/takane-lui-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kiryu Coco",
+ "month": 6,
+ "day": 17,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/kiryu-coco-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kazama Iroha",
+ "month": 6,
+ "day": 18,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/kazama-iroha-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Gawr Gura",
+ "month": 6,
+ "day": 20,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/gawr-gura-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Josuiji Shinri",
+ "month": 6,
+ "day": 23,
+ "image": "https://hololist.net/wp-content/uploads/2023/01/josuiji-shinri-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Goldbullet",
+ "month": 6,
+ "day": 30,
+ "image": "https://hololist.net/wp-content/uploads/2023/11/goldbullet-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "AZKi",
+ "month": 7,
+ "day": 1,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/azki-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Oozora Subaru",
+ "month": 7,
+ "day": 2,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/oozora-subaru-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Takanashi Kiara",
+ "month": 7,
+ "day": 6,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/takanashi-kiara-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Yatogami Fuma",
+ "month": 7,
+ "day": 13,
+ "image": "https://hololist.net/wp-content/uploads/2022/03/yatogami-fuma-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Airani Iofifteen",
+ "month": 7,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/airani-iofifteen-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Natsuiro Matsuri",
+ "month": 7,
+ "day": 22,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/natsuiro-matsuri-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Minase Rio",
+ "month": 7,
+ "day": 26,
+ "image": "https://hololist.net/wp-content/uploads/2022/03/minase-rio-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Houshou Marine",
+ "month": 7,
+ "day": 30,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/houshou-marine-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Nanashi Mumei",
+ "month": 8,
+ "day": 4,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/nanashi-mumei-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Tokoyami Towa",
+ "month": 8,
+ "day": 8,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/tokoyami-towa-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Akai Haato",
+ "month": 8,
+ "day": 10,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/akai-haato-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kanade Izuru",
+ "month": 8,
+ "day": 12,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/kanade-izuru-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Ookami Mio",
+ "month": 8,
+ "day": 20,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/ookami-mio-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Tsukishita Kaoru",
+ "month": 8,
+ "day": 29,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/tsukishita-kaoru-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kaela Kovalskia",
+ "month": 8,
+ "day": 30,
+ "image": "https://hololist.net/wp-content/uploads/2022/03/kaela-kovalskia-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Shishiro Botan",
+ "month": 9,
+ "day": 8,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/shishiro-botan-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Pavolia Reine",
+ "month": 9,
+ "day": 9,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/pavolia-reine-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Yukoku Roberu",
+ "month": 9,
+ "day": 26,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/yukoku-roberu-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Crimzon Ruze",
+ "month": 9,
+ "day": 30,
+ "image": "https://hololist.net/wp-content/uploads/2023/11/crimzon-ruze-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Inugami Korone",
+ "month": 10,
+ "day": 1,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/inugami-korone-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Shirakami Fubuki",
+ "month": 10,
+ "day": 5,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/shirakami-fubuki-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Himemori Luna",
+ "month": 10,
+ "day": 10,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/himemori-luna-portrait-66_-300x300.jpg"
+ },
+ {
+ "name": "Kureiji Ollie",
+ "month": 10,
+ "day": 13,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/kureiji-ollie-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Magni Dezmond",
+ "month": 10,
+ "day": 21,
+ "image": "https://hololist.net/wp-content/uploads/2022/07/magni-dezmond-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kagami Kira",
+ "month": 10,
+ "day": 26,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/kagami-kira-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Mano Aloe",
+ "month": 10,
+ "day": 28,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/mano-aloe-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Yozora Mel",
+ "month": 10,
+ "day": 31,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/yozora-mel-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Axel Syrios",
+ "month": 11,
+ "day": 1,
+ "image": "https://hololist.net/wp-content/uploads/2022/07/axel-syrios-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Vestia Zeta",
+ "month": 11,
+ "day": 7,
+ "image": "https://hololist.net/wp-content/uploads/2022/03/vestia-zeta-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Arurandeisu",
+ "month": 11,
+ "day": 11,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/arurandeisu-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Yukihana Lamy",
+ "month": 11,
+ "day": 15,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/yukihana-lamy-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Civia",
+ "month": 11,
+ "day": 18,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/civia-portrait-66-1-300x300.jpg"
+ },
+ {
+ "name": "Nerissa Ravencroft",
+ "month": 11,
+ "day": 21,
+ "image": "https://hololist.net/wp-content/uploads/2023/07/nerissa-ravencroft-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Shirogane Noel",
+ "month": 11,
+ "day": 24,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/shirogane-noel-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Minato Aqua",
+ "month": 12,
+ "day": 1,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/minato-aqua-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Murasaki Shion",
+ "month": 12,
+ "day": 8,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/murasaki-shion-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Rosalyn",
+ "month": 12,
+ "day": 10,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/rosalyn-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Kobo Kanaeru",
+ "month": 12,
+ "day": 12,
+ "image": "https://hololist.net/wp-content/uploads/2022/03/kobo-kanaeru-portrait-66-300x300.jpg"
+ },
+ {
+ "name": "Nakiri Ayame",
+ "month": 12,
+ "day": 13,
+ "image": "https://hololist.net/wp-content/uploads/2022/02/nakiri-ayame-portrait-66_-300x300.jpg"
+ }
+]
diff --git a/src/lib/Tools/HololiveBirthdays.svelte b/src/lib/Tools/HololiveBirthdays.svelte
new file mode 100644
index 00000000..059a1f91
--- /dev/null
+++ b/src/lib/Tools/HololiveBirthdays.svelte
@@ -0,0 +1,95 @@
+<script lang="ts">
+ import { browser } from '$app/environment';
+ import { page } from '$app/stores';
+ import { onMount } from 'svelte';
+ import { clearAllParameters, parseOrDefault } from '../Utility/parameters';
+ import Message from '$lib/Loading/Message.svelte';
+ import locale from '$stores/locale';
+ import birthdays from '$lib/Data/Static/hololiveBirthdays.json';
+
+ const urlParameters = browser ? new URLSearchParams(window.location.search) : null;
+ let date = new Date();
+ let month = parseOrDefault(urlParameters, 'month', date.getMonth() + 1);
+ let day = parseOrDefault(urlParameters, 'day', date.getDate());
+
+ $: todaysBirthdays = birthdays.filter(
+ (birthday) => birthday.month === month && birthday.day === day
+ );
+
+ $: {
+ month = Math.min(month, 12);
+ month = Math.max(month, 1);
+ day = Math.min(day, new Date(new Date().getFullYear(), month, 0).getDate());
+ day = Math.max(day, 1);
+
+ if (browser) {
+ $page.url.searchParams.set('month', month.toString());
+ $page.url.searchParams.set('day', day.toString());
+ clearAllParameters(['month', 'day']);
+ history.replaceState(null, '', `?${$page.url.searchParams.toString()}`);
+ }
+ }
+
+ onMount(() => clearAllParameters(['month', 'day']));
+</script>
+
+<p>
+ <select bind:value={month}>
+ {#each Array.from({ length: 12 }, (_, i) => i + 1) as month}
+ <option value={month}>
+ {new Date(0, month - 1).toLocaleString('default', { month: 'long' })}
+ </option>
+ {/each}
+ </select>
+
+ <select bind:value={day}>
+ {#each Array.from({ length: new Date(new Date().getFullYear(), month, 0).getDate() }, (_, i) => i + 1) as day}
+ <option value={day}>{day}</option>
+ {/each}
+ </select>
+</p>
+
+{#if todaysBirthdays.length === 0}
+ <Message
+ message={`No birthdays for ${$locale().dayFormatter(
+ new Date(new Date().getFullYear(), month - 1, day)
+ )}.`}
+ fullscreen={false}
+ loader="ripple"
+ />
+{:else}
+ <div class="characters">
+ {#each todaysBirthdays as birthday}
+ <div class="card card-small">
+ <a
+ href={`https://anilist.co/search/characters?search=${encodeURIComponent(
+ birthday.name
+ ).replace(/%20/g, '+')}`}
+ target="_blank"
+ >
+ {birthday.name}
+ <img src={birthday.image} alt="Character" class="character-image" />
+ </a>
+ </div>
+ {/each}
+ </div>
+{/if}
+
+<style lang="scss">
+ .characters {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
+ gap: 1rem;
+ grid-row-gap: 1rem;
+ align-items: start;
+
+ img {
+ width: 100%;
+ height: auto;
+ object-fit: cover;
+ border-radius: 8px;
+ margin-top: 0.5rem;
+ box-shadow: 0 4px 30px var(--base01);
+ }
+ }
+</style>
diff --git a/src/lib/Tools/tools.ts b/src/lib/Tools/tools.ts
index 2ddbc337..3feaf9e0 100644
--- a/src/lib/Tools/tools.ts
+++ b/src/lib/Tools/tools.ts
@@ -43,6 +43,12 @@ export const tools: {
'Find and display the birthdays of all Uma Musume characters for today, or any other day of the year',
id: 'uma_musume_birthdays'
},
+ hololive_birthdays: {
+ name: () => 'hololive Birthdays',
+ description: () =>
+ 'Find and display the birthdays of all hololive talents for today, or any other day of the year',
+ id: 'hololive_birthdays'
+ },
hayai: {
name: () => '早い',
description: () => 'Read light novels at 1.5x speed!',