├── .gitattributes
├── .github
└── CODEOWNERS
├── .gitignore
├── .licenserc.json
├── .prettierrc.yaml
├── .vscode
└── settings.json
├── LICENSE.md
├── README.md
├── api
├── middleware
│ └── cors.ts
├── routes
│ ├── index.post.ts
│ ├── op.post.ts
│ ├── single-page.ts
│ └── test.ts
└── tsconfig.json
├── docs
├── .vitepress
│ ├── README
│ │ └── __og_image__
│ │ │ └── og.png
│ ├── config.mts
│ ├── configs
│ │ ├── constants.ts
│ │ ├── fonts
│ │ │ ├── Inter-Bold.otf
│ │ │ ├── Inter-Medium.otf
│ │ │ ├── Inter-Regular.otf
│ │ │ └── Inter-SemiBold.otf
│ │ ├── hooks
│ │ │ ├── index.ts
│ │ │ ├── meta.ts
│ │ │ ├── opengraph.ts
│ │ │ └── satoriConfig.ts
│ │ ├── index.ts
│ │ └── markdown
│ │ │ ├── emoji.cache.json
│ │ │ ├── emoji.ts
│ │ │ ├── headers.ts
│ │ │ └── index.ts
│ ├── credits.ts
│ ├── theme
│ │ ├── Layout.vue
│ │ ├── components
│ │ │ ├── AnnouncementPill.vue
│ │ │ ├── Authors.vue
│ │ │ ├── Badge.vue
│ │ │ ├── Button.vue
│ │ │ ├── CardField.vue
│ │ │ ├── ChristmasCard.vue
│ │ │ ├── Contributors.vue
│ │ │ ├── Feedback.vue
│ │ │ ├── GradientCard.vue
│ │ │ ├── LegendModal.vue
│ │ │ ├── NewDomainBanner.vue
│ │ │ ├── NotFound.vue
│ │ │ ├── OgImageTemplate.vue
│ │ │ ├── PreferenceRadio.vue
│ │ │ ├── ReloadPrompt.vue
│ │ │ ├── SidebarCard.vue
│ │ │ ├── Tooltip.vue
│ │ │ └── VPSwitchAppearance.vue
│ │ ├── composables
│ │ │ ├── medium-zoom.ts
│ │ │ ├── op.ts
│ │ │ └── useTooltips.ts
│ │ ├── index.ts
│ │ ├── internal
│ │ │ ├── api.ts
│ │ │ └── browser.ts
│ │ ├── math.ts
│ │ └── styles
│ │ │ ├── style.css
│ │ │ └── tooltip-hint.css
│ ├── tooltips
│ │ ├── AGR.md
│ │ ├── Akuma.md
│ │ ├── AllManga.md
│ │ ├── AniPlay.md
│ │ ├── AniZone.md
│ │ ├── Anidap.md
│ │ ├── AnimeKai.md
│ │ ├── AnimeNexus.md
│ │ ├── AnimeRealms.md
│ │ ├── AnimeStream.md
│ │ ├── Animepahe.md
│ │ ├── Animotvslash.md
│ │ ├── BangumiList.md
│ │ ├── Batoto.md
│ │ ├── Boorusphere.md
│ │ ├── CDisplayEx.md
│ │ ├── CbxConverter.md
│ │ ├── ComicRanking500.md
│ │ ├── DMF.md
│ │ ├── Danke.md
│ │ ├── EHentai.md
│ │ ├── Empy.md
│ │ ├── Enimoe.md
│ │ ├── Flame.md
│ │ ├── Flud.md
│ │ ├── Gojo.md
│ │ ├── HDoujin.md
│ │ ├── HDoujinDownloader.md
│ │ ├── Hakuneko.md
│ │ ├── HenTalkNexus.md
│ │ ├── Hitomi.md
│ │ ├── IMHentai.md
│ │ ├── JosuKe.md
│ │ ├── KAA.md
│ │ ├── Kagane.md
│ │ ├── Koisuru.md
│ │ ├── Lord_ne.md
│ │ ├── LuCaZ.md
│ │ ├── MComix.md
│ │ ├── MangaDex.md
│ │ ├── MangaFire.md
│ │ ├── Misskey.md
│ │ ├── Nicotine.md
│ │ ├── Oakminati.md
│ │ ├── OpenComic.md
│ │ ├── Oppai.md
│ │ ├── OtakuStreamers.md
│ │ ├── PandaBackup.md
│ │ ├── Rillant.md
│ │ ├── Rule34Paheal.md
│ │ ├── Rule34xxx.md
│ │ ├── SWId.md
│ │ ├── SchaleNetwork.md
│ │ ├── Shellshock.md
│ │ ├── Shiru.md
│ │ ├── Shizu.md
│ │ ├── Spoilerplus.md
│ │ ├── Stick.md
│ │ ├── Sudatchi.md
│ │ ├── SumatraPDF.md
│ │ ├── TooManyIsekai.md
│ │ ├── Trite.md
│ │ ├── Ushi.md
│ │ ├── WCO.md
│ │ ├── WeebCentral.md
│ │ ├── YACReader.md
│ │ ├── Yabai.md
│ │ ├── Yomikiru.md
│ │ ├── Zoro.md
│ │ ├── akari.md
│ │ ├── amdl.md
│ │ ├── anadius.md
│ │ ├── animez.md
│ │ ├── aninow.md
│ │ ├── atosho.md
│ │ ├── cubari.md
│ │ ├── cupscale.md
│ │ ├── dab.md
│ │ ├── demo.md
│ │ ├── echo.md
│ │ ├── hef.md
│ │ ├── hive.md
│ │ ├── imgdanke.md
│ │ ├── kazamakase.md
│ │ ├── kei.md
│ │ ├── kohi.md
│ │ ├── komik.md
│ │ ├── kureha.md
│ │ ├── linew.md
│ │ ├── lunar.md
│ │ ├── mangarawspoil.md
│ │ ├── megarepo.md
│ │ ├── mirai.md
│ │ ├── miruro.md
│ │ ├── nHentai.md
│ │ ├── ni3x.md
│ │ ├── realm.md
│ │ ├── secozzi.md
│ │ ├── tron.md
│ │ ├── utoon.md
│ │ ├── vidbox.md
│ │ ├── webtooni.md
│ │ ├── xManager.md
│ │ ├── yuani.md
│ │ └── yuzono.md
│ ├── types
│ │ ├── Feedback.ts
│ │ └── tooltip.d.ts
│ ├── utils
│ │ └── tooltips.ts
│ └── vue-shim.d.ts
├── art.md
├── comms.md
├── credits.md
├── faq.md
├── games.md
├── glossary
│ ├── anime.md
│ ├── audio.md
│ ├── general.md
│ ├── manga.md
│ └── nsfw.md
├── guides
│ ├── anime
│ │ ├── discrip.md
│ │ └── ns.md
│ ├── ext
│ │ ├── ios.md
│ │ ├── mangayomi.md
│ │ ├── mihon.md
│ │ └── misc.md
│ ├── manga
│ │ ├── comicinfo.md
│ │ ├── cubari.md
│ │ ├── imagedit.md
│ │ ├── jxl.md
│ │ ├── madokami.md
│ │ ├── mdl.md
│ │ └── opds.md
│ ├── music
│ │ ├── echo.md
│ │ ├── fb2klyrics.md
│ │ ├── squidify.md
│ │ └── transcoding.md
│ └── tech
│ │ ├── adblock.md
│ │ ├── irc.md
│ │ └── jdl.md
├── index.md
├── japan
│ ├── culture.md
│ ├── immersion.md
│ ├── language.md
│ └── software.md
├── merch.md
├── misc.md
├── music.md
├── nonen.md
├── nsfw.md
├── public
│ ├── _headers
│ ├── asset
│ │ ├── 404.gif
│ │ ├── ad.png
│ │ ├── ame.png
│ │ ├── cope.gif
│ │ ├── fav.png
│ │ ├── inahuh.png
│ │ ├── inaread.png
│ │ ├── plush.png
│ │ ├── same.png
│ │ └── smolame.png
│ ├── banner
│ │ ├── 4ch.webp
│ │ ├── abtjpn.webp
│ │ ├── af.webp
│ │ ├── and.webp
│ │ ├── anime.webp
│ │ ├── apps.webp
│ │ ├── books.webp
│ │ ├── booru.webp
│ │ ├── bt.webp
│ │ ├── comics.webp
│ │ ├── comms.webp
│ │ ├── db.webp
│ │ ├── disbot.webp
│ │ ├── dler.webp
│ │ ├── ereader.webp
│ │ ├── essentails.webp
│ │ ├── ext.webp
│ │ ├── fake.webp
│ │ ├── fate.webp
│ │ ├── fg.webp
│ │ ├── games.webp
│ │ ├── general.webp
│ │ ├── guides.webp
│ │ ├── hoth.webp
│ │ ├── hsoft.webp
│ │ ├── hw.webp
│ │ ├── hweb.webp
│ │ ├── illust.webp
│ │ ├── info.webp
│ │ ├── ios.webp
│ │ ├── jp.webp
│ │ ├── kara.webp
│ │ ├── legal.webp
│ │ ├── linux.webp
│ │ ├── lnjp.webp
│ │ ├── lord.webp
│ │ ├── manga.webp
│ │ ├── mg.webp
│ │ ├── misc.webp
│ │ ├── msuic.webp
│ │ ├── music.webp
│ │ ├── novels.webp
│ │ ├── ost.webp
│ │ ├── others.webp
│ │ ├── pc.webp
│ │ ├── phone.webp
│ │ ├── portals.webp
│ │ ├── pt.webp
│ │ ├── random.webp
│ │ ├── raw.webp
│ │ ├── res.webp
│ │ ├── script.webp
│ │ ├── sites.webp
│ │ ├── software.webp
│ │ ├── spin.webp
│ │ ├── toku.webp
│ │ ├── tools.webp
│ │ ├── torrent.webp
│ │ ├── trackers.webp
│ │ ├── utility.webp
│ │ ├── vn.webp
│ │ ├── vt.webp
│ │ ├── vt2.webp
│ │ ├── wanime.webp
│ │ ├── wlegal.webp
│ │ ├── wmanga.webp
│ │ ├── wnovel.webp
│ │ ├── wpt.webp
│ │ └── yoru.webp
│ ├── conv.svg
│ ├── custom
│ │ └── alipay.svg
│ ├── diagram
│ │ ├── anifile.svg
│ │ ├── anipro.svg
│ │ ├── audhw.svg
│ │ ├── convo.svg
│ │ ├── cour.svg
│ │ ├── genga.svg
│ │ ├── icon.svg
│ │ ├── manfile.svg
│ │ ├── scan.svg
│ │ └── tachi.svg
│ ├── glossary
│ │ ├── anime
│ │ │ ├── akb.webp
│ │ │ ├── genga.webp
│ │ │ ├── sk.webp
│ │ │ ├── solo.webp
│ │ │ └── time.webp
│ │ ├── audio
│ │ │ ├── amp.png
│ │ │ ├── crinacle.jpg
│ │ │ ├── dac.png
│ │ │ ├── eq.png
│ │ │ ├── freq.png
│ │ │ ├── mermaid.png
│ │ │ ├── nsst1.jpg
│ │ │ ├── nsst2.jpg
│ │ │ ├── ogg.jpg
│ │ │ ├── pages.jpg
│ │ │ ├── sampling.jpg
│ │ │ ├── speaker.jpg
│ │ │ └── spec
│ │ │ │ ├── 128opusyt.jpg
│ │ │ │ ├── 16.jpg
│ │ │ │ ├── 160ogg.jpg
│ │ │ │ ├── 16alac.jpg
│ │ │ │ ├── 16t.jpg
│ │ │ │ ├── 192.jpg
│ │ │ │ ├── 24.jpg
│ │ │ │ ├── 2496dress.jpg
│ │ │ │ ├── 2496eva.jpg
│ │ │ │ ├── 256aac.jpg
│ │ │ │ ├── 256aacyt.jpg
│ │ │ │ ├── 256opus.jpg
│ │ │ │ ├── 256opusyt.jpg
│ │ │ │ ├── 320.jpg
│ │ │ │ ├── 320ogg.jpg
│ │ │ │ ├── instr.jpg
│ │ │ │ ├── sweep3.jpg
│ │ │ │ ├── sweep44.jpg
│ │ │ │ ├── sweep48.jpg
│ │ │ │ ├── v0.jpg
│ │ │ │ └── v0f.jpg
│ │ ├── family_terms_chart_pdf_page-0001.jpg
│ │ ├── family_terms_chart_pdf_page-0002.jpg
│ │ ├── file
│ │ │ ├── af.png
│ │ │ └── mf.png
│ │ ├── general
│ │ │ ├── bakadare.webp
│ │ │ ├── byoukidere.webp
│ │ │ ├── dandere.webp
│ │ │ ├── deredere.webp
│ │ │ ├── goudere.webp
│ │ │ ├── hajidere.webp
│ │ │ ├── hinedere.webp
│ │ │ ├── hiyakasudere.webp
│ │ │ ├── kanedere.webp
│ │ │ ├── kekkondere.webp
│ │ │ ├── kuudere.webp
│ │ │ ├── mayadere.webp
│ │ │ ├── nemuidere.webp
│ │ │ ├── nyandere.webp
│ │ │ ├── sadodere.webp
│ │ │ ├── yandere.webp
│ │ │ └── yottadere.webp
│ │ ├── manga
│ │ │ ├── adaptation.webp
│ │ │ ├── artistside.webp
│ │ │ ├── compare.webp
│ │ │ ├── danke.webp
│ │ │ ├── omnibus.webp
│ │ │ ├── oneshot.webp
│ │ │ ├── pattern.png
│ │ │ ├── raw.webp
│ │ │ ├── sfx.webp
│ │ │ ├── symbol.gif
│ │ │ ├── tankoubon.webp
│ │ │ ├── tl.webp
│ │ │ ├── webcomic.webp
│ │ │ └── webtoon.webp
│ │ └── panel
│ │ │ ├── 4koma.webp
│ │ │ ├── 4komagrid.webp
│ │ │ ├── 4komaillust.webp
│ │ │ ├── 4komapanels.webp
│ │ │ ├── gnrl.webp
│ │ │ ├── gnrlspread.webp
│ │ │ ├── spread_1.webp
│ │ │ ├── spread_1_5.webp
│ │ │ ├── spread_1andahalf.webp
│ │ │ ├── spread_2.webp
│ │ │ └── spread_5.webp
│ ├── iconname.png
│ ├── music
│ │ ├── mcm.webp
│ │ ├── mdl.webp
│ │ ├── mis.webp
│ │ ├── mpc.webp
│ │ ├── mph.webp
│ │ ├── mst.webp
│ │ ├── msv.webp
│ │ ├── mus.webp
│ │ └── radio.webp
│ ├── pfp
│ │ ├── denpa.jpg
│ │ ├── green.webp
│ │ ├── ishtar.png
│ │ ├── nuff.png
│ │ ├── oak.png
│ │ └── xra.png
│ ├── robots.txt
│ ├── ss
│ │ ├── cubariss.png
│ │ ├── feshin.gif
│ │ ├── fmd
│ │ │ ├── allow.png
│ │ │ ├── cg.png
│ │ │ ├── fmd.png
│ │ │ └── progress.png
│ │ ├── foobar
│ │ │ ├── fb5_5.png
│ │ │ ├── fbs1.png
│ │ │ ├── fbs2.png
│ │ │ ├── fbs3.png
│ │ │ ├── fbs4.png
│ │ │ ├── fbs5.png
│ │ │ ├── fbs6.png
│ │ │ ├── fbs7.png
│ │ │ └── fbsavesub.png
│ │ ├── freac.png
│ │ ├── irc
│ │ │ ├── skull.webp
│ │ │ ├── sunxdcc.png
│ │ │ └── xdcceu.png
│ │ ├── jd.png
│ │ ├── mado
│ │ │ ├── autohex.png
│ │ │ ├── autorev.png
│ │ │ ├── cnnctrzn.png
│ │ │ ├── fav1.png
│ │ │ ├── gacha.gif
│ │ │ ├── madohome.png
│ │ │ ├── rirc.png
│ │ │ ├── rzncnfrm.png
│ │ │ └── tachi.png
│ │ ├── ns
│ │ │ ├── ddl_1.png
│ │ │ ├── ddl_2.png
│ │ │ └── ddl_3.png
│ │ ├── nyaagreen.png
│ │ ├── nyaared.png
│ │ ├── opds
│ │ │ ├── connect-share-enabled.png
│ │ │ ├── connect-share.png
│ │ │ ├── kcc-ui.png
│ │ │ ├── koreader-adding-opds.png
│ │ │ ├── koreader-inside-opds-catalog.png
│ │ │ └── koreader-opds-catalog.png
│ │ ├── open.png
│ │ ├── qbit
│ │ │ ├── bind.png
│ │ │ ├── creator.png
│ │ │ ├── rss1.png
│ │ │ ├── rss2.png
│ │ │ ├── rss3.png
│ │ │ └── rss4.png
│ │ ├── scaling.png
│ │ ├── seq.png
│ │ ├── shipping.gif
│ │ ├── singularity.png
│ │ ├── squidify.png
│ │ └── waifu.jpg
│ ├── takodachi.webp
│ └── torrenting
│ │ ├── ipad1.jpg
│ │ ├── ipad2.jpg
│ │ ├── ipad3.jpg
│ │ ├── ipad4.jpg
│ │ ├── lib1.png
│ │ ├── lib2.png
│ │ ├── lib3.png
│ │ ├── lib4.png
│ │ ├── lib5.png
│ │ ├── lib6.png
│ │ ├── lib7.png
│ │ ├── mag1.png
│ │ ├── mag2.png
│ │ ├── mag3.png
│ │ ├── start
│ │ ├── 0.png
│ │ ├── 1.png
│ │ ├── 100.png
│ │ ├── 2.png
│ │ ├── 3.png
│ │ ├── 5.png
│ │ ├── 6.png
│ │ ├── 7.png
│ │ └── 8.png
│ │ ├── tor1.png
│ │ ├── tor2.png
│ │ └── tor3.png
├── qs.md
├── sandbox
│ └── test.md
├── scanlation.md
├── software.md
├── start.md
├── t.md
├── tools.md
├── torrenting
│ ├── faq.md
│ ├── glossary.md
│ ├── qbit.md
│ ├── start.md
│ └── trackers.md
├── vtuber.md
└── websites.md
├── nitro.config.ts
├── package.json
├── pnpm-lock.yaml
├── svgo.config.mjs
├── tsconfig.json
├── unocss.config.ts
└── wrangler.toml
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto eol=lf
2 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | docs/.vitepress/**/* @taskylizard
2 | api/**/* @taskylizard
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | **/.vitepress/dist
3 | **/.vitepress/cache
4 | **/.vitepress/.temp
5 | dev-dist
6 | *.log*
7 | .nitro
8 | .cache
9 | .output
10 | .env
11 | dist
12 | .eslintcache
13 | # There should be only pnpm-lock.yaml for faster builds on Pages
14 | package-lock.json
15 |
--------------------------------------------------------------------------------
/.licenserc.json:
--------------------------------------------------------------------------------
1 | {
2 | "**/*.ts": [
3 | "/**",
4 | "* All Rights Reserved",
5 | "*",
6 | "* Copyright (c) 2025 taskylizard",
7 | "*",
8 | "* All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.",
9 | "*/"
10 | ],
11 | "**/*.vue": [
12 | ""
19 | ],
20 | "**/*.css": [
21 | "/**",
22 | " * All Rights Reserved",
23 | " *",
24 | " * Copyright (c) 2025 taskylizard",
25 | " *",
26 | " * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.",
27 | " */"
28 | ],
29 | "ignore": [
30 | "node_modules",
31 | "dist",
32 | "docs/.vitepress/dist",
33 | "docs/.vitepress/cache"
34 | ]
35 | }
36 |
--------------------------------------------------------------------------------
/.prettierrc.yaml:
--------------------------------------------------------------------------------
1 | proseWrap: never
2 | semi: false
3 | singleQuote: true
4 | printWidth: 80
5 | trailingComma: none
6 | htmlWhitespaceSensitivity: ignore
7 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "vue.server.includeLanguages": ["vue"],
3 | "editor.formatOnSave": true,
4 | // Default formatter
5 | "editor.defaultFormatter": "esbenp.prettier-vscode",
6 | "[typescript]": {
7 | "editor.formatOnSave": true
8 | },
9 | "[vue]": {
10 | "editor.formatOnSave": true
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | All Rights Reserved
2 |
3 | Copyright (c) 2025 taskylizard
4 |
5 | All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #
Wotaku
2 |
3 | An otaku index for everything! Kindly consider giving the repository a ⭐ star. This motivates us to
4 | enhance the wiki further. Also, don't hesitate to [suggest ideas](#submitting-a-link).
5 |
6 | # What is in the Wiki?
7 |
8 | - Curated Websites for [anime](https://wotaku.wiki/websites#anime),
9 | [manga](https://wotaku.wiki/websites#manga), [music](https://wotaku.wiki/music),
10 | [novels](https://wotaku.wiki/websites#novels) & [games](https://wotaku.wiki/games).
11 | - Anime, manga & novel software for [Android](https://wotaku.wiki/software#android),
12 | [PC](https://wotaku.wiki/software#pc) & [iOS](https://wotaku.wiki/software#ios).
13 | - Various sites for [db, tracker & info](https://wotaku.wiki/misc#info),
14 | [illustrations](https://wotaku.wiki/misc#illustrations),
15 | [utility](https://wotaku.wiki/misc#utility) & [vtuber](https://wotaku.wiki/vtuber)
16 | - Other related software for [phone](https://wotaku.wiki/tools#phone) &
17 | [PC](https://wotaku.wiki/tools#pc), [extensions](https://wotaku.wiki/tools#extensions) &
18 | [scripts](https://wotaku.wiki/tools#scripts)
19 | - A rich list of resources to help you study the
20 | [japanese language](https://wotaku.wiki/japan/language) and
21 | [culture](https://wotaku.wiki/japan/culture).
22 | - Various resources for [merch](https://wotaku.wiki/merch) &
23 | [scanlation](https://wotaku.wiki/scanlation).
24 |
25 | # Submitting a link
26 |
27 | ## ⛔️ Things we won't add in the wiki
28 |
29 | 1. Websites that are only or primarily for generative AI (Chatbot, roleplaying bot, ai art generator
30 | etc.)
31 | 2. Sites that
32 | - imitate other websites
33 | - have very small libraries
34 | - only feature MTL'd works
35 | - are mostly paywalled
36 | - sell unofficial merch
37 | - exclusively sell sex toys
38 | 3. Adult content sites similar to OnlyFans
39 | 4. Software that's too general (for example Windows OS related or Tweaking for privacy)
40 | 5. Sites focused on lolicon or furry stuff
41 | 6. Sites scraping only one or two common sources, such as HiAnime or Animepahe
42 | 7. Sites found in the Unsafe lists of [FMHY](https://fmhy.net/unsafesites), [Privateersclub](https://megathread.pages.dev/unsafe) and/or [r/PiratedGames](https://rentry.org/pgames#untrusted-sites)
43 |
44 | ## ⚠️ Things we will try to avoid
45 |
46 | 1. Closed source software (with good FOSS alternatives)
47 | 2. Sites that only use hosters such Katfile, Nitroflare, DDownload and Rapidgator
48 | 3. Sites that aren't primarily for anime, but have it as a side product
49 | 4. Things that are too niche and/or have a small userbase
50 |
51 | ## Wiki
52 |
53 | You can click the **Feedback** button to send us your link or any suggestion. You don't have to make
54 | a Github or Discord account.
55 |
56 | ## GitHub
57 |
58 | You can also post an [issue](https://github.com/wotakumoe/Wotaku/issues/new) on the Github page.
59 |
60 | > [!NOTE]
61 | > This makes it easier for me to add it to the wiki, since we need to maintain the categories and markdown style.
62 |
63 |
64 | ## Discord
65 |
66 | You can submit any feedback in our [discord server](https://discord.gg/vShRGx8ZBC) too!
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | > [!Warning]
77 | > We may choose not to add the site if it is redundant or if it does not meet our preferences.
78 |
79 | # Wotaku Star History
80 |
81 | 
82 |
--------------------------------------------------------------------------------
/api/middleware/cors.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import { corsEventHandler } from 'nitro-cors'
9 |
10 | export default corsEventHandler((_event) => {}, {
11 | origin: '*',
12 | methods: '*'
13 | })
14 |
--------------------------------------------------------------------------------
/api/routes/index.post.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import { fetcher } from 'itty-fetcher'
9 | import {
10 | FeedbackSchema,
11 | getFeedbackOption
12 | } from '../../docs/.vitepress/types/Feedback'
13 |
14 | export default defineEventHandler(async (event) => {
15 | const { message, page, type, heading } = await readValidatedBody(
16 | event,
17 | FeedbackSchema.parseAsync
18 | )
19 | const env = useRuntimeConfig(event)
20 |
21 | const fields = [
22 | {
23 | name: 'Page',
24 | value: page,
25 | inline: true
26 | },
27 | {
28 | name: 'Message',
29 | value: message,
30 | inline: false
31 | }
32 | ]
33 |
34 | if (heading) {
35 | fields.unshift({
36 | name: 'Section',
37 | value: heading,
38 | inline: true
39 | })
40 | }
41 |
42 | // FIXME: somehow this is not working, but it worked before
43 | // const path = 'feedback'
44 | //
45 | // const { success } = await env.MY_RATE_LIMITER.limit({ key: path })
46 | // if (!success) {
47 | // return new Response('429 Failure – global rate limit exceeded', {
48 | // status: 429
49 | // })
50 | // }
51 |
52 | await fetcher()
53 | .post(env.WEBHOOK_URL, {
54 | username: 'Feedback',
55 | embeds: [
56 | {
57 | color: 3447003,
58 | title: getFeedbackOption(type)!.label,
59 | fields
60 | }
61 | ]
62 | })
63 | .catch((error) => {
64 | throw new Error(error)
65 | })
66 |
67 | return { status: 'ok' }
68 | })
69 |
--------------------------------------------------------------------------------
/api/routes/op.post.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import { joinURL } from 'ufo'
9 |
10 | export default defineEventHandler(async (event) => {
11 | const config = useRuntimeConfig(event).op
12 |
13 | try {
14 | const target = joinURL(config.url, 'track')
15 |
16 | const headers = {
17 | 'X-Forwarded-For': getRequestIP(event, { xForwardedFor: true }),
18 | 'Content-Type': 'application/json',
19 | 'openpanel-client-id': config.id,
20 | }
21 |
22 | headers['openpanel-sdk-name'] = 'nitro'
23 | headers['openpanel-sdk-version'] = '1.0.0'
24 |
25 | return proxyRequest(event, target, {
26 | headers,
27 | })
28 | }
29 | catch (error) {
30 | console.error(error)
31 |
32 | throw createError({
33 | statusCode: 502,
34 | message: 'Failed to proxy request',
35 | })
36 | }
37 | })
38 |
--------------------------------------------------------------------------------
/api/routes/single-page.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import { fetcher } from 'itty-fetcher'
9 |
10 | // Look inside tbe docs directory
11 | const GITHUB_REPO =
12 | 'https://api.github.com/repos/wotakumoe/wotaku/contents/docs/'
13 | const EXCLUDE_FILES = ['README.md', 'index.md', 'credits.md', 'faq.md']
14 | const EXCLUDE_DIRECTORIES = ['glossary/', 'guides/', 'torrenting/']
15 |
16 | interface File {
17 | name: string
18 | path: string
19 | sha: string
20 | size: number
21 | url: string
22 | html_url: string
23 | git_url: string
24 | download_url: string | null
25 | type: string
26 | _links: {
27 | self: string
28 | git: string
29 | html: string
30 | }
31 | }
32 |
33 | export default defineEventHandler(async (event) => {
34 | let body = '\n'
35 | const f = fetcher({
36 | headers: {
37 | 'User-Agent': 'taskylizard'
38 | }
39 | })
40 |
41 | try {
42 | // Fetch the list of files in the repository
43 | const files = await f.get(GITHUB_REPO)
44 |
45 | // Filter out the excluded files and non-markdown files
46 | const markdownFiles = files.filter((file: File) => {
47 | const isExcludedFile = EXCLUDE_FILES.includes(file.name)
48 | const isInExcludedDirectory = EXCLUDE_DIRECTORIES.some((dir) =>
49 | file.path.startsWith(dir)
50 | )
51 | const isMarkdownFile = file.name.endsWith('.md')
52 |
53 | return isMarkdownFile && !isExcludedFile && !isInExcludedDirectory
54 | })
55 |
56 | // console.info(markdownFiles.map((f) => f.name))
57 |
58 | // Fetch and concatenate the contents of the markdown files
59 | const contents = await Promise.all(
60 | markdownFiles.map(async (file: File) => {
61 | const content = await f.get(file.download_url)
62 | return content
63 | })
64 | )
65 |
66 | body += contents.join('\n\n')
67 | } catch (error) {
68 | return {
69 | status: 500,
70 | body: `Error fetching markdown files: ${error.message}`
71 | }
72 | }
73 |
74 | // biome-ignore lint/correctness/noUndeclaredVariables:
75 | appendResponseHeader(event, 'content-type', 'text/markdown;charset=utf-8')
76 | return body
77 | })
78 |
--------------------------------------------------------------------------------
/api/routes/test.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | export default eventHandler(() => {
9 | return { nitro: 'works' }
10 | })
11 |
--------------------------------------------------------------------------------
/api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../.nitro/types/tsconfig.json"
3 | }
4 |
--------------------------------------------------------------------------------
/docs/.vitepress/README/__og_image__/og.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wotakumoe/wotaku/17310671a1e6393b51638bedc78a6e73fc2135cc/docs/.vitepress/README/__og_image__/og.png
--------------------------------------------------------------------------------
/docs/.vitepress/config.mts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitepress'
2 | import { shared } from './configs'
3 |
4 | export default defineConfig(shared)
5 |
--------------------------------------------------------------------------------
/docs/.vitepress/configs/fonts/Inter-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wotakumoe/wotaku/17310671a1e6393b51638bedc78a6e73fc2135cc/docs/.vitepress/configs/fonts/Inter-Bold.otf
--------------------------------------------------------------------------------
/docs/.vitepress/configs/fonts/Inter-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wotakumoe/wotaku/17310671a1e6393b51638bedc78a6e73fc2135cc/docs/.vitepress/configs/fonts/Inter-Medium.otf
--------------------------------------------------------------------------------
/docs/.vitepress/configs/fonts/Inter-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wotakumoe/wotaku/17310671a1e6393b51638bedc78a6e73fc2135cc/docs/.vitepress/configs/fonts/Inter-Regular.otf
--------------------------------------------------------------------------------
/docs/.vitepress/configs/fonts/Inter-SemiBold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wotakumoe/wotaku/17310671a1e6393b51638bedc78a6e73fc2135cc/docs/.vitepress/configs/fonts/Inter-SemiBold.otf
--------------------------------------------------------------------------------
/docs/.vitepress/configs/hooks/index.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | export * from './meta'
9 | export * from './opengraph'
10 |
--------------------------------------------------------------------------------
/docs/.vitepress/configs/hooks/satoriConfig.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import { readFile } from 'node:fs/promises'
9 | import { dirname, resolve } from 'node:path'
10 | import { fileURLToPath } from 'node:url'
11 | import { type SatoriOptions, defineSatoriConfig } from 'x-satori/vue'
12 | const __dirname = dirname(fileURLToPath(import.meta.url))
13 | const __fonts = resolve(__dirname, '../fonts')
14 |
15 | const fonts: SatoriOptions['fonts'] = [
16 | {
17 | name: 'Inter',
18 | data: await readFile(resolve(__fonts, 'Inter-Regular.otf')),
19 | weight: 400,
20 | style: 'normal'
21 | },
22 | {
23 | name: 'Inter',
24 | data: await readFile(resolve(__fonts, 'Inter-Medium.otf')),
25 | weight: 500,
26 | style: 'normal'
27 | },
28 | {
29 | name: 'Inter',
30 | data: await readFile(resolve(__fonts, 'Inter-SemiBold.otf')),
31 | weight: 600,
32 | style: 'normal'
33 | },
34 | {
35 | name: 'Inter',
36 | data: await readFile(resolve(__fonts, 'Inter-Bold.otf')),
37 | weight: 700,
38 | style: 'normal'
39 | }
40 | ]
41 |
42 | export default defineSatoriConfig({
43 | width: 1800,
44 | height: 900,
45 | fonts,
46 | props: {
47 | title: 'Very Long Title so that I Can See How Shit Looks',
48 | description:
49 | 'Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.',
50 | dir: '/j'
51 | }
52 | })
53 |
--------------------------------------------------------------------------------
/docs/.vitepress/configs/markdown/headers.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import type { MarkdownRenderer } from 'vitepress'
9 |
10 | const excluded = ['Credits']
11 |
12 | export const headersPlugin = (md: MarkdownRenderer) => {
13 | // Add the Feedback component in the heading, before the link.
14 | //
15 | // Adding it after the link is closed prevents vitepress from properly
16 | // indexing the file's content.
17 |
18 | md.renderer.rules.heading_open = (tokens, idx, options, env, self) => {
19 | const result = self.renderToken(tokens, idx, options)
20 |
21 | const idxClose =
22 | idx +
23 | tokens.slice(idx).findIndex((token) => token.type === 'heading_close')
24 | if (idxClose <= idx) return result
25 |
26 | const level = tokens[idx].tag.slice(1)
27 | if (excluded.includes(env.frontmatter.title) || level !== '2') return result
28 |
29 | // Find the token for the link.
30 | //
31 | // The token after `heading_open` contains the link as a child token.
32 | const children = tokens[idx + 1].children || []
33 | const linkOpenToken = children.findLast((c) => c.type === 'link_open')
34 | if (!linkOpenToken) return result
35 |
36 | const heading = tokens[idxClose - 1]
37 |
38 | linkOpenToken.meta = linkOpenToken.meta || {}
39 | linkOpenToken.meta.feedback = {
40 | heading: heading.content
41 | }
42 |
43 | return result
44 | }
45 |
46 | let defaultRender = md.renderer.rules.link_open as any
47 |
48 | md.renderer.rules.link_open = (tokens, idx, options, env, self) => {
49 | const result = defaultRender(tokens, idx, options, env, self)
50 |
51 | const meta = tokens[idx].meta
52 | if (!meta || !meta.feedback) return result
53 |
54 | const heading = meta.feedback.heading || ''
55 | if (!heading) return result
56 |
57 | return `${result}`
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/docs/.vitepress/configs/markdown/index.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import MdMTables from 'markdown-it-multimd-table'
9 | // @ts-expect-error
10 | import MdReg from 'markdown-it-regexp'
11 | import type { MarkdownRenderer } from 'vitepress'
12 | import { headersPlugin } from '../markdown/headers'
13 | import { figure } from '@mdit/plugin-figure'
14 | import { imgLazyload } from '@mdit/plugin-img-lazyload'
15 | import { align } from '@mdit/plugin-align'
16 | import { imgSize } from '@mdit/plugin-img-size'
17 | import { tabsMarkdownPlugin } from 'vitepress-plugin-tabs'
18 | import { emojiRender } from './emoji'
19 | import { getTooltip } from '../../utils/tooltips'
20 | import { attrs } from '@mdit/plugin-attrs'
21 |
22 | export function configureMarkdown(md: MarkdownRenderer) {
23 | md.use(emojiRender)
24 | md.use(imgLazyload)
25 | md.use(align)
26 | md.use(figure)
27 | md.use(tabsMarkdownPlugin)
28 | md.use(imgSize)
29 | md.use(headersPlugin)
30 | md.use(MdMTables, {
31 | multiline: true,
32 | rowspan: true,
33 | headerless: true,
34 | multibody: true,
35 | aotolabel: true
36 | })
37 | md.use(attrs)
38 | renderTooltip(md)
39 | renderInlineTooltip(md)
40 | }
41 |
42 | function renderInlineTooltip(md: MarkdownRenderer) {
43 | md.use(
44 | MdReg(
45 | /\^\[(.*?)\]\((.+?)\)/,
46 | ([, cont, hint]: string[]) =>
47 | '' +
48 | span(md.renderInline(cont)) +
49 | '' +
50 | md.renderInline(hint) +
51 | ''
52 | )
53 | )
54 | }
55 |
56 | function renderTooltip(md: MarkdownRenderer) {
57 | md.use(
58 | MdReg(/==(.+?)==/, ([, cont]: string[]) => {
59 | const item = getTooltip(cont)
60 | if (!item) return `No tooltip found for ${cont}`
61 |
62 | const icon = item.frontmatter.icon
63 | ? `icon="${item.frontmatter.icon}"`
64 | : ''
65 |
66 | const title = item.frontmatter.title
67 | ? `title="${item.frontmatter.title}"`
68 | : item.id
69 | ? `title="${item.id}"`
70 | : '' /** Impossible */
71 | const props = icon + title
72 | const renderedContent = md.render(item.content)
73 |
74 | return `` + renderedContent + ''
75 | })
76 | )
77 | }
78 |
79 | function span(
80 | content: string,
81 | attrs: Record | undefined = undefined
82 | ) {
83 | let html = '${content}`
89 | return html
90 | }
91 |
--------------------------------------------------------------------------------
/docs/.vitepress/credits.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | interface Contributor {
9 | name: string
10 | avatar: string
11 | // Optional.
12 | site?: string
13 | }
14 |
15 | export interface Contributors {
16 | core: Contributor[]
17 | contributors: Contributor[]
18 | special: Contributor[]
19 | }
20 |
21 | export const contribs = {
22 | core: [
23 | {
24 | name: 'taskylizard',
25 | avatar: 'https://github.com/taskylizard.png',
26 | site: 'https://github.com/taskylizard'
27 | },
28 | {
29 | name: 'Duck',
30 | avatar: 'https://github.com/woducku.png',
31 | site: 'https://github.com/woducku'
32 | },
33 | {
34 | name: 'Memenami',
35 | avatar: 'https://github.com/memenami.png',
36 | site: 'https://github.com/memenami'
37 | },
38 |
39 | {
40 | name: 'Static',
41 | avatar: 'https://github.com/whitenoisy.png',
42 | site: 'https://github.com/whitenoisy'
43 | },
44 |
45 | {
46 | name: 'TubaApollo',
47 | avatar: 'https://github.com/TubaApollo.png',
48 | site: 'https://github.com/TubaApollo'
49 | },
50 | {
51 | name: 'Venlicht',
52 | avatar: 'https://github.com/RenaraScope.png',
53 | site: 'https://github.com/RenaraScope'
54 | },
55 | {
56 | name: 'Zinklog',
57 | avatar: 'https://github.com/zinklog2.png',
58 | site: 'https://github.com/zinklog2'
59 | }
60 | ],
61 | contributors: [
62 | {
63 | name: 'DenpaEater',
64 | site: 'https://x.com/shibayanfanclub',
65 | avatar: '/pfp/denpa.jpg'
66 | },
67 | {
68 | avatar: 'https://github.com/farahnur42.png',
69 | name: 'Fahim',
70 | site: 'https://github.com/farahnur42'
71 | },
72 | {
73 | name: 'nuff',
74 | avatar: '/pfp/nuff.png'
75 | },
76 | {
77 | avatar: '/pfp/green.webp',
78 | name: 'Green'
79 | },
80 | {
81 | avatar: 'https://github.com/Helmasko.png',
82 | name: 'Helmasko',
83 | site: 'https://github.com/Helmasko'
84 | },
85 | {
86 | name: 'Ishtar',
87 | avatar: '/pfp/ishtar.png'
88 | },
89 | {
90 | name: 'Kai',
91 | avatar: 'https://github.com/officialkaizen.png',
92 | site: 'https://github.com/officialkaizen'
93 | },
94 | {
95 | name: 'ld3z',
96 | avatar: 'https://github.com/ld3z.png',
97 | site: 'https://github.com/ld3z'
98 | },
99 | {
100 | name: 'loocool',
101 | avatar: 'https://github.com/loocool2.png',
102 | site: 'https://github.com/loocool2'
103 | }
104 | ],
105 | special: [
106 | {
107 | name: 'Kobayashi',
108 | avatar: 'https://github.com/kobayashi90.png',
109 | site: 'https://www.ryuko.space/'
110 | },
111 | {
112 | name: 'TubaApollo',
113 | avatar: 'https://github.com/TubaApollo.png',
114 | site: 'https://github.com/TubaApollo'
115 | }
116 | ]
117 | } satisfies Contributors
118 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/AnnouncementPill.vue:
--------------------------------------------------------------------------------
1 |
8 |
13 |
14 |
15 |
20 | {{ frontmatter.hero.announcement.title }}
21 |
22 |
23 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/Authors.vue:
--------------------------------------------------------------------------------
1 |
8 |
63 |
64 |
73 |
74 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/Badge.vue:
--------------------------------------------------------------------------------
1 |
8 |
19 |
20 |
21 |
23 |
24 | {{ text }}
25 |
26 |
27 |
28 |
94 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/Button.vue:
--------------------------------------------------------------------------------
1 |
8 |
19 |
20 |
21 |
23 |
24 | {{ text }}
25 |
26 |
27 |
28 |
53 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/CardField.vue:
--------------------------------------------------------------------------------
1 |
8 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/Contributors.vue:
--------------------------------------------------------------------------------
1 |
8 |
14 |
15 |
16 | Core Team
17 |
18 |
26 |
27 | Contributors
28 |
29 |
37 |
38 | Special Thanks to
39 |
40 |
48 |
49 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/GradientCard.vue:
--------------------------------------------------------------------------------
1 |
8 |
55 |
56 |
57 |
62 |
63 |
64 |
65 | {{ props.tag }}
66 |
67 |
68 |
69 |
72 |
75 |
76 |
99 |
100 | {{ props.description }}
101 |
102 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/NewDomainBanner.vue:
--------------------------------------------------------------------------------
1 |
8 |
29 |
30 |
31 |
32 |
33 | wotaku.
34 |
moe
35 | is now
36 |
wotaku.wiki
37 | . Bookmark & share!!
38 |
39 |
45 |
46 |
47 |
48 |
69 |
70 |
102 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/NotFound.vue:
--------------------------------------------------------------------------------
1 |
8 |
14 |
15 |
16 |
17 |
18 |

19 |
404
20 |
21 | Umm.... you shouldn’t be here
22 |
23 |
24 |
25 | If you got here from a link, please click
26 |
27 |
33 |
34 | to report it.
35 |
36 |
37 |
38 |
39 |
40 |
115 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/OgImageTemplate.vue:
--------------------------------------------------------------------------------
1 |
8 |
11 |
12 |
13 |
16 |
17 |
18 |
19 | wotaku.wiki
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/PreferenceRadio.vue:
--------------------------------------------------------------------------------
1 |
8 |
37 |
38 |
39 | {{ text }}
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
90 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/ReloadPrompt.vue:
--------------------------------------------------------------------------------
1 |
8 |
30 |
31 |
32 |
33 |
36 |
37 | New content available, click the reload button to update.
38 |
39 |
42 |
46 |
47 |
48 |
49 |
50 |
88 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/SidebarCard.vue:
--------------------------------------------------------------------------------
1 |
8 |
19 |
20 |
21 |
23 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/Tooltip.vue:
--------------------------------------------------------------------------------
1 |
8 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
36 |
37 |
38 |
39 |
40 |
59 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/components/VPSwitchAppearance.vue:
--------------------------------------------------------------------------------
1 |
8 |
20 |
21 |
22 |
31 |
32 |
33 |
68 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/composables/medium-zoom.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import mediumZoom from 'medium-zoom'
9 | import { inject, nextTick, onMounted, watch } from 'vue'
10 | import type { Zoom } from 'medium-zoom'
11 | import type { App, InjectionKey } from 'vue'
12 | import type { Router } from 'vitepress'
13 |
14 | declare module 'medium-zoom' {
15 | interface Zoom {
16 | refresh: (selector?: string) => void
17 | }
18 | }
19 |
20 | export const mediumZoomSymbol: InjectionKey = Symbol('mediumZoom')
21 |
22 | export function useMediumZoom() {
23 | return onMounted(() => inject(mediumZoomSymbol)?.refresh())
24 | }
25 |
26 | export function createMediumZoomProvider(app: App, router: Router) {
27 | if (import.meta.env.SSR) return
28 | const zoom = mediumZoom()
29 | zoom.refresh = () => {
30 | zoom.detach()
31 | zoom.attach(':not(a) > img:not(.image-src)')
32 | }
33 | app.provide(mediumZoomSymbol, zoom)
34 | watch(
35 | () => router.route.path,
36 | () => nextTick(() => zoom.refresh())
37 | )
38 | }
39 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/composables/op.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import type { App, InjectionKey } from 'vue'
9 | import { Internal } from '../internal/browser'
10 |
11 | export const opSymbol: InjectionKey = Symbol('op')
12 |
13 | export function createOpProvider(app: App) {
14 | // Disable in dev
15 | if (import.meta.env.DEV) return
16 |
17 | const op = new Internal({
18 | clientId: 'e0e39d6b-2692-45a0-9422-4d668f113f70',
19 | trackScreenViews: true,
20 | trackOutgoingLinks: true,
21 | trackAttributes: true,
22 | trackHashChanges: true
23 | })
24 |
25 | op.init()
26 |
27 | app.provide(opSymbol, op)
28 | }
29 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/composables/useTooltips.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * All Rights Reserved
3 | *
4 | * Copyright (c) 2025 taskylizard
5 | *
6 | * All rights reserved. This code and its associated files may not be copied, modified, distributed, sublicensed, or used in any form, in whole or in part, without prior written permission from the copyright holder.
7 | */
8 | import { ref } from 'vue'
9 | import { getTooltip, type TooltipData } from 'virtual:tooltips'
10 |
11 | const tooltipCache = ref