431 Commits
Author SHA1 Message Date
YunYouJun 8a01bc9283 chore: update dependencies and eslint config 2026-02-25 22:38:37 +08:00
云游君 f648eecd1d feat: migrate from unplugin-vue-router to vue-router v5 (#563)
* feat: migrate from unplugin-vue-router to vue-router v5

* chore: update lock

* fix: resolve CI failures for vue-router v5 migration

- Fix ESLint import order in vite.config.ts
- Fix readonly routes type mismatch in src/main.ts by spreading routes array
- Upgrade vite to v7, vite-ssg to v28, beasties to v0.4, and other deps
- Update CI node matrix from [18.x, 20.x] to [20.x, 22.x]

* chore: upgrade vite-plugin-pwa and vitest

* fix: bump Node.js version to 22 for Iterator helpers support

vue-router v5 uses Iterator helpers (e.g. `seen.values().filter()`)
which require Node.js >= 22. Bump NODE_VERSION in netlify.toml from
20 to 22 to fix the Netlify build failure.
2026-02-25 16:36:23 +08:00
Kevin Deng abf64f7dd4 chore: remove HopeUI mention from vitesse-solid
closes #556
2025-09-24 21:30:56 +08:00
Carlos MarquesandKevin Deng c6e86f9b70 chore: update readme to recommend latest nuxt [ci] (#555)
Co-authored-by: Kevin Deng <sxzz@sxzz.moe>
2025-09-01 14:51:10 +08:00
bee1an e35b3691ee fix: error occurred when using "definePage" (#553) 2025-07-02 08:25:34 +09:00
IlyaL 309e68842b fix: copy pnpm-workspace.yaml for catalog resolution (#550) 2025-04-08 12:48:48 +08:00
Anthony Fu ae4e3c3885 chore: migrate to pnpm catalogs 2025-03-27 13:23:03 +09:00
Anthony Fu 136a8b5210 chore: update deps 2025-03-27 13:08:18 +09:00
Joaquín SánchezandAnthony Fu 63fde48052 feat: use unhead v2 (#549)
Co-authored-by: Anthony Fu <github@antfu.me>
2025-03-27 12:01:09 +08:00
Robin 73f71ecb7d chore: fix docker FromAsCasing lint (#548)
https://docs.docker.com/reference/build-checks/from-as-casing/
2025-03-27 02:42:08 +09:00
Anthony Fu 1a8103174b chore: update deps 2025-01-13 09:57:38 +08:00
Anthony Fu 1be2283ade feat: update deps, remove vite-plugin-webfont-dl in favor of UnoCSS's preprocessor 2025-01-09 16:49:08 +08:00
Anthony Fu fa9243efcd chore: update deps 2024-12-26 12:51:27 +08:00
Anthony Fu 47618e72df chore: update deps 2024-12-24 14:13:14 +08:00
Anthony Fu 6021ee88c0 chore: update deps 2024-12-16 14:21:35 +08:00
Anthony Fu b15eaad009 chore: apply lint 2024-12-03 14:00:28 +08:00
Anthony Fu fc5937b265 feat: update deps, serve web fonts with the app 2024-12-03 14:00:12 +08:00
Anthony Fu fd4e995e9d chore: apply lint 2024-11-27 18:28:02 +08:00
Anthony Fu ed78eddd12 chore: update deps 2024-11-27 17:49:03 +08:00
Anthony Fu 27fd4cfff1 chore: update vscode settings 2024-08-24 16:25:55 +02:00
Anthony Fu af98e65f04 chore: update deps 2024-08-24 16:25:32 +02:00
0x0001 cf60aef54d chore: update .npmrc (#542) 2024-08-24 16:15:38 +02:00
Charlie ✨ 6e97ede814 docs: add new community template (#541) 2024-08-14 17:56:38 +02:00
Anthony Fu 0ab412e22d docs: update links 2024-08-03 18:41:13 +02:00
Anthony Fu 08d4c70ac2 chore: update deps 2024-08-03 18:39:05 +02:00
Anthony Fu de4341d582 chore: update deps 2024-05-19 04:14:38 +02:00
Anthony Fu 5ec4b19309 chore: update deps, close #535 2024-05-14 20:46:13 +02:00
Joaquín Sánchez 33ce1533d6 chore: add antfu open collective (#533) 2024-05-12 04:38:37 +02:00
Anthony Fu 8548475ec5 chore: update deps 2024-04-18 13:47:14 +02:00
Amorites 3ff98f992f chore: update link (#528) 2024-04-09 21:25:05 +02:00
Horu 814a0e826d fix: add missing safelist class (#527) 2024-04-03 00:11:49 +02:00
Anthony Fu acd960e6bc chore: update deps 2024-04-01 14:02:02 +02:00
krupp d32c3089d6 chore: update url (#525) 2024-03-13 21:07:10 +01:00
小的的 DeDe 550b24d2fd chore: update action version (#522) 2024-03-10 16:59:45 +01:00
Anthony Fu 289496e78d chore: update deps 2024-02-29 14:15:21 +01:00
shellingfordly c5d5425e92 chore: update deps (#519) 2024-01-14 18:51:02 +01:00
Anthony Fu 4a2107ea98 chore: lint 2023-12-27 15:26:00 +01:00
Anthony Fu 992d731e40 chore: update deps 2023-12-27 15:23:15 +01:00
Anthony Fu 924e913ce9 chore: enable also toml formatting 2023-12-04 18:03:25 +01:00
Anthony Fu 2cbd287bfb chore: update 2023-12-04 17:46:13 +01:00
Anthony Fu 4b67fa5e78 chore: disable prettier in eslint config, do not use it 2023-12-03 02:45:50 +01:00
Anthony Fu 0ff5a792fe chore: update deps 2023-12-02 22:19:41 +01:00
Guany 3f48f5d3f4 chore: move typed-router.d.ts to src and update version to 20 (#516) 2023-11-27 09:26:41 +01:00
Anthony Fu 4b5f999a23 chore: update deps 2023-11-20 20:12:38 +01:00
Anthony Fu 8a12214e4d chore: update 2023-11-16 18:10:15 +01:00
Anthony Fu e3cbeb3301 chore: update to vite 5 2023-11-16 18:05:27 +01:00
yeojongki 009a05dea9 fix: dynamic route parameters (#515) 2023-11-13 10:59:30 +01:00
yuyin ccad06d9dd feat: replace vite-plugin-pages by unplugin-vue-router (#513) 2023-11-09 12:24:26 +01:00
Anthony Fu 2fafa6f250 chore: update deps 2023-11-03 04:58:56 +09:00
Anthony Fu 8ee0a4d7d6 chore: update deps 2023-10-26 16:51:48 +09:00
Anthony Fu 92e638bd16 chore: update to Vite 5 2023-10-26 12:27:57 +09:00
Anthony Fu 22aab15a56 chore: update deps 2023-10-17 17:20:44 +08:00
Anthony Fu 93ef7cbdee chore: update snap 2023-10-11 18:19:31 +08:00
Anthony Fu 0f52e8b22c chore: lint 2023-10-11 18:01:38 +08:00
Anthony Fu e834b528e0 feat: migrate to shikiji 2023-10-11 18:00:59 +08:00
Anthony Fu 1a42d7973b chore: fix vscode eslint setup 2023-09-28 08:46:37 +08:00
Anthony Fu e775922ace chore: update deps, migrate to new ESLint config format 2023-09-28 08:02:17 +08:00
Anthony Fu c36e00a224 chore: update ci 2023-09-19 23:39:47 +08:00
Anthony Fu e6d7a25d9f chore: update deps 2023-09-19 23:38:53 +08:00
Viktor Szépe 4ae1b6cf6f chore: fix typo in README (#504) 2023-08-08 01:30:43 +02:00
Benny Yen c31459ca2b ci: use vite preview to start prod build (#503) 2023-08-04 19:00:16 +02:00
Anthony Fu d97eead878 chore: update readme 2023-07-12 12:31:01 +02:00
Anthony Fu d148cab55a chore: update deps 2023-07-12 12:20:01 +02:00
Anthony Fu c9b4f3fb0d chore: update 2023-07-05 14:53:47 +02:00
Anthony Fu 5a7ea42ebf chore: update deps 2023-05-23 14:46:12 +02:00
Anthony Fu b49f942b3a chore: dedupe packages 2023-05-23 14:29:17 +02:00
Anthony Fu 86a2b37005 chore: update deps 2023-05-23 14:05:37 +02:00
Anthony Fu 0aa905f772 chore: update lock 2023-05-23 13:45:59 +02:00
Anthony Fu 4f9a72bf09 chore: update deps 2023-05-23 13:43:32 +02:00
webfansplz 0ca3ab5cfd feat: add vue-devtools plugin (#499) 2023-05-23 13:42:17 +02:00
oseau e1ec57be81 fix: dynamic placeholder (#494) 2023-05-16 10:55:34 +02:00
Kirk Lin 131a45e6ed fix: tsconfig (#498) 2023-05-16 10:54:53 +02:00
Anthony Fu f90b509344 chore: downgarde eslint 2023-05-15 10:09:14 +02:00
Anthony Fu c9d13ea857 chore: update deps 2023-05-15 10:05:25 +02:00
Anthony Fu 79e7f8d221 chore: update deps 2023-05-12 16:00:52 +02:00
Anthony Fu bf647d8db9 chore: update deps 2023-05-08 00:16:49 +02:00
Alisher Usmonov 2367db4ae9 feat(lang): Add Uzbek language (#493) 2023-05-05 09:48:53 +02:00
Jawil 58e0687eb0 docs: update uno comments in vite.config.ts (#489) 2023-04-21 12:42:30 +02:00
Anthony Fu 12c56497b5 chore: type error 2023-04-18 18:48:26 +02:00
Anthony Fu d62b83b0b7 chore: clean up 2023-04-18 18:44:16 +02:00
Khamzat cc7f7fe146 refactor: remove deprecated reactivity transform (#487) 2023-04-18 18:40:47 +02:00
M.PacandAnthony Fu 99c52ed4e5 feat: add <noscript> message (#486)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-04-14 14:05:56 +02:00
Anthony Fu a10bb5bd9c chore: fix layout 2023-04-11 14:41:08 +02:00
Anthony Fu 0bd792022a chore: update deps 2023-04-11 14:22:34 +02:00
Anthony Fu 786168abdb chore: downgrade typescript for now 2023-03-27 17:21:16 +02:00
Anthony Fu 108be1e211 chore: update deps 2023-03-27 12:43:32 +02:00
Martin DONADIEUandAnthony Fu c75bb79786 feat: i18n locales lazy loading (#482)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-03-27 12:17:23 +02:00
Mohammad AtaeiandAnthony Fu 2c00f8ba6d feat: use cypress-vite for running e2e tests (#467)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-03-27 12:04:55 +02:00
Bálint SzekeresandAnthony Fu 9071f056b4 feat: webfont plugin (#468)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-03-27 12:02:33 +02:00
Anthony Fu 3df765394b chore: update deps 2023-03-20 09:47:01 +01:00
Anthony Fu eaa484d17d feat: add lint-staged 2023-03-04 15:31:40 +01:00
Anthony Fu ce03c11956 chore: update deps 2023-03-04 15:29:19 +01:00
Joaquín Sánchez b1a1bc5f81 docs: update LICENSE adding PRESENT (#471) 2023-02-07 17:19:25 +01:00
Anthony Fu 22a721d7f5 docs: remove inactive community template 2023-01-20 13:06:05 +01:00
xchen b27436b0c4 docs: add new community template (#451) 2023-01-20 13:03:00 +01:00
Anthony Fu 795832d3ce chore: upgrade deps 2023-01-20 12:55:54 +01:00
webfansplz 5abdc86be4 chore: upgrade vite-plugin-vue-inspector (#461) 2023-01-20 12:55:14 +01:00
Carmine 75e6271656 docs: update vite-plugin-vue-i18n to unplugin-vue-i18n in README.zh-C… (#464) 2023-01-09 11:20:26 +01:00
Kirk Lin 12d3179e6b chore: upgrade unplugin-vue-i18n reference link (#458) 2022-12-21 16:28:52 +01:00
Kirk Lin 2d24af2ff2 docs: upgrade vite-plugin-vue-i18n to unplugin-vue-i18n (#457) 2022-12-21 09:46:33 +01:00
云游君 73817a6aa3 chore: upgrade vite-plugin-vue-i18n to unplugin-vue-i18n (#455) 2022-12-19 19:52:24 +01:00
Jean-Baptiste AUBRÉE d123129c97 feat: rename store folder to stores (#456) 2022-12-19 19:52:11 +01:00
chenglongandAnthony Fu 1974d8ece5 chore: doc update (#453)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2022-12-12 21:39:43 +01:00
Anthony Fu fcdde97418 chore: update deps 2022-12-12 10:55:49 +01:00
webfansplzandAnthony Fu fa7a068110 feat: add vite-plugin-vue-inspector plugin (#366)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2022-12-12 10:43:34 +01:00
tsotnesharvadze d749407544 i18n: locale support for Georgian (#446) 2022-12-12 10:29:47 +01:00
Anthony Fu 03a5e51d30 chore: update deps 2022-11-30 09:05:59 +08:00
Anthony Fu b0323be19c feat: update deps 2022-11-30 08:12:50 +08:00
Anthony Fu 01e0cbbb82 fix: use two words component name 2022-11-30 08:05:45 +08:00
三咲智子 Kevin Deng 2e425e13bd feat: add vue macros (#448) 2022-11-29 19:43:13 +08:00
Cully Fung 9cf5fdc0ce chore: typo (#449) 2022-11-25 16:00:50 +08:00
Anthony Fu 59763be7d3 chore: lint 2022-11-22 19:41:13 +08:00
Anthony Fu 176616cf1f chore: upgrade deps 2022-11-22 19:08:05 +08:00
Anthony Fu b701b5f6ef chore: update deps 2022-11-22 19:06:42 +08:00
Anthony Fu 12f0dad30a chore: update deps 2022-11-09 15:59:51 +08:00
Anthony Fu eacbc05f54 chore: update deps 2022-11-01 14:57:18 +08:00
Michael d9315bffa2 i18n: ukrainian translation (#438) 2022-10-25 13:25:27 +08:00
ハン / Han 7cad666d6e chore: remove pnpm workaround for netlify (#434) 2022-10-19 02:17:42 +09:00
Anthony Fu 92842ee640 chore: update deps 2022-10-08 18:37:49 +08:00
Renato Lacerda c9fdacfe27 docs: correct link to Component Preview repository on "Features" (#430) 2022-10-03 03:18:07 +08:00
Anthony Fu a0c8640bfa chore: update deps, close #425 2022-09-29 17:47:50 +08:00
Anthony Fu 03032b3412 chore: update deps 2022-09-27 09:35:53 +08:00
Johnson Chu b271f9795f docs: readme was incorrectly changed by #386 (#427) 2022-09-27 02:33:14 +08:00
Anthony Fu b9e0b65847 chore: lint 2022-09-26 12:52:01 +08:00
Anthony Fu 0b0cc70d0b chore: fix typecheck 2022-09-26 12:49:58 +08:00
Anthony Fu 0caa5aa9f4 chore: update deps 2022-09-26 12:04:12 +08:00
Johnson Chu 656953339b feat: add vite-plugin-vue-component-preview plugin (#386) 2022-09-22 14:15:24 +08:00
洪布斯 a1c3667472 chore: add @unocss/reset dependencies (#406) 2022-09-05 18:35:36 +08:00
木杉 c747a0ca6b docs: update pinia links (#415) 2022-09-05 18:35:12 +08:00
gamachexx 47d4b06c98 docs: added bat to the community versions (#412) 2022-09-01 00:36:54 +08:00
云游君 3b160d11a3 chore: add new community project for readme (#408) 2022-08-21 21:07:31 +08:00
云游君 69046fdd52 chore: fix typo (#407) 2022-08-21 21:06:48 +08:00
Yue JIN a9ee48c737 docs: update links (#401) 2022-08-08 16:34:38 +08:00
云游君 f9cdead935 chore: upgrade vite-plugin-vue-i18n for default export (#400) 2022-08-08 02:42:17 +08:00
Anthony Fu 3f6aab09e6 chore: bump pnpm 2022-08-06 23:26:44 +08:00
Anthony Fu 547106bf81 fix: set type: "module" 2022-08-06 23:26:17 +08:00
Anthony Fu e6d045e89f chore: upgrade deps 2022-08-06 23:25:55 +08:00
Anthony Fu cbbd9191fa feat: add up script for dep updating 2022-07-27 03:04:09 +08:00
Anthony Fu fa08cc38d9 chore: update deps 2022-07-27 03:03:18 +08:00
YuLe 9cab7e6a26 chore: upgrade vite-plugin-vue-layouts (#396) 2022-07-27 02:58:16 +08:00
Anthony Fu 3df35de330 chore: fix e2e test 2022-07-24 19:45:42 +08:00
Anthony Fu 456660ee6c chore: update lock 2022-07-24 19:30:17 +08:00
Anthony Fu 1f546793b7 feat: swtich to shiki for highlighting 2022-07-24 19:29:27 +08:00
Anthony Fu 0d5a777f14 chore: update deps 2022-07-24 15:03:04 +08:00
Anthony Fu a3059fb887 chore: bring back funding 2022-07-17 17:18:37 +08:00
Anthony Fu 93be359853 chore: cleanup github config 2022-07-17 17:17:43 +08:00
wengandAnthony Fu ba989ec48c docs: update node requirement (#390)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2022-07-17 14:34:49 +08:00
Rudraksh Karpe 134249936c chore: typo (#389) 2022-07-14 23:01:25 +08:00
Anthony Fu 03ea21235c chore: update deps 2022-07-14 18:12:01 +08:00
Senar 479dfe516a chore: doc update (#387) 2022-07-14 13:54:24 +08:00
Anthony Fu c316ca945c fix: migrate import.meta.glob 2022-07-14 03:19:15 +08:00
Anthony Fu a56c80efa2 feat: upgrade to vite 3.0 2022-07-14 03:15:25 +08:00
Hyobanandハン / Han 3fb2c7d828 docs: update docker build command (#384)
Co-authored-by: ハン / Han <16288797+hannoeru@users.noreply.github.com>
2022-07-06 15:05:21 +09:00
zhengxhui cb6d929ff8 docs: update links in readme (#383) 2022-07-04 23:27:59 +08:00
Zero King a1f2d0f6b9 docs: update links in readme (#381) 2022-07-01 23:53:15 +08:00
ハン / Han 0c36f39514 chore: fix container build and minimize container size (#380) 2022-07-01 00:09:36 +08:00
Mahdi Karimi 4d6d9b9d2f feat(deployment): docker file for vitesse (#378) 2022-06-30 21:47:22 +08:00
Anthony Fu d6f8290938 chore: update cypress action version 2022-06-30 13:31:39 +08:00
Anthony Fu c4bf1b8bb5 chore: upgrade cypress 2022-06-30 13:25:36 +08:00
HoorayandAnthony Fu 5fcfbf6188 feat: add .editorconfig file (#379)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2022-06-30 12:01:56 +08:00
Anthony Fu 9b71e24433 chore: update deps 2022-06-30 11:59:00 +08:00
Anthony Fu 3be931a39f chore: update eslint config 2022-06-25 01:04:50 +08:00
Anthony Fu 0c02666a53 fix: switch to vite-plugin-vue-markdown instead 2022-06-25 00:37:57 +08:00
Anthony Fu fc125871d8 chore: update deps 2022-06-25 00:33:06 +08:00
Nico Mayer 0eab2d066b chore: add new community template (#375) 2022-06-24 16:57:50 +08:00
Anthony Fu 52fdb6dd64 chore: update deps 2022-06-14 01:12:48 +08:00
Anthony Fu e90d7e6f27 chore: update deps 2022-06-14 01:10:53 +08:00
Anthony Fu 22442ba6d0 fix: remove html.d.ts
https://github.com/johnsoncodehk/volar/issues/1077#issuecomment-1146584565
2022-06-14 00:14:04 +08:00
Anthony Fu 7d84b7f9b0 chore: downgrade cypress for now
I don't have data bandwidth to download the binary atm so I can't test it now. PR welcome.
2022-06-03 22:30:12 +08:00
Anthony Fu e014365e9e fix: opt-out volar strictness 2022-06-03 22:15:26 +08:00
Anthony Fu 63edae16c0 chore: add vitest to types list, close #370 2022-05-27 15:48:10 +08:00
Anthony Fu 98c9129a0a chore: update deps 2022-05-27 13:17:41 +08:00
Anthony Fu c02e17387c chore: update deps 2022-05-25 05:34:52 +08:00
Jean-Baptiste AUBRÉEandJB Aubrée 1c3f769a0a fix: remove unused composable index (#369)
Co-authored-by: JB Aubrée <jb.aubree@digitsole.com>
2022-05-25 04:57:12 +08:00
Anthony Fu 0516afb654 chore: lint 2022-05-24 15:24:26 +08:00
Anthony Fu 4f220a63b4 feat: enable composable auto import 2022-05-24 15:17:55 +08:00
Anthony Fu 8b72b2ee74 chore: update deps 2022-05-24 15:08:07 +08:00
Jean-Baptiste AUBRÉEandJB Aubrée bd54e8690e fix: improve lighthouse accessibility (#362)
Co-authored-by: JB Aubrée <jb.aubree@digitsole.com>
2022-05-17 22:15:17 +08:00
ハン / Han 2c29e41d52 fix: favicon dark mode (#359) 2022-05-16 11:07:37 +08:00
Anthony Fu 0a8ef07345 chore: lock 2022-05-13 21:59:02 +08:00
Anthony Fu 39fbdfde46 chore: remove vite-plugin-vue-inspector 2022-05-13 21:57:01 +08:00
Anthony Fu f58fd970f3 chore: update lock 2022-05-11 14:08:07 +08:00
Anthony Fu fafcee8514 chore: update deps 2022-05-11 14:00:21 +08:00
webfansplz 0b31e5397d chore: upgrade Inspector plugin (#352)
* fix: only register `Inspector` plugin in dev mode

* chore: upgrade `Inspector` plugin
2022-05-08 08:28:13 +08:00
webfansplz 73cdd34040 feat: add vite-plugin-vue-inspector plugin (#350) 2022-05-08 07:19:16 +08:00
云游君 21b800509b feat: toggle meta theme-color with mode (#348)
* feat: toggle meta theme-color with mode

* chore: fix lint
2022-05-07 05:09:44 +08:00
Jabriel abedef1b2e docs: the heading 2 is rendered correctly (#346) 2022-05-05 05:09:13 +08:00
Anthony Fu 527743ae11 chore: cleanup unactive templates 2022-05-03 04:47:41 +08:00
Anthony Fu 0346286847 chore: update deps 2022-05-03 04:36:52 +08:00
倚窗听雨丿醉无心 1844470684 chore: update extensions (#344) 2022-05-02 23:14:33 +08:00
Anthony Fu 40cc21d784 chore: fix ci 2022-05-01 11:55:16 +08:00
Anthony Fu 0265022518 chore: lint 2022-05-01 11:52:59 +08:00
Anthony Fu 42abb64551 chore: update deps 2022-05-01 11:51:35 +08:00
Chris 0118cbeb77 chore: adjust the comment (#341) 2022-04-27 01:13:01 +08:00
Anthony Fu d33341d3ce chore: update deps 2022-04-21 20:44:33 +08:00
Anthony Fu 47c6604602 chore: revert i18n handling, close #337 2022-04-21 20:42:12 +08:00
Jean-Baptiste AUBRÉE 4c5b6babbd Update fr.yml (#336) 2022-04-20 22:33:47 +08:00
Chris 718bd018d0 chore: add code-spell-checker to recommendations (#334)
This is likely a good idea considering we use `cSpell.words` in the `settings.json`
2022-04-19 11:29:38 +08:00
ntnyq 225d10511e chore: tweak (#333) 2022-04-18 23:27:36 +08:00
hanlee 168fe35609 chore: update deps 2022-04-18 22:21:48 +09:00
Anthony Fu 53855817eb chore: update deps 2022-04-16 09:07:50 +08:00
云游君 a87a103c4c chore: remove @unocss/reset dependencies (#332) 2022-04-11 23:25:31 +08:00
Anthony Fu d087269b67 chore: use pascal for component names 2022-04-11 09:49:38 +08:00
Anthony Fu 25130ff54c chore: cleanup, close #331 2022-04-11 02:16:47 +08:00
Anthony Fu 22528386ff chore: update deps 2022-04-10 19:30:19 +08:00
Anthony Fu 7e922ae50c chore: update tsconfig.json 2022-04-10 19:27:30 +08:00
Anthony Fu 9d9b61cbd2 chore: downgrade vue-tsc 2022-04-10 11:29:02 +08:00
Anthony Fu d55eaca731 chore: update deps 2022-04-10 10:28:47 +08:00
wangzhaofei 672cc6afc5 chore: supply test (#328) 2022-04-08 18:32:53 +08:00
Anthony Fu 8808046f11 chore: update [ci-skip] 2022-04-07 10:46:59 +08:00
Anthony Fu 2dfd80a43e chore: update ci 2022-04-07 10:21:35 +08:00
Anthony Fu 34b6290cb4 chore: update ci 2022-04-07 10:21:09 +08:00
Anthony Fu 972de31f29 chore: update deps 2022-04-07 05:56:24 +08:00
Anthony Fu 5b66f9c43d chore: lint 2022-04-05 18:14:24 +08:00
Anthony Fu de904db49e chore: update deps 2022-04-05 18:14:15 +08:00
Brahim 2914479905 i18n: add arabic language (#326) 2022-04-04 09:06:55 +08:00
Anthony Fu 091fac3194 chore: update deps 2022-03-30 22:59:35 +08:00
Anthony Fu 8f62680475 chore: clean up 2022-03-30 21:20:26 +08:00
Cuvii d4e831355e feat: enable ref sugar by default & remove annoying warnings (#319) 2022-03-23 22:48:07 +08:00
云游君 d0f6274ac4 feat: only start nprogress when to from different (#318) 2022-03-23 19:14:02 +08:00
lxy-yzandAnthony Fu f1af7424e2 chore: add React fork of vitesse-lite to readme (#316)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2022-03-21 18:37:52 +08:00
Anthony Fu 56cc7f4927 chore: update deps 2022-03-17 19:55:49 +08:00
Anthony Fu 3f090563ef chore: update deps 2022-03-17 05:10:33 +08:00
hanlee f646185bf6 chore: update deps 2022-03-16 02:33:16 +09:00
Anthony Fu 899d651eff chore: update 2022-03-11 16:50:38 +08:00
Anthony Fu 23cfe42071 chore: update deps 2022-03-10 20:30:50 +08:00
Anthony Fu af1c31895f chore: update 2022-03-10 20:00:36 +08:00
Anthony Fu dcffd6cd5f chore: update pnpm ci 2022-03-10 19:29:10 +08:00
1848561b56 feat: add vite-plugin-pages-sitemap (#303)
Co-authored-by: JB Aubrée <jb.aubree@digitsole.com>
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2022-03-07 04:16:26 +08:00
hanlee 8b0302cb2b chore: update deps 2022-03-05 16:37:36 +09:00
Anthony Fu ccb6ba147d chore: update deps 2022-03-01 03:08:32 +08:00
Anthony Fu a0ad780104 chore: update deps 2022-02-27 13:57:36 +08:00
Anthony Fu fdfe13f313 chore: update deps 2022-02-27 13:44:36 +08:00
Anthony Fu 091a2d753b chore: update deps 2022-02-26 16:06:36 +08:00
Anthony Fu f85e863436 chore: update deps 2022-02-23 02:51:08 +08:00
Anthony Fu 5956b053f1 chore: update cypress 2022-02-17 21:06:42 +08:00
Anthony Fu 51671028c5 chore: update readme 2022-02-17 21:05:01 +08:00
Anthony Fu 44f6b3fd44 feat: move to unocss 2022-02-17 20:59:24 +08:00
Anthony Fu 31999466ef chore: update deps 2022-02-17 20:27:00 +08:00
菜猫子neko 3ccea350c5 docs: new template vitecamp (#299) 2022-02-14 17:56:11 +08:00
Anthony Fu 5eae30db72 chore: update deps 2022-02-11 17:50:24 +08:00
Priyam 34f8c298b0 chore: update README.md to reflect type for import (#297) 2022-02-10 13:23:50 +08:00
Anthony Fu 8c0dbddab8 chore: fix types 2022-02-07 10:16:27 +08:00
Anthony Fu e44b313cc1 chore: update 2022-02-07 10:11:57 +08:00
Anthony Fu 11fe28fc53 fix: uprade deps and resolve type conflicts 2022-02-07 10:08:07 +08:00
nielshoez af42fbac63 chore: typo (#288) 2022-01-27 07:59:28 +08:00
Joaquín Sánchez 4acdac40be docs: update SSG acronym (#287) 2022-01-27 05:32:20 +08:00
markthreeandAnthony Fu db4caecc65 docs: add Chinese translations (#286)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2022-01-25 22:13:42 +08:00
hanlee dcc7175ce5 fix: global type conflict, lock vitest version for now 2022-01-25 02:10:41 +09:00
hanlee 1010320cc6 fix: markdown link attrs matcher, close #284 2022-01-25 01:49:50 +09:00
hanlee ae0bcd2486 chore: update deps, close #285 2022-01-25 01:36:18 +09:00
Nenad Novaković 040fa6650c chore(IconsResolver): update deprecated property (#282) 2022-01-23 08:34:08 +08:00
云游君 2bda614aee chore: remove @vue/{compiler-sfc, server-renderer} (#283) 2022-01-23 08:33:55 +08:00
bicycleRiding 153a4d877d chore: change the map to foreach (#278) 2022-01-18 18:51:47 +08:00
hanlee 7df00319ea chore: fix type error 2022-01-14 19:32:11 +09:00
Anthony Fu c4dd813b93 chore: update deps 2022-01-14 17:05:29 +08:00
hanlee a2a56cf5c8 chore: update deps 2022-01-11 21:57:00 +09:00
hanlee f799e7f64e fix: remove unused ts-expect-error 2022-01-09 17:17:25 +09:00
hanlee 8ef1343fef chore: update deps 2022-01-09 17:11:06 +09:00
hanlee 2de501b03f fix: declare vue component type
ref: https://staging.vuejs.org/guide/typescript/overview.html#typescript-in-templates
2022-01-09 16:53:56 +09:00
Sören Martius cf503587e7 fix: pass BASE_URL to ViteSSG (#259) 2021-12-28 13:01:44 +08:00
Reza Hajianpour c57d3cfe39 chore: add vue shims for better eslint linting (#248) 2021-12-27 14:32:09 +08:00
Anthony Fu c0201aed28 feat: integrate vitest 2021-12-26 13:16:12 +08:00
Anthony Fu 1f405bbc0d chore: update deps 2021-12-26 13:08:09 +08:00
Anthony Fu 2e378f4342 chore: update deps 2021-12-16 03:31:16 +08:00
云游君 475a769137 chore: add type for import by eslint (#253) 2021-12-16 03:29:24 +08:00
Anthony Fu 0f56f15197 chore: update deps 2021-12-08 18:51:52 +08:00
Anthony Fu 2186832f0a chore: update deps 2021-11-28 01:59:06 +08:00
Anthony Fu 19e5fcfd0e chore: update deps 2021-11-28 01:31:02 +08:00
Francisco Barros 0bd57af2ca docs: add new vitesse community variation (#240) 2021-11-23 10:08:56 +08:00
Victor 833eaaedde chore: remove unnecessary checklist item (#237) 2021-11-18 01:59:16 +08:00
Shamim Hossain 2ebb9909dd docs: add new variant (#232) 2021-11-11 15:25:55 +08:00
Anthony Fu 78378180fa chore: update variants 2021-11-07 07:56:01 +08:00
Anthony Fu 3477105568 chore: run ci on ubuntu 2021-11-06 09:34:30 +08:00
Anthony Fu 69548f979f chore: try 2021-11-06 09:29:18 +08:00
Anthony Fu ecc716a7e7 chore: try fix cypress 2021-11-06 09:17:24 +08:00
Anthony Fu a4cb24617b chore: update deps, close #218 2021-11-06 09:16:05 +08:00
Anthony Fu cc307f857d chore: cache cypress 2021-11-03 11:33:08 +08:00
Evertvdw 1f10905a8e fix: formatOnSave not disabled in workspace (#227) 2021-11-03 08:17:34 +08:00
Anthony Fu 206333082c chore: fix cypress 2021-11-02 09:55:46 +08:00
Anthony Fu 4ef03f4da3 fix: image width in markdown, close #221 2021-11-02 09:54:16 +08:00
Anthony Fu 44e93dd713 chore: fix typecheck 2021-11-02 09:50:21 +08:00
Anthony Fu 83d126b9a4 feat: setup cypress tests 2021-11-02 09:45:48 +08:00
Anthony Fu ed00348799 chore: fix types 2021-11-02 09:16:21 +08:00
Anthony Fu 60a52456f1 refactor: rename logic to composables 2021-11-02 09:13:28 +08:00
Anthony Fu b9a1dd0772 chore: update deps 2021-10-31 02:13:25 +08:00
Anthony Fu 9c3ac1ed44 chore: update deps 2021-10-22 06:20:45 +08:00
Christopher Reeve 42af27b27b i18n: add indonesia id.yml locales (#216) 2021-10-20 06:17:13 +08:00
Christopher Reeve 03269e8b58 docs: changing Vitailse description (#217) 2021-10-20 06:07:28 +08:00
Yunwei Xiao 269481ed85 docs: new template variant (#214) 2021-10-18 15:23:57 +08:00
Anthony Fu ad4e2e7489 chore: update deps 2021-10-07 14:53:19 +08:00
Anthony Fu 79dda3819a chore: update deps 2021-10-02 09:21:08 +08:00
Anthony Fu fe288f6e97 feat: use incremental iconsets 2021-10-02 08:44:27 +08:00
Anthony Fu e4617a0076 chore: update dts file 2021-09-30 05:17:14 +08:00
Anthony Fu d8b2512381 chore: update deps 2021-09-30 05:16:50 +08:00
Anthony Fu 1653a34bf7 chore: update deps 2021-09-25 18:44:02 +08:00
Anthony Fu d9ca1c1e45 chore: update deps 2021-09-25 15:04:54 +08:00
Christopher Reeve 034d5624f0 docs: new template variant (#203) 2021-09-24 15:14:22 +08:00
Anthony Fu 831d38161a chore: update deps 2021-09-24 09:51:55 +08:00
NorbertandAnthony Fu ded2a12a7e i18n: polish translation (#199)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2021-09-22 02:45:48 +08:00
hanlee b3a5658e59 chore: update deps 2021-09-17 17:36:36 +09:00
Anthony Fu 7ba65301f4 chore: update deps 2021-09-17 11:10:25 +08:00
Manuel Quarneti 3f9e5f93eb chore: useHead is auto-imported (#192) 2021-09-15 19:42:03 +08:00
Manuel Quarneti f9b0ce9cce chore: node_modules is ignored by eslint implicitly (#193) 2021-09-15 19:41:49 +08:00
Manuel Quarneti 8ce8c5a203 chore: vue-i18n is already auto imported (#194) 2021-09-15 19:41:38 +08:00
Johann Schopplich 96af6b8e87 fix: theme color flickering w/ critters (#191) 2021-09-14 15:28:25 +08:00
Anthony Fu 8bfe4b2060 chore: update deps 2021-09-11 07:48:17 +08:00
Anthony Fu 8c32066a59 feat: include vite-plugin-inspect 2021-09-11 07:33:14 +08:00
Anthony Fu 7ee3414a35 chore: update deps, close #187 2021-09-07 21:59:59 +08:00
Anthony Fu 3021469acb chore: update deps 2021-09-06 23:38:53 +08:00
Anthony Fu 0bd6a8b185 fix: color flicker, close #183 2021-09-06 14:48:07 +08:00
云游君 a650f660e7 chore: update vite-plugin-vue-i18n link (#182) 2021-09-05 00:09:41 +08:00
Anthony Fu 611e1070d6 chore: explict enables dts 2021-08-31 17:57:46 +08:00
Anthony Fu 4f4826377e chore: update deps 2021-08-31 02:16:52 +08:00
Anthony Fu b0276fbeac feat: migrate to unplugins 2021-08-30 17:33:27 +08:00
云游君 07d13022cc fix: add type for markdown-it-link-attributes (#179) 2021-08-30 10:43:10 +08:00
Kıraç Acar Apaydın 04865e08b1 i18n(tr): Add missing Turkish string (#175) 2021-08-28 02:36:51 +08:00
Anthony Fu 5af885ca7d chore: update deps 2021-08-25 23:38:01 +08:00
Anthony Fu 91f1f75ec1 chore: update readme 2021-08-25 23:35:58 +08:00
Anthony Fu 130b285ad9 feat: use unplugin-auto-import instead of vue-global-api 2021-08-24 15:19:20 +08:00
Anthony Fu 88908230da Update general.md 2021-08-23 15:05:43 +08:00
Johann Schopplich 91f8d6c4e9 i18n(de): add missing German translation string (#171) 2021-08-20 16:01:30 +08:00
Anthony Fu 4c22495ea6 chore: update 2021-08-20 12:58:29 +08:00
Anthony Fu cddf30638a Update README.md 2021-08-19 14:11:41 +08:00
Eduardo San Martin Morote 4a412acc9e feat: add pinia stores (#170) 2021-08-19 13:53:52 +08:00
Anthony Fu 423b506d70 chore: update deps 2021-08-16 07:53:37 +08:00
John 72e036bb31 fix: feature list link for icons was incorrect (#168) 2021-08-14 09:14:38 +08:00
Anthony Fu 5177047633 chore: update deps 2021-08-11 18:06:35 +00:00
Anthony Fu 8363a5f955 fix: inline white spaces in ssg 2021-08-01 03:03:20 +08:00
Anthony Fu 91f08f3b13 feat: ssg critical css 2021-08-01 02:18:45 +08:00
Anthony Fu 439119935c chore: update deps 2021-07-31 21:07:03 +08:00
Anthony Fu 31124907b4 chore: update deps, fix #159 2021-07-31 21:01:11 +08:00
Anthony Fu e941b42515 chore: trigger deploy 2021-07-27 00:07:17 +08:00
Anthony Fu 723fae7b26 chore: update deps 2021-07-27 00:00:41 +08:00
Anthony Fu 8cec251405 chore: update lock 2021-07-26 14:16:27 +08:00
Anthony Fu c126f3443f chore: update deps 2021-07-26 14:13:07 +08:00
Anthony Fu 72e47ba2b7 Update README.md 2021-07-24 12:35:35 +08:00
Anthony Fu 342f2ef233 chore: update variations 2021-07-24 03:18:49 +08:00
Anthony Fu c716813570 fix: bring vue-global-api to the top 2021-07-23 10:34:45 +08:00
Anthony Fu 547bb7dbad chore: update deps 2021-07-19 23:27:34 +08:00
Anthony Fu 500086af4d chore: add vitesse-lite 2021-07-19 23:26:50 +08:00
userquin 0ec158b49b chore: optimize vue-i18n (#152) 2021-07-18 21:28:12 +08:00
Anthony Fu 05bc8e9a36 chore: update deps 2021-07-16 02:57:10 +08:00
Anthony Fu 9a978b6cb2 chore: update deps 2021-07-15 23:39:57 +08:00
云游君andAnthony Fu 9df34aa8c1 chore: support blockquote dark mode & simplify markdown wrapper (#151)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2021-07-15 16:34:52 +08:00
Anthony Fu 676d01be6c feat: use vue-global-api 2021-07-14 00:51:31 +08:00
Anthony Fu fd9994485c chore: update 2021-07-06 22:30:13 +08:00
Anthony Fu 80426586cf chore: update deps 2021-07-06 22:18:49 +08:00
Anthony Fu ee08713690 chore: update deps 2021-07-02 10:33:38 +08:00
Anthony Fu ddb90e465e chore: update deps 2021-07-02 08:27:32 +08:00
hanlee a56ea95576 chore: update deps 2021-07-01 22:45:13 +09:00
Anthony Fu 41ca5a4a25 chore: typo 2021-06-28 22:38:53 +08:00
Anthony Fu ac48a148d1 chore: update deps 2021-06-23 08:54:50 +08:00
云游君 e3bc59a5f7 feat(md): add _blank for all links with http/https (#141) 2021-06-13 14:39:22 +08:00
userquin 4335ed3e6a chore: update deps (#140) 2021-06-13 13:05:26 +08:00
userquin fa57edbaac fix: add missing assets to sw to work offline (#139) 2021-06-12 18:25:01 +08:00
Anthony Fu 2750a7a78c chore: update 2021-06-12 15:30:37 +08:00
Anthony Fu c6e12e9c68 chore: update deps 2021-06-12 15:24:31 +08:00
J.C cc7418e510 docs: fix broken links (#134) 2021-06-05 15:02:31 +08:00
Anthony Fu 74400f8843 chore: update deps 2021-06-01 08:28:47 +08:00
KGZM 3dc0f0b192 chore: update deps (#129) 2021-05-30 10:59:28 +08:00
Anthony Fu 21d106f7c8 chore: fix types 2021-05-25 20:21:07 +08:00
Anthony Fu 9d41ea0fa8 feat: global components for volar 2021-05-25 20:13:22 +08:00
ctholho c2f8645161 chore: update deps (#127) 2021-05-23 18:32:38 +08:00
Manuel Quarneti 581aac3df1 refactor: import setupLayouts from virtual module (#125)
As shown in the vite-plugin-vue readme
2021-05-23 03:25:09 +08:00
ctholho b7222f4bed docs: added vitespa to #variations (#124) 2021-05-22 12:14:30 +08:00
Mitchell Johnson b3b200237c fix: out-of-date reference (#123) 2021-05-21 14:14:56 +09:00
Johann Schopplich 142acb2ef3 i18n: add german translation (#122) 2021-05-17 18:17:47 +08:00
Andrey f706d556a0 i18n: correct Russian translation (#121) 2021-05-17 09:14:38 +08:00
Anthony Fu f71cc96893 chore: update deps 2021-05-11 15:25:16 +08:00
Charles Pourcel 25d790b0fc i18n: improve french translation (#117) 2021-05-10 15:41:11 +08:00
Anthony Fu a78589bbd5 chore: update deps 2021-05-02 18:34:47 +08:00
878995238e feat: type-check source before build (#115)
Co-authored-by: Robbert Van Cauteren <robbert.vancauteren@robovision.eu>
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2021-05-02 18:31:25 +08:00
Bogenbai Bayzharassov 62733ae631 feat(i18n): add ru.yml (#116) 2021-04-29 04:10:52 +09:00
hanlee 3466e17cc5 chore: update deps 2021-04-29 04:09:59 +09:00
Anthony Fu 8e0a2061c7 chore: update deps 2021-04-20 06:52:27 +08:00
ctholho e65d912cd1 fix: layout higher than display (#112) 2021-04-20 05:39:54 +08:00
Anthony Fu e834d4f15b Update issue templates 2021-04-17 04:31:12 +08:00
Anthony Fu 776494a657 chore: update deps 2021-04-11 15:26:27 +08:00
Anthony Fu 8ca3e1aee7 chore: update deps 2021-04-11 11:32:41 +08:00
Anthony Fu 6e4e40d834 chore: update 2021-04-04 02:21:33 +08:00
Seb Tomasini 793e8b9da1 fix: vue file imports throwing IDE errors (#106)
Fixes `import App from './App.vue'` throwing ts2307: cannot find module (in `/src/main.ts` and others)
2021-04-02 00:40:33 +08:00
Anthony Fu ff4fa578fc feat: rename logics to logic 2021-03-31 13:59:01 +08:00
Anthony Fu 433aabe44c chore: update deps 2021-03-30 03:00:50 +08:00
userquin b7824239a8 chore: update pwa plugin dep (#104)
* chore: update pwa plugin dep

* chore: clean up
2021-03-29 01:02:09 +09:00
hanlee ac0dca982d chore: update deps 2021-03-28 04:23:59 +09:00
Anthony Fu 2a5b6fb046 chore: update deps 2021-03-26 19:39:07 +08:00
Anthony Fu f144cd42a1 chore: update deps 2021-03-26 01:53:01 +08:00
Joaquín Sánchez Jiménez 58ceb77b06 chore: update vite-plugin-pwa 2021-03-25 18:44:16 +01:00
Josh King 32676ae335 chore: remove archived repo (#101) 2021-03-22 04:04:16 +09:00
Anthony Fu b6779111c8 chore: update cover 2021-03-20 17:07:14 +08:00
Anthony Fu 1d07e5281d chore: makoto :P 2021-03-19 22:36:46 +08:00
userquin 23dc1cd483 refactor(i18n): change locale files to yaml format, closes #96 (#97) 2021-03-19 22:32:17 +08:00
Anthony Fu 711d1c845d chore: fix 2021-03-19 21:07:41 +08:00
Rogério Araújo c1939905c9 feat(i18n): add pt-BR.json (#95)
I added locale for Brazilian users.
2021-03-19 20:56:00 +08:00
hanlee b03a0e71be chore: update deps 2021-03-16 15:58:12 +09:00
Han(ハン) d5a595d7a2 chore: update windicss description (#92) 2021-03-16 04:17:53 +08:00
hanlee 424907e458 chore: apply linter 2021-03-16 03:49:51 +09:00
Anthony Fu 0562a2e591 feat: add https preview 2021-03-16 00:35:55 +08:00
Tony Trinh a2e8e0b742 chore: typos (#89) 2021-03-14 14:14:42 +08:00
Tony Trinh c001c52177 Fix typos in src/components/README.md (#90) 2021-03-14 14:14:00 +08:00
Anthony Fu 97f146150c chore: update deps 2021-03-11 15:44:02 +08:00
hanlee e5dffdb8d5 feat: use virtual: prefix formate in virtual modules 2021-03-11 01:41:25 +09:00
hanlee 7e09d5b341 chore: update deps 2021-03-11 00:42:24 +09:00
hanlee 2487c1827c chore: update deps 2021-03-09 03:35:52 +09:00
Anthony Fu 0e40c550f8 chore: update workspace setting 2021-03-08 14:40:44 +08:00
Anthony Fu 74812d9bba chore: update theme 2021-03-08 02:26:37 +08:00
Anthony Fu b1ce79d3ec chore: update deps 2021-03-08 02:23:29 +08:00
Anthony Fu b0696b4f25 chore: update deps 2021-03-02 21:56:32 +08:00
Mengzhao 6886db4ce9 fix: update vite-plugin-pages config (#80)
update `vite-plugin-pages` config
2021-03-02 13:52:57 +08:00
Pine 25c7d351c7 fix: markdown not aligned to left (#81) 2021-03-02 13:25:54 +08:00
Anthony Fu 7c903def7b feat: add vite for vscode 2021-03-01 18:44:46 +08:00
Anthony Fu 773ad02748 chore: update deps 2021-03-01 02:35:41 +08:00
Anthony Fu 586d28134d chore: updates 2021-02-27 16:51:01 +08:00
Anthony Fu e4c56de6a8 chore: update forks 2021-02-27 12:36:10 +08:00
Anthony Fu 06de10de8f chore: update deps 2021-02-26 21:49:27 +08:00
Anthony Fu d86f93234b chore: update deps 2021-02-26 15:17:08 +08:00
Anthony Fu 51265b18be chore: update deps 2021-02-24 23:26:19 +08:00
rashidpathiyil b4f9438c45 chore: Update README.md (#75) 2021-02-23 08:25:58 +08:00
龙崎流也 dc81304f33 chore: App.vue typo (#73) 2021-02-22 16:17:59 +08:00
Andrea Nanni 92f0f0252f feat(i18n): add it.json (#72) 2021-02-21 12:44:14 +08:00
Anthony Fu ca352cedd4 chore: cleanup, close #71 2021-02-20 19:37:41 +08:00
Anthony Fu 5878fb1ae0 chore: update locks 2021-02-20 17:06:33 +08:00
Anthony Fu 11147a9f58 feat: enable ts for tailwind.config 2021-02-20 16:13:13 +08:00
Anthony Fu a491fa4b88 chore: update deps 2021-02-19 16:31:48 +08:00
John Campion JrandAnthony Fu 7387e3734d chore: readme (#70)
* chore: readme

* Update README.md

Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2021-02-19 13:20:57 +08:00
Anthony Fu f541621286 chore: update deps 2021-02-18 01:24:34 +08:00
Anthony Fu 1c183947c3 i18n(fr): update 2021-02-17 09:49:37 +08:00
Anthony Fu d7916b54b7 feat: upgrade for Vite 2.0 2021-02-17 09:49:22 +08:00
béla 8f74cd2bed fix(readme): windicss links (#66)
* fix(readme): switch to windicss

* fix(readme): switch to windicss

* fix(readme): switch to windicss
2021-02-16 19:21:59 +09:00
Anthony Fu 53da3f8315 feat: switch to windicss (#65) 2021-02-16 12:38:22 +08:00
93 changed files with 15373 additions and 6118 deletions
+2
View File
@@ -0,0 +1,2 @@
node_modules
dist
+9
View File
@@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
+2 -1
View File
@@ -1 +1,2 @@
github: antfu
open_collective: antfu
github: [antfu]
+96
View File
@@ -0,0 +1,96 @@
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
cache: pnpm
- name: Install
run: pnpm install
- name: Lint
run: pnpm run lint
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
cache: pnpm
- name: Install
run: pnpm install
- name: Typecheck
run: pnpm run typecheck
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
node-version: [20.x, 22.x]
os: [ubuntu-latest]
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
registry-url: https://registry.npmjs.org/
cache: pnpm
- run: pnpm install
- run: pnpm run test:unit
test-e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: |
~/.cache
key: cypress-cache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- uses: pnpm/action-setup@v3
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
registry-url: https://registry.npmjs.org/
cache: pnpm
- run: pnpm install
- name: Cypress PNPM Patch
run: cp pnpm-lock.yaml package-lock.json
- name: Cypress
uses: cypress-io/github-action@v6
with:
install-command: echo
build: pnpm run build
start: npx vite preview --port 3333
+4
View File
@@ -5,3 +5,7 @@
dist
dist-ssr
node_modules
.idea/
*.log
cypress/downloads
public/assets/fonts
+7 -3
View File
@@ -1,9 +1,13 @@
{
"recommendations": [
"johnsoncodehk.volar",
"lokalise.i18n-ally",
"antfu.iconify",
"antfu.unocss",
"antfu.vite",
"antfu.goto-alias",
"csstools.postcss",
"dbaeumer.vscode-eslint",
"bradlc.vscode-tailwindcss"
"vue.volar",
"lokalise.i18n-ally",
"streetsidesoftware.code-spell-checker"
]
}
+43 -5
View File
@@ -1,10 +1,48 @@
{
"volar.tsPlugin": true,
"i18n-ally.localesPaths": "locales",
"cSpell.words": ["Vitesse", "Vite", "unocss", "vitest", "vueuse", "pinia", "demi", "antfu", "iconify", "intlify", "vitejs", "unplugin", "pnpm"],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.keystyle": "nested",
"i18n-ally.localesPaths": "locales",
"i18n-ally.sortKeys": true,
"cSpell.words": [
"Vitesse"
// Disable the default formatter
"prettier.enable": false,
"editor.formatOnSave": false,
// Auto fix
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.organizeImports": "never"
},
// Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off" },
{ "rule": "format/*", "severity": "off" },
{ "rule": "*-indent", "severity": "off" },
{ "rule": "*-spacing", "severity": "off" },
{ "rule": "*-spaces", "severity": "off" },
{ "rule": "*-order", "severity": "off" },
{ "rule": "*-dangle", "severity": "off" },
{ "rule": "*-newline", "severity": "off" },
{ "rule": "*quotes", "severity": "off" },
{ "rule": "*semi", "severity": "off" }
],
"typescript.tsdk": "node_modules/typescript/lib"
// The following is optional.
// It's better to put under project setting `.vscode/settings.json`
// to avoid conflicts with working with different eslint configs
// that does not support all formats.
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"html",
"markdown",
"json",
"jsonc",
"yaml"
]
}
+18
View File
@@ -0,0 +1,18 @@
FROM node:20-alpine AS build-stage
WORKDIR /app
RUN corepack enable
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \
pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
FROM nginx:stable-alpine AS production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 Anthony Fu
Copyright (c) 2020-PRESENT Anthony Fu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+95 -35
View File
@@ -1,10 +1,9 @@
<p align='center'>
<img src='https://repository-images.githubusercontent.com/286295150/b1b1be80-354a-11eb-87c0-5dc96cae2bd9' alt='Vitesse - Opinionated Vite Starter Template' width='600'/>
<img src='https://user-images.githubusercontent.com/11247099/154486817-f86b8f20-5463-4122-b6e9-930622e757f2.png' alt='Vitesse - Opinionated Vite Starter Template' width='600'/>
</p>
<p align='center'>
Mocking up web app with <b>Vitesse</b><sup><em>(speed)</em></sup><br>
<sub><em>Now with Vite 2.0! ⚡️</em></sub>
</p>
<br>
@@ -15,32 +14,53 @@ Mocking up web app with <b>Vitesse</b><sup><em>(speed)</em></sup><br>
<br>
> **Note**: This template is created during the early transition of Vue 3 and Vite. At this moment, if you are seeking for better Vue developer experience and more consistent maintenance, we recommend using [Nuxt](https://nuxt.com) instead (it also works perfectly with SPA or SSG as needed). This template still serves as a reference, but expect slower updates.
<br>
<p align='center'>
<b>English</b> | <a href="https://github.com/antfu-collective/vitesse/blob/main/README.zh-CN.md">简体中文</a>
<!-- Contributors: Thanks for getting interested, however we DON'T accept new translations to the README, thanks. -->
</p>
<br>
## Features
- ⚡️ [Vue 3](https://github.com/vuejs/vue-next), [Vite 2](https://github.com/vitejs/vite), [pnpm](https://pnpm.js.org/), [ESBuild](https://github.com/evanw/esbuild) - born with fastness
- ⚡️ [Vue 3](https://github.com/vuejs/core), [Vite](https://github.com/vitejs/vite), [pnpm](https://pnpm.io/), [esbuild](https://github.com/evanw/esbuild) - born with fastness
- 🗂 [File based routing](./src/pages)
- 📦 [Components auto importing](./src/components)
- 🍍 [State Management via Pinia](https://pinia.vuejs.org/)
- 📑 [Layout system](./src/layouts)
- 📲 [PWA](https://github.com/antfu/vite-plugin-pwa)
- 🎨 [TailwindCSS **v2.0**](https://blog.tailwindcss.com/tailwindcss-v2) with dark mode out-of-box
- 🎨 [UnoCSS](https://github.com/antfu/unocss) - the instant on-demand atomic CSS engine
- 😃 [Use icons from any icon sets, with no compromise](./src/components)
- 😃 [Use icons from any icon sets with classes](https://github.com/antfu/unocss/tree/main/packages/preset-icons)
- 🌍 [I18n ready](./locales)
- 🗒 [Markdown Support](https://github.com/antfu/vite-plugin-md)
- 🔎 [Component Preview](https://github.com/johnsoncodehk/vite-plugin-vue-component-preview)
- 🔥 Use the [new `<script setup>` style](https://github.com/vuejs/rfcs/pull/227)
- 🗒 [Markdown Support](https://github.com/unplugin/unplugin-vue-markdown)
- 🖨 Server-side generation (SSG) via [vite-ssg](https://github.com/antfu/vite-ssg)
- 🔥 Use the [new `<script setup>` syntax](https://github.com/vuejs/rfcs/pull/227)
- 📥 [APIs auto importing](https://github.com/antfu/unplugin-auto-import) - use Composition API and others directly
- 🖨 Static-site generation (SSG) via [vite-ssg](https://github.com/antfu/vite-ssg)
- 🦔 Critical CSS via [beasties](https://github.com/danielroe/beasties)
- 🦾 TypeScript, of course
- ⚙️ Unit Testing with [Vitest](https://github.com/vitest-dev/vitest), E2E Testing with [Cypress](https://cypress.io/) on [GitHub Actions](https://github.com/features/actions)
- ☁️ Deploy on Netlify, zero-config
<br>
@@ -49,65 +69,91 @@ Mocking up web app with <b>Vitesse</b><sup><em>(speed)</em></sup><br>
### UI Frameworks
- [Tailwind CSS](https://tailwindcss.com/) - with built-in dark mode!
- [Tailwind Typography](https://github.com/tailwindlabs/tailwindcss-typography) - Typography for Tailwind
- [UnoCSS](https://github.com/antfu/unocss) - The instant on-demand atomic CSS engine.
### Icons
- [Iconify](https://iconify.design) - use icons from any icon sets [🔍Icônes](https://icones.netlify.app/)
- [`vite-plugin-icons`](https://github.com/antfu/vite-plugin-icons) - icons as Vue components
- [Pure CSS Icons via UnoCSS](https://github.com/antfu/unocss/tree/main/packages/preset-icons)
### Plugins
- [Vue Router](https://github.com/vuejs/vue-router)
- [`vite-plugin-pages`](https://github.com/hannoeru/vite-plugin-pages) - file system based routing
- [Vue Router](https://github.com/vuejs/router)
- [`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router) - file system based routing
- [`vite-plugin-vue-layouts`](https://github.com/JohnCampionJr/vite-plugin-vue-layouts) - layouts for pages
- [`vite-plugin-components`](https://github.com/antfu/vite-plugin-components) - components auto import
- [Pinia](https://pinia.vuejs.org) - Intuitive, type safe, light and flexible Store for Vue using the composition api
- [`unplugin-vue-components`](https://github.com/antfu/unplugin-vue-components) - components auto import
- [`unplugin-auto-import`](https://github.com/antfu/unplugin-auto-import) - Directly use Vue Composition API and others without importing
- [`unplugin-vue-macros`](https://github.com/sxzz/unplugin-vue-macros) - Explore and extend more macros and syntax sugar to Vue.
- [`vite-plugin-pwa`](https://github.com/antfu/vite-plugin-pwa) - PWA
- [`vite-plugin-md`](https://github.com/antfu/vite-plugin-md) - Markdown as components / components in Markdown
- [`markdown-it-prism`](https://github.com/jGleitz/markdown-it-prism) - [Prism](https://prismjs.com/) for syntax highlighting
- [`prism-theme-vars`](https://github.com/antfu/prism-theme-vars) - customizable Prism.js theme using CSS variables
- [`unplugin-vue-markdown`](https://github.com/unplugin/unplugin-vue-markdown) - Markdown as components / components in Markdown
- [`@shikijs/markdown-it`](https://github.com/shikijs/shiki) - [Shiki](https://github.com/shikijs/shiki) for syntax highlighting
- [Vue I18n](https://github.com/intlify/vue-i18n-next) - Internationalization
- [`vite-plugin-vue-i18n`](https://github.com/intlify/vite-plugin-vue-i18n) - Vite plugin for Vue I18n
- [`unplugin-vue-i18n`](https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n) - unplugin for Vue I18n
- [VueUse](https://github.com/antfu/vueuse) - collection of useful composition APIs
- [`@vueuse/head`](https://github.com/vueuse/head) - manipulate document head reactively
- [`vite-ssg-sitemap`](https://github.com/jbaubree/vite-ssg-sitemap) - Sitemap generator
- [`@unhead/vue v2`](https://github.com/unjs/unhead) - manipulate document head reactively
- [`vite-plugin-vue-devtools`](https://github.com/vuejs/devtools-next) - Designed to enhance the Vue developer experience.
### Coding Style
- Use Composition API with [`<script setup>` SFC](https://github.com/vuejs/rfcs/pull/227)
- [ESLint](https://eslint.org/) with [@antfu/eslint-config-vue](https://github.com/antfu/eslint-config), single quotes, no semi.
- Use Composition API with [`<script setup>` SFC syntax](https://github.com/vuejs/rfcs/pull/227)
- [ESLint](https://eslint.org/) with [@antfu/eslint-config](https://github.com/antfu/eslint-config), single quotes, no semi.
### Dev tools
- [TypeScript](https://www.typescriptlang.org/)
- [Vitest](https://github.com/vitest-dev/vitest) - Unit testing powered by Vite
- [Cypress](https://cypress.io/) - E2E testing
- [pnpm](https://pnpm.js.org/) - fast, disk space efficient package manager
- [`vite-ssg`](https://github.com/antfu/vite-ssg) - Server-side generation
- [Netlify](https://www.netlify.com/) - deploy
- [`vite-ssg`](https://github.com/antfu/vite-ssg) - Static-site generation
- [beasties](https://github.com/danielroe/beasties) - Critical CSS
- [Netlify](https://www.netlify.com/) - zero-config deployment
- [VS Code Extensions](./.vscode/extensions.json)
- [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar)
- [Iconify IntelliSense](https://marketplace.visualstudio.com/items?itemName=antfu.iconify)
- [i18n Ally](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally)
- [Tailwind CSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss)
- [Vite](https://marketplace.visualstudio.com/items?itemName=antfu.vite) - Fire up Vite server automatically
- [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) - Vue 3 `<script setup>` IDE support
- [Iconify IntelliSense](https://marketplace.visualstudio.com/items?itemName=antfu.iconify) - Icon inline display and autocomplete
- [i18n Ally](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) - All in one i18n support
- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
## Variations
As this template is strongly opinionated, the following provides a curated list for community maintained variations with different preferences and feature sets. Check them out as well. PR to add yours are also welcome!
As this template is strongly opinionated, the following provides a curated list for community-maintained variations with different preferences and feature sets. Check them out as well. PR to add yours is also welcome!
- [vitesse-lite](https://github.com/kn0wn/vitesse-lite) by [@kn0wn](https://github.com/kn0wn)
###### Official
- [vitesse-lite](https://github.com/antfu/vitesse-lite) - Lightweight version of Vitesse
- [vitesse-nuxt3](https://github.com/antfu/vitesse-nuxt3) - Vitesse for Nuxt 3
- [vitesse-nuxt-bridge](https://github.com/antfu/vitesse-nuxt-bridge) - Vitesse for Nuxt 2 with Bridge
- [vitesse-webext](https://github.com/antfu/vitesse-webext) - WebExtension Vite starter template
###### Community
- [vitesse-ssr-template](https://github.com/frandiox/vitesse-ssr-template) by [@frandiox](https://github.com/frandiox) - Vitesse with SSR
- [vitailse](https://github.com/zynth17/vitailse) by [@zynth17](https://github.com/zynth17) - Like Vitesse but with TailwindCSS
- [vitesse-modernized-chrome-ext](https://github.com/xiaoluoboding/vitesse-modernized-chrome-ext) by [@xiaoluoboding](https://github.com/xiaoluoboding) - ⚡️ Modernized Chrome Extension Manifest V3 Vite Starter Template
- [vitesse-stackter-clean-architect](https://github.com/shamscorner/vitesse-stackter-clean-architect) by [@shamscorner](https://github.com/shamscorner) - A modular clean architecture pattern in vitesse template
- [vitesse-enterprise](https://github.com/FranciscoKloganB/vitesse-enterprise) by [@FranciscoKloganB](https://github.com/FranciscoKloganB) - Consistent coding styles regardless of team-size.
- [vitecamp](https://github.com/nekobc1998923/vitecamp) by [@nekobc1998923](https://github.com/nekobc1998923) - Like Vitesse but without SSG/SSR/File based routing, includes Element Plus
- [vitesse-h5](https://github.com/YunYouJun/vitesse-h5) by [@YunYouJun](https://github.com/YunYouJun) - Vitesse for Mobile
- [bat](https://github.com/olgam4/bat) by [@olgam4](https://github.com/olgam4) - Vitesse for SolidJS
- [vitesse-solid](https://github.com/xbmlz/vitesse-solid) by [@xbmlz](https://github.com/xbmlz) - Vitesse for SolidJS, build with [`SolidStart`](https://start.solidjs.com/), includes [UnoCSS](https://github.com/unocss/unocss).
- [vue3-vant-mobile](https://github.com/easy-temps/vue3-vant-mobile) by [CharleeWa](https://github.com/CharleeWa) - Like Vitesse but without SSG/SSR, includes Vant
## Try it now!
> Vitesse requires Node >=14.18
### GitHub Template
[Create a repo from this template on GitHub](https://github.com/antfu/vitesse/generate).
[Create a repo from this template on GitHub](https://github.com/antfu-collective/vitesse/generate).
### Clone to local
If you prefer to do it manually with the cleaner git history
```bash
npx degit antfu/vitesse my-vitesse-app
npx degit antfu-collective/vitesse my-vitesse-app
cd my-vitesse-app
pnpm i # If you don't have pnpm installed, run: npm install -g pnpm
```
@@ -116,9 +162,9 @@ pnpm i # If you don't have pnpm installed, run: npm install -g pnpm
When you use this template, try follow the checklist to update your info properly
- [ ] Rename `name` field in `package.json`
- [ ] Change the author name in `LICENSE`
- [ ] Change the title in `index.html`
- [ ] Change the title in `App.vue`
- [ ] Change the hostname in `vite.config.ts`
- [ ] Change the favicon in `public`
- [ ] Remove the `.github` folder which contains the funding info
- [ ] Clean up the READMEs and remove routes
@@ -149,8 +195,22 @@ And you will see the generated file in `dist` that ready to be served.
Go to [Netlify](https://app.netlify.com/start) and select your clone, `OK` along the way, and your App will be live in a minute.
### Docker Production Build
First, build the vitesse image by opening the terminal in the project's root directory.
```bash
docker buildx build . -t vitesse:latest
```
Run the image and specify port mapping with the `-p` flag.
```bash
docker run --rm -it -p 8080:80 vitesse:latest
```
## Why
I have created several Vite apps recently. Setting the configs up is kinda the bottleneck for me to make the ideas simply come true within a very short time.
I have created several Vite apps recently. Setting the configs up is kinda the bottleneck for me to make the ideas simply come true within a very short time.
So I made this starter template for myself to create apps more easily, along with some good practices that I have learned from making those apps. It's strongly opinionated, but feel free to tweak it or even maintains your own forks. [(see community maintained variation forks)](#variations)
So I made this starter template for myself to create apps more easily, along with some good practices that I have learned from making those apps. It's strongly opinionated, but feel free to tweak it or even maintain your own forks. [(see community maintained variation forks)](#variations)
+185
View File
@@ -0,0 +1,185 @@
<p align='center'>
<img src='https://user-images.githubusercontent.com/11247099/154486817-f86b8f20-5463-4122-b6e9-930622e757f2.png' alt='Vitesse - Opinionated Vite Starter Template' width='600'/>
</p>
<p align='center'>
快速地<sup><em>Vitesse</em></sup> 创建 Web 应用
<br>
</p>
<br>
<p align='center'>
<a href="https://vitesse.netlify.app/">在线 Demo</a>
</p>
<br>
> **Note**: 本模板创建于 Vue 3 和 Vite 的早期过渡时期。目前,如果您正在寻求更好的 Vue 开发体验和更持续的维护,我们建议您使用 [Nuxt 3](https://nuxt.com) 来代替(它也可以根据需要使用 SPA 或 SSG)。本模板仍会作为参考缓慢地维护下去,但将不会有太多的更新。
<br>
<p align='center'>
<a href="https://github.com/antfu-collective/vitesse/blob/main/README.md">English</a> | <b>简体中文</b>
</p>
<br>
## 特性
- ⚡️ [Vue 3](https://github.com/vuejs/core), [Vite](https://github.com/vitejs/vite), [pnpm](https://pnpm.io/), [esbuild](https://github.com/evanw/esbuild) - 就是快!
- 🗂 [基于文件的路由](./src/pages)
- 📦 [组件自动化加载](./src/components)
- 🍍 [使用 Pinia 的状态管理](https://pinia.vuejs.org)
- 📑 [布局系统](./src/layouts)
- 📲 [PWA](https://github.com/antfu/vite-plugin-pwa)
- 🎨 [UnoCSS](https://github.com/unocss/unocss) - 高性能且极具灵活性的即时原子化 CSS 引擎
- 😃 [各种图标集为你所用](https://github.com/antfu/unocss/tree/main/packages/preset-icons)
- 🌍 [I18n 国际化开箱即用](./locales)
- 🗒 [Markdown 支持](https://github.com/unplugin/unplugin-vue-markdown)
- 🔥 使用 [新的 `<script setup>` 语法](https://github.com/vuejs/rfcs/pull/227)
- 📥 [API 自动加载](https://github.com/unplugin/unplugin-auto-import) - 直接使用 Composition API 无需引入
- 🖨 使用 [vite-ssg](https://github.com/antfu/vite-ssg) 进行服务端生成 (SSG)
- 🦔 使用 [beasties](https://github.com/danielroe/beasties) 的生成关键 CSS
- 🦾 TypeScript, 当然
- ⚙️ 结合 [GitHub Actions](https://github.com/features/actions),使用 [Vitest](https://github.com/vitest-dev/vitest) 进行单元测试, [Cypress](https://cypress.io/) 进行 E2E 测试
- ☁️ 零配置部署 Netlify
<br>
## 预配置
### UI 框架
- [UnoCSS](https://github.com/antfu/unocss) - 高性能且极具灵活性的即时原子化 CSS 引擎
### Icons
- [Iconify](https://iconify.design) - 使用任意的图标集,浏览:[🔍Icônes](https://icones.netlify.app/)
- [UnoCSS 的纯 CSS 图标方案](https://github.com/antfu/unocss/tree/main/packages/preset-icons)
### 插件
- [Vue Router](https://github.com/vuejs/router)
- [`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router) - 以文件系统为基础的路由
- [`vite-plugin-vue-layouts`](https://github.com/JohnCampionJr/vite-plugin-vue-layouts) - 页面布局系统
- [Pinia](https://pinia.vuejs.org) - 直接的, 类型安全的, 使用 Composition API 的轻便灵活的 Vue 状态管理
- [`unplugin-vue-components`](https://github.com/antfu/unplugin-vue-components) - 自动加载组件
- [`unplugin-auto-import`](https://github.com/antfu/unplugin-auto-import) - 直接使用 Composition API 等,无需导入
- [`vite-plugin-pwa`](https://github.com/antfu/vite-plugin-pwa) - PWA
- [`unplugin-vue-markdown`](https://github.com/unplugin/unplugin-vue-markdown) - Markdown 作为组件,也可以让组件在 Markdown 中使用
- [`markdown-it-prism`](https://github.com/jGleitz/markdown-it-prism) - [Prism](https://prismjs.com/) 的语法高亮
- [`prism-theme-vars`](https://github.com/antfu/prism-theme-vars) - 利用 CSS 变量自定义 Prism.js 的主题
- [Vue I18n](https://github.com/intlify/vue-i18n-next) - 国际化
- [`unplugin-vue-i18n`](https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n) - Vue I18n 的 Vite 插件
- [VueUse](https://github.com/antfu/vueuse) - 实用的 Composition API 工具合集
- [`vite-ssg-sitemap`](https://github.com/jbaubree/vite-ssg-sitemap) - 站点地图生成器
- [`@vueuse/head`](https://github.com/vueuse/head) - 响应式地操作文档头信息
- [`vite-plugin-vue-devtools`](https://github.com/webfansplz/vite-plugin-vue-devtools) - 旨在增强Vue开发者体验的Vite插件
### 编码风格
- 使用 Composition API 地 [`<script setup>` SFC 语法](https://github.com/vuejs/rfcs/pull/227)
- [ESLint](https://eslint.org/) 配置为 [@antfu/eslint-config](https://github.com/antfu/eslint-config), 单引号, 无分号.
### 开发工具
- [TypeScript](https://www.typescriptlang.org/)
- [Vitest](https://github.com/vitest-dev/vitest) - 基于 Vite 的单元测试框架
- [Cypress](https://cypress.io/) - E2E 测试
- [pnpm](https://pnpm.js.org/) - 快, 节省磁盘空间的包管理器
- [`vite-ssg`](https://github.com/antfu/vite-ssg) - 服务端生成
- [beasties](https://github.com/danielroe/beasties) - 关键 CSS 生成器
- [Netlify](https://www.netlify.com/) - 零配置的部署
- [VS Code 扩展](./.vscode/extensions.json)
- [Vite](https://marketplace.visualstudio.com/items?itemName=antfu.vite) - 自动启动 Vite 服务器
- [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) - Vue 3 `<script setup>` IDE 支持
- [Iconify IntelliSense](https://marketplace.visualstudio.com/items?itemName=antfu.iconify) - 图标内联显示和自动补全
- [i18n Ally](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) - 多合一的 I18n 支持
- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
## 衍生项目
由于这个模板的业务场景非常的局限,下面提供了一个精心策划的列表,列出了社区维护的具有不同偏好和功能集的衍生项目。也可以看看他们。当然也欢迎你 PR 提供自己的项目!
###### 官方
- [vitesse-lite](https://github.com/antfu/vitesse-lite) - Vitesse 的轻量版本
- [vitesse-nuxt3](https://github.com/antfu/vitesse-nuxt3) - Vitesse 的 Nuxt 3 版本
- [vitesse-nuxt-bridge](https://github.com/antfu/vitesse-nuxt-bridge) - Vitesse 的 Nuxt2 桥接版本
- [vitesse-webext](https://github.com/antfu/vitesse-webext) - 开箱即用的浏览器扩展 vite 模板
###### 社区
[查看英文版](./README.md#community)
## 现在可以试试!
> Vitesse 需要 Node 版本 >=14.18
### GitHub 模板
[使用这个模板创建仓库](https://github.com/antfu-collective/vitesse/generate).
### 克隆到本地
如果您更喜欢使用更干净的 git 历史记录手动执行此操作
```bash
npx degit antfu-collective/vitesse my-vitesse-app
cd my-vitesse-app
pnpm i # 如果你没装过 pnpm, 可以先运行: npm install -g pnpm
```
## 清单
使用此模板时,请尝试按照清单正确更新您自己的信息
- [ ] 在 `LICENSE` 中改变作者名
- [ ] 在 `App.vue` 中改变标题
- [ ] 在 `vite.config.ts` 更改主机名
- [ ] 在 `public` 目录下改变favicon
- [ ] 移除 `.github` 文件夹中包含资助的信息
- [ ] 整理 README 并删除路由
紧接着, 享受吧 :)
## 使用
### 开发
只需要执行以下命令就可以在 http://localhost:3333 中看到
```bash
pnpm dev
```
### 构建
构建该应用只需要执行以下命令
```bash
pnpm build
```
然后你会看到用于发布的 `dist` 文件夹被生成。
### 部署到 Netlify
前往 [Netlify](https://app.netlify.com/start) 并选择你的仓库, 一路 `OK` 下去,稍等一下后,你的应用将被创建.
+14
View File
@@ -0,0 +1,14 @@
import { defineConfig } from 'cypress'
import vitePreprocessor from 'cypress-vite'
export default defineConfig({
e2e: {
baseUrl: 'http://localhost:3333',
chromeWebSecurity: false,
specPattern: 'cypress/e2e/**/*.spec.*',
supportFile: false,
setupNodeEvents(on) {
on('file:preprocessor', vitePreprocessor())
},
},
})
+36
View File
@@ -0,0 +1,36 @@
context('Basic', () => {
beforeEach(() => {
cy.visit('/')
})
it('basic nav', () => {
cy.url()
.should('eq', 'http://localhost:3333/')
cy.contains('[Home Layout]')
.should('exist')
cy.get('#input')
.type('Vitesse{Enter}')
.url()
.should('eq', 'http://localhost:3333/hi/Vitesse')
cy.contains('[Default Layout]')
.should('exist')
cy.get('[btn]')
.click()
.url()
.should('eq', 'http://localhost:3333/')
})
it('markdown', () => {
cy.get('[data-test-id="about"]')
.click()
.url()
.should('eq', 'http://localhost:3333/about')
cy.get('.shiki')
.should('exist')
})
})
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"types": [
"cypress"
]
},
"include": [
"**/*.ts"
],
"exclude": []
}
+16
View File
@@ -0,0 +1,16 @@
// @ts-check
import antfu from '@antfu/eslint-config'
export default antfu(
{
unocss: true,
formatters: true,
pnpm: true,
},
{
files: ['README.md', 'README.zh-CN.md'],
rules: {
'markdown/heading-increment': 'off',
},
},
)
+21 -22
View File
@@ -1,24 +1,23 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/pwa-192x192.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#00aba9">
<meta name="msapplication-TileColor" content="#00aba9">
<meta name="theme-color" content="#ffffff">
</head>
<body>
<div id="app"></div>
<script>
(function() {
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
const setting = localStorage.getItem('color-schema') || 'auto'
if (setting === 'dark' || (prefersDark && setting !== 'light'))
document.documentElement.classList.toggle('dark', true)
})()
</script>
<script type="module" src="/src/main.ts"></script>
</body>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon" href="/pwa-192x192.png" />
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#00aba9" />
<meta name="msapplication-TileColor" content="#00aba9" />
<script>
;(function () {
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
const setting = localStorage.getItem('vueuse-color-scheme') || 'auto'
if (setting === 'dark' || (prefersDark && setting !== 'light'))
document.documentElement.classList.toggle('dark', true)
})()
</script>
</head>
<body class="font-sans">
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
<noscript> This website requires JavaScript to function properly. Please enable JavaScript to continue. </noscript>
</body>
</html>
+1 -1
View File
@@ -1,6 +1,6 @@
## i18n
This directory is to serve your locale translation files. JSON under this folder would be loaded automatically and register with their filenames as locale code.
This directory is to serve your locale translation files. YAML under this folder would be loaded automatically and register with their filenames as locale code.
Check out [`vue-i18n`](https://github.com/intlify/vue-i18n-next) for more details.
+14
View File
@@ -0,0 +1,14 @@
button:
about: حول
back: رجوع
go: تجربة
home: الرئيسية
toggle_dark: التغيير إلى الوضع المظلم
toggle_langs: تغيير اللغة
intro:
desc: vite مثال لتطبيق
dynamic-route: عرض لتوجيهات ديناميكية
hi: مرحبا {name}
aka: معروف أيضا تحت مسمى
whats-your-name: ما إسمك؟
not-found: صفحة غير موجودة
+14
View File
@@ -0,0 +1,14 @@
button:
about: Über
back: Zurück
go: Los
home: Startseite
toggle_dark: Dunkelmodus umschalten
toggle_langs: Sprachen ändern
intro:
desc: Vite Startvorlage mit Vorlieben
dynamic-route: Demo einer dynamischen Route
hi: Hi, {name}!
aka: Auch bekannt als
whats-your-name: Wie heißt du?
not-found: Nicht gefunden
-17
View File
@@ -1,17 +0,0 @@
{
"button": {
"about": "About",
"back": "Back",
"go": "GO",
"home": "Home",
"toggle_dark": "Toggle dark mode",
"toggle_langs": "Change languages"
},
"intro": {
"desc": "Opinionated Vite Starter Template",
"dynamic-route": "Demo of dynamic route",
"hi": "Hi, {name}!",
"whats-your-name": "What's your name?"
},
"not-found": "Not found"
}
+14
View File
@@ -0,0 +1,14 @@
button:
about: About
back: Back
go: GO
home: Home
toggle_dark: Toggle dark mode
toggle_langs: Change languages
intro:
desc: Opinionated Vite Starter Template
dynamic-route: Demo of dynamic route
hi: Hi, {name}!
aka: Also known as
whats-your-name: What's your name?
not-found: Not found
-17
View File
@@ -1,17 +0,0 @@
{
"button": {
"about": "Acerca de",
"back": "Atrás",
"go": "Ir",
"home": "Inicio",
"toggle_dark": "Alternar modo oscuro",
"toggle_langs": "Cambiar idiomas"
},
"intro": {
"desc": "Plantilla de Inicio de Vite Dogmática",
"dynamic-route": "Demo de ruta dinámica",
"hi": "¡Hola, {name}!",
"whats-your-name": "¿Cómo te llamas?"
},
"not-found": "No se ha encontrado"
}
+14
View File
@@ -0,0 +1,14 @@
button:
about: Acerca de
back: Atrás
go: Ir
home: Inicio
toggle_dark: Alternar modo oscuro
toggle_langs: Cambiar idiomas
intro:
desc: Plantilla de Inicio de Vite Dogmática
dynamic-route: Demo de ruta dinámica
hi: ¡Hola, {name}!
aka: También conocido como
whats-your-name: ¿Cómo te llamas?
not-found: No se ha encontrado
-13
View File
@@ -1,13 +0,0 @@
{
"button": {
"back": "Retour",
"go": "Essayer"
},
"intro": {
"desc": "Example d'application Vite",
"dynamic-route": "Démo de route dynamique",
"hi": "Salut, {name} !",
"whats-your-name": "Comment t'appelles-tu ?"
},
"not-found": "Page non trouvée"
}
+14
View File
@@ -0,0 +1,14 @@
button:
about: À propos
back: Retour
go: Essayer
home: Accueil
toggle_dark: Basculer en mode sombre
toggle_langs: Changer de langue
intro:
desc: Exemple d'application Vite
dynamic-route: Démo de route dynamique
hi: Salut, {name}!
aka: Aussi connu sous le nom de
whats-your-name: Comment t'appelles-tu ?
not-found: Page non trouvée
+14
View File
@@ -0,0 +1,14 @@
button:
about: Tentang
back: Kembali
go: Pergi
home: Beranda
toggle_dark: Ubah ke mode gelap
toggle_langs: Ubah bahasa
intro:
desc: Template awal vite
dynamic-route: Contoh rute dinamik
hi: Halo, {name}!
aka: Juga diketahui sebagai
whats-your-name: Siapa nama anda?
not-found: Tidak ditemukan
+13
View File
@@ -0,0 +1,13 @@
button:
about: Su di me
back: Indietro
go: Vai
home: Home
toggle_dark: Attiva/disattiva modalità scura
toggle_langs: Cambia lingua
intro:
desc: Modello per una Applicazione Vite
dynamic-route: Demo di rotta dinamica
hi: Ciao, {name}!
whats-your-name: Come ti chiami?
not-found: Non trovato
-17
View File
@@ -1,17 +0,0 @@
{
"button": {
"about": "これは?",
"back": "戻る",
"go": "進む",
"home": "ホーム",
"toggle_dark": "ダークモード切り替え",
"toggle_langs": "言語切り替え"
},
"intro": {
"desc": "固執された Vite スターターテンプレート",
"dynamic-route": "動的ルートのデモ",
"hi": "こんにちは、{name}!",
"whats-your-name": "あなたの名前は?"
},
"not-found": "見つかりませんでした"
}
+13
View File
@@ -0,0 +1,13 @@
button:
about: これは?
back: 戻る
go: 進む
home: ホーム
toggle_dark: ダークモード切り替え
toggle_langs: 言語切り替え
intro:
desc: 固執された Vite スターターテンプレート
dynamic-route: 動的ルートのデモ
hi: こんにちは、{name}!
whats-your-name: 君の名は。
not-found: 見つかりませんでした
+14
View File
@@ -0,0 +1,14 @@
button:
about: შესახებ
back: უკან
go: დაწყება
home: მთავარი
toggle_dark: გადართე მუქი რეჟიმი
toggle_langs: ენის შეცვლა
intro:
desc: Opinionated Vite Starter Template
dynamic-route: დინამიური როუტინგის დემო
hi: გამარჯობა, {name}!
aka: ასევე ცნობილი როგორც
whats-your-name: რა გქვია?
not-found: ვერ მოიძებნა
-17
View File
@@ -1,17 +0,0 @@
{
"button": {
"about": "소개",
"back": "뒤로가기",
"go": "이동",
"home": "홈",
"toggle_dark": "다크모드 토글",
"toggle_langs": "언어 변경"
},
"intro": {
"desc": "Vite 애플리케이션 템플릿",
"dynamic-route": "다이나믹 라우트 데모",
"hi": "안녕, {name}!",
"whats-your-name": "이름이 뭐예요?"
},
"not-found": "찾을 수 없습니다"
}
+13
View File
@@ -0,0 +1,13 @@
button:
about: 소개
back: 뒤로가기
go: 이동
home: 홈
toggle_dark: 다크모드 토글
toggle_langs: 언어 변경
intro:
desc: Vite 애플리케이션 템플릿
dynamic-route: 다이나믹 라우트 데모
hi: 안녕, {name}!
whats-your-name: 이름이 뭐예요?
not-found: 찾을 수 없습니다
+14
View File
@@ -0,0 +1,14 @@
button:
about: O nas
back: Wróć
go: WEJDŹ
home: Strona główna
toggle_dark: Ustaw tryb nocny
toggle_langs: Zmień język
intro:
desc: Opiniowany szablon startowy Vite
dynamic-route: Demonstracja dynamicznego route
hi: Cześć, {name}!
aka: Znany też jako
whats-your-name: Jak masz na imię?
not-found: Nie znaleziono
+14
View File
@@ -0,0 +1,14 @@
button:
about: Sobre
back: Voltar
go: Ir
home: Início
toggle_dark: Alternar modo escuro
toggle_langs: Mudar de idioma
intro:
desc: Modelo Opinativo de Partida de Vite
dynamic-route: Demonstração de rota dinâmica
hi: Olá, {name}!
aka: Também conhecido como
whats-your-name: Qual é o seu nome?
not-found: Não encontrado
+13
View File
@@ -0,0 +1,13 @@
button:
about: О шаблоне
back: Назад
go: Перейти
home: Главная
toggle_dark: Включить темный режим
toggle_langs: Сменить язык
intro:
desc: Самостоятельный начальный шаблон Vite
dynamic-route: Демо динамического маршрута
hi: Привет, {name}!
whats-your-name: Как тебя зовут?
not-found: Не найден
-17
View File
@@ -1,17 +0,0 @@
{
"button": {
"about": "Hakkımda",
"back": "Geri",
"go": "İLERİ",
"home": "Anasayfa",
"toggle_dark": "Karanlık modu değiştir",
"toggle_langs": "Dilleri değiştir"
},
"intro": {
"desc": "Görüşlü Vite Başlangıç Şablonu",
"dynamic-route": "Dinamik rota demosu",
"hi": "Merhaba, {name}!",
"whats-your-name": "Adınız nedir ?"
},
"not-found": "Bulunamadı"
}
+14
View File
@@ -0,0 +1,14 @@
button:
about: Hakkımda
back: Geri
go: İLERİ
home: Anasayfa
toggle_dark: Karanlık modu değiştir
toggle_langs: Dilleri değiştir
intro:
desc: Görüşlü Vite Başlangıç Şablonu
dynamic-route: Dinamik rota demosu
hi: Merhaba, {name}!
aka: Ayrıca şöyle bilinir
whats-your-name: Adınız nedir?
not-found: Bulunamadı
+13
View File
@@ -0,0 +1,13 @@
button:
about: Про шаблон
back: Назад
go: Перейти
home: Головна
toggle_dark: Переключити темний режим
toggle_langs: Змінити мову
intro:
desc: Самостійний початковий шаблон Vite
dynamic-route: Демо динамічного маршруту
hi: Привіт, {name}!
whats-your-name: Як тебе звати?
not-found: Не знайдено
+14
View File
@@ -0,0 +1,14 @@
button:
about: Haqida
back: Orqaga
go: Kettik
home: Bosh sahifa
toggle_dark: Qorong‘i rejimga o‘tish
toggle_langs: Tilni o‘zgartirish
intro:
desc: O‘ylangan boshlang‘ich Vite shabloni
dynamic-route: Dynamic route demo'si
hi: Assalomu alaykum, {name}!
aka: shuningdek
whats-your-name: Ismingiz nima?
not-found: Topilmadi
-13
View File
@@ -1,13 +0,0 @@
{
"button": {
"back": "Quay lại",
"go": "Đi"
},
"intro": {
"desc": "Ý kiến cá nhân Vite Template để bắt đầu",
"dynamic-route": "Bản giới thiệu về dynamic route",
"hi": "Hi, {name}!",
"whats-your-name": "Tên bạn là gì?"
},
"not-found": "Không tìm thấy"
}
+13
View File
@@ -0,0 +1,13 @@
button:
about: Về
back: Quay lại
go: Đi
home: Khởi đầu
toggle_dark: Chuyển đổi chế độ tối
toggle_langs: Thay đổi ngôn ngữ
intro:
desc: Ý kiến cá nhân Vite Template để bắt đầu
dynamic-route: Bản giới thiệu về dynamic route
hi: Hi, {name}!
whats-your-name: Tên bạn là gì?
not-found: Không tìm thấy
-17
View File
@@ -1,17 +0,0 @@
{
"button": {
"about": "关于",
"back": "返回",
"go": "确定",
"home": "首页",
"toggle_dark": "切换深色模式",
"toggle_langs": "切换语言"
},
"intro": {
"desc": "固执己见的 Vite 项目模板",
"dynamic-route": "动态路由演示",
"hi": "你好,{name}!",
"whats-your-name": "输入你的名字"
},
"not-found": "未找到页面"
}
+14
View File
@@ -0,0 +1,14 @@
button:
about: 关于
back: 返回
go: 确定
home: 首页
toggle_dark: 切换深色模式
toggle_langs: 切换语言
intro:
desc: 固执己见的 Vite 项目模板
dynamic-route: 动态路由演示
hi: 你好,{name}
aka: 也叫
whats-your-name: 输入你的名字
not-found: 未找到页面
+12 -12
View File
@@ -1,17 +1,17 @@
[build.environment]
NPM_FLAGS = "--prefix=/dev/null"
NODE_VERSION = "14"
[build]
publish = "dist"
command = "npx pnpm i --store=node_modules/.pnpm-store && npx pnpm run build"
publish = "dist"
command = "pnpm run build"
[build.environment]
NODE_VERSION = "22"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
from = "/*"
to = "/index.html"
status = 200
[[headers]]
for = "/manifest.webmanifest"
[headers.values]
Content-Type = "application/manifest+json"
for = "/manifest.webmanifest"
[headers.values]
Content-Type = "application/manifest+json"
+70 -40
View File
@@ -1,51 +1,81 @@
{
"type": "module",
"private": true,
"packageManager": "pnpm@10.30.2",
"scripts": {
"build": "vite-ssg build",
"dev": "vite --port 3333 --open",
"build": "cross-env NODE_ENV=production vite-ssg build"
"lint": "eslint .",
"preview": "vite preview",
"preview-https": "serve dist",
"test": "vitest",
"test:e2e": "cypress open",
"test:unit": "vitest",
"typecheck": "vue-tsc --noEmit",
"up": "taze major -I",
"postinstall": "npx simple-git-hooks",
"sizecheck": "npx vite-bundle-visualizer"
},
"dependencies": {
"@vueuse/core": "^4.1.1",
"@vueuse/head": "^0.2.3",
"nprogress": "^0.2.0",
"prism-theme-vars": "^0.1.4",
"vue": "^3.0.5",
"vue-i18n": "^9.0.0-rc.6",
"vue-router": "^4.0.3"
"@unhead/vue": "catalog:frontend",
"@unocss/reset": "catalog:frontend",
"@vueuse/core": "catalog:frontend",
"nprogress": "catalog:frontend",
"pinia": "catalog:frontend",
"vue": "catalog:frontend",
"vue-i18n": "catalog:frontend",
"vue-router": "catalog:frontend"
},
"devDependencies": {
"@antfu/eslint-config": "^0.4.3",
"@iconify/json": "^1.1.303",
"@intlify/vite-plugin-vue-i18n": "^1.0.0-beta.17",
"@tailwindcss/typography": "^0.4.0",
"@types/nprogress": "^0.2.0",
"@typescript-eslint/eslint-plugin": "^4.15.0",
"@vitejs/plugin-vue": "^1.1.4",
"@vue/compiler-sfc": "^3.0.5",
"@vue/server-renderer": "^3.0.5",
"autoprefixer": "^10.2.4",
"cross-env": "^7.0.3",
"eslint": "^7.20.0",
"markdown-it-prism": "^2.1.4",
"pnpm": "^5.17.2",
"postcss": "^8.2.6",
"postcss-nested": "^5.0.3",
"tailwindcss": "^2.0.3",
"typescript": "^4.1.5",
"vite": "^2.0.0-beta.69",
"vite-plugin-components": "^0.6.10",
"vite-plugin-icons": "^0.2.1",
"vite-plugin-md": "^0.4.2",
"vite-plugin-pages": "^0.4.2",
"vite-plugin-pwa": "^0.4.6",
"vite-plugin-vue-layouts": "^0.2.2",
"vite-ssg": "^0.8.8"
"@antfu/eslint-config": "catalog:dev",
"@iconify-json/carbon": "catalog:dev",
"@intlify/unplugin-vue-i18n": "catalog:build",
"@shikijs/markdown-it": "catalog:build",
"@types/markdown-it-link-attributes": "catalog:types",
"@types/nprogress": "catalog:types",
"@unocss/eslint-config": "catalog:build",
"@vitejs/plugin-vue": "catalog:build",
"@vue-macros/volar": "catalog:dev",
"@vue/test-utils": "catalog:dev",
"beasties": "catalog:build",
"cypress": "catalog:dev",
"cypress-vite": "catalog:dev",
"eslint": "catalog:dev",
"eslint-plugin-cypress": "catalog:dev",
"eslint-plugin-format": "catalog:dev",
"https-localhost": "catalog:dev",
"lint-staged": "catalog:dev",
"markdown-it-link-attributes": "catalog:build",
"rollup": "catalog:build",
"shiki": "catalog:build",
"simple-git-hooks": "catalog:dev",
"taze": "catalog:dev",
"typescript": "catalog:dev",
"unocss": "catalog:build",
"unplugin-auto-import": "catalog:build",
"unplugin-vue-components": "catalog:build",
"unplugin-vue-macros": "catalog:build",
"unplugin-vue-markdown": "catalog:build",
"vite": "catalog:build",
"vite-bundle-visualizer": "catalog:build",
"vite-plugin-inspect": "catalog:build",
"vite-plugin-pwa": "catalog:build",
"vite-plugin-vue-devtools": "catalog:build",
"vite-plugin-vue-layouts": "catalog:build",
"vite-ssg": "catalog:build",
"vite-ssg-sitemap": "catalog:build",
"vitest": "catalog:dev",
"vue-tsc": "catalog:dev"
},
"eslintConfig": {
"extends": "@antfu/eslint-config",
"rules": {
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "off"
}
"resolutions": {
"unplugin": "catalog:build",
"vite": "catalog:build",
"vite-plugin-inspect": "catalog:build"
},
"simple-git-hooks": {
"pre-commit": "pnpm lint-staged"
},
"lint-staged": {
"*": "eslint --fix"
}
}
+13043 -5448
View File
File diff suppressed because it is too large Load Diff
+68
View File
@@ -0,0 +1,68 @@
shellEmulator: true
trustPolicy: no-downgrade
packages: []
catalogs:
build:
'@intlify/unplugin-vue-i18n': ^11.0.7
'@shikijs/markdown-it': ^3.23.0
'@unocss/eslint-config': ^66.6.1
'@vitejs/plugin-vue': ^6.0.4
beasties: ^0.4.1
markdown-it-link-attributes: ^4.0.1
rollup: ^4.59.0
shiki: ^3.23.0
unocss: ^66.6.1
unplugin: ^2.3.11
unplugin-auto-import: ^21.0.0
unplugin-vue-components: ^31.0.0
unplugin-vue-macros: ^2.14.5
unplugin-vue-markdown: ^29.2.0
vite: ^7.3.1
vite-bundle-visualizer: ^1.2.1
vite-plugin-inspect: ^11.3.3
vite-plugin-pwa: ^1.2.0
vite-plugin-vue-devtools: ^8.0.6
vite-plugin-vue-layouts: ^0.11.0
vite-ssg: ^28.3.0
vite-ssg-sitemap: ^0.10.0
dev:
'@antfu/eslint-config': ^7.6.1
'@iconify-json/carbon': ^1.2.18
'@vue-macros/volar': ^3.1.2
'@vue/test-utils': ^2.4.6
cypress: ^15.10.0
cypress-vite: ^1.8.0
eslint: ^10.0.2
eslint-plugin-cypress: ^6.1.0
eslint-plugin-format: ^2.0.1
https-localhost: ^4.7.1
lint-staged: ^16.2.7
simple-git-hooks: ^2.13.1
taze: ^19.9.2
typescript: ^5.8.2
vitest: ^4.0.18
vue-tsc: ^3.2.5
frontend:
'@unhead/vue': ^2.1.7
'@unocss/reset': ^66.6.1
'@vueuse/core': ^14.2.1
nprogress: ^0.2.0
pinia: ^3.0.4
vue: ^3.5.29
vue-i18n: ^11.2.8
vue-router: ^5.0.3
types:
'@types/markdown-it-link-attributes': ^3.0.5
'@types/nprogress': ^0.2.3
onlyBuiltDependencies:
- cypress
- esbuild
- simple-git-hooks
-7
View File
@@ -1,7 +0,0 @@
module.exports = {
plugins: {
'postcss-nested': {},
tailwindcss: {},
autoprefixer: {},
},
}
+3
View File
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.562 26L17.17 8.928l2.366-3.888L17.828 4L16 7.005L14.17 4l-1.708 1.04l2.366 3.888L4.438 26H2v2h28v-2zM16 10.85L25.22 26H17v-8h-2v8H6.78z" fill="white" />
</svg>

After

Width:  |  Height:  |  Size: 311 B

+2 -8
View File
@@ -1,9 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<style>
path { fill: #222; }
@media (prefers-color-scheme: dark) {
path { fill: #ffffff; }
}
</style>
<path d="M27.562 26L17.17 8.928l2.366-3.888L17.828 4L16 7.005L14.17 4l-1.708 1.04l2.366 3.888L4.438 26H2v2h28v-2zM16 10.85L25.22 26H17v-8h-2v8H6.78z" />
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.562 26L17.17 8.928l2.366-3.888L17.828 4L16 7.005L14.17 4l-1.708 1.04l2.366 3.888L4.438 26H2v2h28v-2zM16 10.85L25.22 26H17v-8h-2v8H6.78z" fill="#222" />
</svg>

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 310 B

-2
View File
@@ -1,2 +0,0 @@
User-agent: *
Allow: /
+17 -5
View File
@@ -1,17 +1,29 @@
<script setup lang="ts">
import { useHead } from '@vueuse/head'
// https://github.com/vueuse/head
// you can use this to manipulate the document head in any components,
// they will be renedered correctly in the html results with vite-ssg
// they will be rendered correctly in the html results with vite-ssg
useHead({
title: 'Vitesse',
meta: [
{ name: 'description', content: 'Opinionated Vite Starter Template' },
{
name: 'description',
content: 'Opinionated Vite Starter Template',
},
{
name: 'theme-color',
content: () => isDark.value ? '#00aba9' : '#ffffff',
},
],
link: [
{
rel: 'icon',
type: 'image/svg+xml',
href: () => preferredDark.value ? '/favicon-dark.svg' : '/favicon.svg',
},
],
})
</script>
<template>
<router-view />
<RouterView />
</template>
+632
View File
@@ -0,0 +1,632 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
// biome-ignore lint: disable
export {}
declare global {
const EffectScope: typeof import('vue').EffectScope
const asyncComputed: typeof import('@vueuse/core').asyncComputed
const autoResetRef: typeof import('@vueuse/core').autoResetRef
const computed: typeof import('vue').computed
const computedAsync: typeof import('@vueuse/core').computedAsync
const computedEager: typeof import('@vueuse/core').computedEager
const computedInject: typeof import('@vueuse/core').computedInject
const computedWithControl: typeof import('@vueuse/core').computedWithControl
const controlledComputed: typeof import('@vueuse/core').controlledComputed
const controlledRef: typeof import('@vueuse/core').controlledRef
const createApp: typeof import('vue').createApp
const createEventHook: typeof import('@vueuse/core').createEventHook
const createGlobalState: typeof import('@vueuse/core').createGlobalState
const createInjectionState: typeof import('@vueuse/core').createInjectionState
const createReactiveFn: typeof import('@vueuse/core').createReactiveFn
const createRef: typeof import('@vueuse/core').createRef
const createReusableTemplate: typeof import('@vueuse/core').createReusableTemplate
const createSharedComposable: typeof import('@vueuse/core').createSharedComposable
const createTemplatePromise: typeof import('@vueuse/core').createTemplatePromise
const createUnrefFn: typeof import('@vueuse/core').createUnrefFn
const customRef: typeof import('vue').customRef
const debouncedRef: typeof import('@vueuse/core').debouncedRef
const debouncedWatch: typeof import('@vueuse/core').debouncedWatch
const defineAsyncComponent: typeof import('vue').defineAsyncComponent
const defineComponent: typeof import('vue').defineComponent
const definePage: typeof import('vue-router/experimental').definePage
const eagerComputed: typeof import('@vueuse/core').eagerComputed
const effectScope: typeof import('vue').effectScope
const extendRef: typeof import('@vueuse/core').extendRef
const getCurrentInstance: typeof import('vue').getCurrentInstance
const getCurrentScope: typeof import('vue').getCurrentScope
const getCurrentWatcher: typeof import('vue').getCurrentWatcher
const h: typeof import('vue').h
const ignorableWatch: typeof import('@vueuse/core').ignorableWatch
const inject: typeof import('vue').inject
const injectHead: typeof import('@unhead/vue').injectHead
const injectLocal: typeof import('@vueuse/core').injectLocal
const isDark: typeof import('./composables/dark').isDark
const isDefined: typeof import('@vueuse/core').isDefined
const isProxy: typeof import('vue').isProxy
const isReactive: typeof import('vue').isReactive
const isReadonly: typeof import('vue').isReadonly
const isRef: typeof import('vue').isRef
const isShallow: typeof import('vue').isShallow
const makeDestructurable: typeof import('@vueuse/core').makeDestructurable
const markRaw: typeof import('vue').markRaw
const nextTick: typeof import('vue').nextTick
const onActivated: typeof import('vue').onActivated
const onBeforeMount: typeof import('vue').onBeforeMount
const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
const onBeforeUnmount: typeof import('vue').onBeforeUnmount
const onBeforeUpdate: typeof import('vue').onBeforeUpdate
const onClickOutside: typeof import('@vueuse/core').onClickOutside
const onDeactivated: typeof import('vue').onDeactivated
const onElementRemoval: typeof import('@vueuse/core').onElementRemoval
const onErrorCaptured: typeof import('vue').onErrorCaptured
const onKeyStroke: typeof import('@vueuse/core').onKeyStroke
const onLongPress: typeof import('@vueuse/core').onLongPress
const onMounted: typeof import('vue').onMounted
const onRenderTracked: typeof import('vue').onRenderTracked
const onRenderTriggered: typeof import('vue').onRenderTriggered
const onScopeDispose: typeof import('vue').onScopeDispose
const onServerPrefetch: typeof import('vue').onServerPrefetch
const onStartTyping: typeof import('@vueuse/core').onStartTyping
const onUnmounted: typeof import('vue').onUnmounted
const onUpdated: typeof import('vue').onUpdated
const onWatcherCleanup: typeof import('vue').onWatcherCleanup
const pausableWatch: typeof import('@vueuse/core').pausableWatch
const preferredDark: typeof import('./composables/dark').preferredDark
const provide: typeof import('vue').provide
const provideLocal: typeof import('@vueuse/core').provideLocal
const reactify: typeof import('@vueuse/core').reactify
const reactifyObject: typeof import('@vueuse/core').reactifyObject
const reactive: typeof import('vue').reactive
const reactiveComputed: typeof import('@vueuse/core').reactiveComputed
const reactiveOmit: typeof import('@vueuse/core').reactiveOmit
const reactivePick: typeof import('@vueuse/core').reactivePick
const readonly: typeof import('vue').readonly
const ref: typeof import('vue').ref
const refAutoReset: typeof import('@vueuse/core').refAutoReset
const refDebounced: typeof import('@vueuse/core').refDebounced
const refDefault: typeof import('@vueuse/core').refDefault
const refManualReset: typeof import('@vueuse/core').refManualReset
const refThrottled: typeof import('@vueuse/core').refThrottled
const refWithControl: typeof import('@vueuse/core').refWithControl
const resolveComponent: typeof import('vue').resolveComponent
const resolveRef: typeof import('@vueuse/core').resolveRef
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
const shallowReactive: typeof import('vue').shallowReactive
const shallowReadonly: typeof import('vue').shallowReadonly
const shallowRef: typeof import('vue').shallowRef
const syncRef: typeof import('@vueuse/core').syncRef
const syncRefs: typeof import('@vueuse/core').syncRefs
const templateRef: typeof import('@vueuse/core').templateRef
const throttledRef: typeof import('@vueuse/core').throttledRef
const throttledWatch: typeof import('@vueuse/core').throttledWatch
const toRaw: typeof import('vue').toRaw
const toReactive: typeof import('@vueuse/core').toReactive
const toRef: typeof import('vue').toRef
const toRefs: typeof import('vue').toRefs
const toValue: typeof import('vue').toValue
const toggleDark: typeof import('./composables/dark').toggleDark
const triggerRef: typeof import('vue').triggerRef
const tryOnBeforeMount: typeof import('@vueuse/core').tryOnBeforeMount
const tryOnBeforeUnmount: typeof import('@vueuse/core').tryOnBeforeUnmount
const tryOnMounted: typeof import('@vueuse/core').tryOnMounted
const tryOnScopeDispose: typeof import('@vueuse/core').tryOnScopeDispose
const tryOnUnmounted: typeof import('@vueuse/core').tryOnUnmounted
const unref: typeof import('vue').unref
const unrefElement: typeof import('@vueuse/core').unrefElement
const until: typeof import('@vueuse/core').until
const useActiveElement: typeof import('@vueuse/core').useActiveElement
const useAnimate: typeof import('@vueuse/core').useAnimate
const useArrayDifference: typeof import('@vueuse/core').useArrayDifference
const useArrayEvery: typeof import('@vueuse/core').useArrayEvery
const useArrayFilter: typeof import('@vueuse/core').useArrayFilter
const useArrayFind: typeof import('@vueuse/core').useArrayFind
const useArrayFindIndex: typeof import('@vueuse/core').useArrayFindIndex
const useArrayFindLast: typeof import('@vueuse/core').useArrayFindLast
const useArrayIncludes: typeof import('@vueuse/core').useArrayIncludes
const useArrayJoin: typeof import('@vueuse/core').useArrayJoin
const useArrayMap: typeof import('@vueuse/core').useArrayMap
const useArrayReduce: typeof import('@vueuse/core').useArrayReduce
const useArraySome: typeof import('@vueuse/core').useArraySome
const useArrayUnique: typeof import('@vueuse/core').useArrayUnique
const useAsyncQueue: typeof import('@vueuse/core').useAsyncQueue
const useAsyncState: typeof import('@vueuse/core').useAsyncState
const useAttrs: typeof import('vue').useAttrs
const useBase64: typeof import('@vueuse/core').useBase64
const useBattery: typeof import('@vueuse/core').useBattery
const useBluetooth: typeof import('@vueuse/core').useBluetooth
const useBreakpoints: typeof import('@vueuse/core').useBreakpoints
const useBroadcastChannel: typeof import('@vueuse/core').useBroadcastChannel
const useBrowserLocation: typeof import('@vueuse/core').useBrowserLocation
const useCached: typeof import('@vueuse/core').useCached
const useClipboard: typeof import('@vueuse/core').useClipboard
const useClipboardItems: typeof import('@vueuse/core').useClipboardItems
const useCloned: typeof import('@vueuse/core').useCloned
const useColorMode: typeof import('@vueuse/core').useColorMode
const useConfirmDialog: typeof import('@vueuse/core').useConfirmDialog
const useCountdown: typeof import('@vueuse/core').useCountdown
const useCounter: typeof import('@vueuse/core').useCounter
const useCssModule: typeof import('vue').useCssModule
const useCssSupports: typeof import('@vueuse/core').useCssSupports
const useCssVar: typeof import('@vueuse/core').useCssVar
const useCssVars: typeof import('vue').useCssVars
const useCurrentElement: typeof import('@vueuse/core').useCurrentElement
const useCycleList: typeof import('@vueuse/core').useCycleList
const useDark: typeof import('@vueuse/core').useDark
const useDateFormat: typeof import('@vueuse/core').useDateFormat
const useDebounce: typeof import('@vueuse/core').useDebounce
const useDebounceFn: typeof import('@vueuse/core').useDebounceFn
const useDebouncedRefHistory: typeof import('@vueuse/core').useDebouncedRefHistory
const useDeviceMotion: typeof import('@vueuse/core').useDeviceMotion
const useDeviceOrientation: typeof import('@vueuse/core').useDeviceOrientation
const useDevicePixelRatio: typeof import('@vueuse/core').useDevicePixelRatio
const useDevicesList: typeof import('@vueuse/core').useDevicesList
const useDisplayMedia: typeof import('@vueuse/core').useDisplayMedia
const useDocumentVisibility: typeof import('@vueuse/core').useDocumentVisibility
const useDraggable: typeof import('@vueuse/core').useDraggable
const useDropZone: typeof import('@vueuse/core').useDropZone
const useElementBounding: typeof import('@vueuse/core').useElementBounding
const useElementByPoint: typeof import('@vueuse/core').useElementByPoint
const useElementHover: typeof import('@vueuse/core').useElementHover
const useElementSize: typeof import('@vueuse/core').useElementSize
const useElementVisibility: typeof import('@vueuse/core').useElementVisibility
const useEventBus: typeof import('@vueuse/core').useEventBus
const useEventListener: typeof import('@vueuse/core').useEventListener
const useEventSource: typeof import('@vueuse/core').useEventSource
const useEyeDropper: typeof import('@vueuse/core').useEyeDropper
const useFavicon: typeof import('@vueuse/core').useFavicon
const useFetch: typeof import('@vueuse/core').useFetch
const useFileDialog: typeof import('@vueuse/core').useFileDialog
const useFileSystemAccess: typeof import('@vueuse/core').useFileSystemAccess
const useFocus: typeof import('@vueuse/core').useFocus
const useFocusWithin: typeof import('@vueuse/core').useFocusWithin
const useFps: typeof import('@vueuse/core').useFps
const useFullscreen: typeof import('@vueuse/core').useFullscreen
const useGamepad: typeof import('@vueuse/core').useGamepad
const useGeolocation: typeof import('@vueuse/core').useGeolocation
const useHead: typeof import('@unhead/vue').useHead
const useHeadSafe: typeof import('@unhead/vue').useHeadSafe
const useI18n: typeof import('vue-i18n').useI18n
const useId: typeof import('vue').useId
const useIdle: typeof import('@vueuse/core').useIdle
const useImage: typeof import('@vueuse/core').useImage
const useInfiniteScroll: typeof import('@vueuse/core').useInfiniteScroll
const useIntersectionObserver: typeof import('@vueuse/core').useIntersectionObserver
const useInterval: typeof import('@vueuse/core').useInterval
const useIntervalFn: typeof import('@vueuse/core').useIntervalFn
const useKeyModifier: typeof import('@vueuse/core').useKeyModifier
const useLastChanged: typeof import('@vueuse/core').useLastChanged
const useLink: typeof import('vue-router/auto').useLink
const useLocalStorage: typeof import('@vueuse/core').useLocalStorage
const useMagicKeys: typeof import('@vueuse/core').useMagicKeys
const useManualRefHistory: typeof import('@vueuse/core').useManualRefHistory
const useMediaControls: typeof import('@vueuse/core').useMediaControls
const useMediaQuery: typeof import('@vueuse/core').useMediaQuery
const useMemoize: typeof import('@vueuse/core').useMemoize
const useMemory: typeof import('@vueuse/core').useMemory
const useModel: typeof import('vue').useModel
const useMounted: typeof import('@vueuse/core').useMounted
const useMouse: typeof import('@vueuse/core').useMouse
const useMouseInElement: typeof import('@vueuse/core').useMouseInElement
const useMousePressed: typeof import('@vueuse/core').useMousePressed
const useMutationObserver: typeof import('@vueuse/core').useMutationObserver
const useNavigatorLanguage: typeof import('@vueuse/core').useNavigatorLanguage
const useNetwork: typeof import('@vueuse/core').useNetwork
const useNow: typeof import('@vueuse/core').useNow
const useObjectUrl: typeof import('@vueuse/core').useObjectUrl
const useOffsetPagination: typeof import('@vueuse/core').useOffsetPagination
const useOnline: typeof import('@vueuse/core').useOnline
const usePageLeave: typeof import('@vueuse/core').usePageLeave
const useParallax: typeof import('@vueuse/core').useParallax
const useParentElement: typeof import('@vueuse/core').useParentElement
const usePerformanceObserver: typeof import('@vueuse/core').usePerformanceObserver
const usePermission: typeof import('@vueuse/core').usePermission
const usePointer: typeof import('@vueuse/core').usePointer
const usePointerLock: typeof import('@vueuse/core').usePointerLock
const usePointerSwipe: typeof import('@vueuse/core').usePointerSwipe
const usePreferredColorScheme: typeof import('@vueuse/core').usePreferredColorScheme
const usePreferredContrast: typeof import('@vueuse/core').usePreferredContrast
const usePreferredDark: typeof import('@vueuse/core').usePreferredDark
const usePreferredLanguages: typeof import('@vueuse/core').usePreferredLanguages
const usePreferredReducedMotion: typeof import('@vueuse/core').usePreferredReducedMotion
const usePreferredReducedTransparency: typeof import('@vueuse/core').usePreferredReducedTransparency
const usePrevious: typeof import('@vueuse/core').usePrevious
const useRafFn: typeof import('@vueuse/core').useRafFn
const useRefHistory: typeof import('@vueuse/core').useRefHistory
const useResizeObserver: typeof import('@vueuse/core').useResizeObserver
const useRoute: typeof import('vue-router').useRoute
const useRouter: typeof import('vue-router').useRouter
const useSSRWidth: typeof import('@vueuse/core').useSSRWidth
const useScreenOrientation: typeof import('@vueuse/core').useScreenOrientation
const useScreenSafeArea: typeof import('@vueuse/core').useScreenSafeArea
const useScriptTag: typeof import('@vueuse/core').useScriptTag
const useScroll: typeof import('@vueuse/core').useScroll
const useScrollLock: typeof import('@vueuse/core').useScrollLock
const useSeoMeta: typeof import('@unhead/vue').useSeoMeta
const useServerHead: typeof import('@unhead/vue').useServerHead
const useServerHeadSafe: typeof import('@unhead/vue').useServerHeadSafe
const useServerSeoMeta: typeof import('@unhead/vue').useServerSeoMeta
const useSessionStorage: typeof import('@vueuse/core').useSessionStorage
const useShare: typeof import('@vueuse/core').useShare
const useSlots: typeof import('vue').useSlots
const useSorted: typeof import('@vueuse/core').useSorted
const useSpeechRecognition: typeof import('@vueuse/core').useSpeechRecognition
const useSpeechSynthesis: typeof import('@vueuse/core').useSpeechSynthesis
const useStepper: typeof import('@vueuse/core').useStepper
const useStorage: typeof import('@vueuse/core').useStorage
const useStorageAsync: typeof import('@vueuse/core').useStorageAsync
const useStyleTag: typeof import('@vueuse/core').useStyleTag
const useSupported: typeof import('@vueuse/core').useSupported
const useSwipe: typeof import('@vueuse/core').useSwipe
const useTemplateRef: typeof import('vue').useTemplateRef
const useTemplateRefsList: typeof import('@vueuse/core').useTemplateRefsList
const useTextDirection: typeof import('@vueuse/core').useTextDirection
const useTextSelection: typeof import('@vueuse/core').useTextSelection
const useTextareaAutosize: typeof import('@vueuse/core').useTextareaAutosize
const useThrottle: typeof import('@vueuse/core').useThrottle
const useThrottleFn: typeof import('@vueuse/core').useThrottleFn
const useThrottledRefHistory: typeof import('@vueuse/core').useThrottledRefHistory
const useTimeAgo: typeof import('@vueuse/core').useTimeAgo
const useTimeAgoIntl: typeof import('@vueuse/core').useTimeAgoIntl
const useTimeout: typeof import('@vueuse/core').useTimeout
const useTimeoutFn: typeof import('@vueuse/core').useTimeoutFn
const useTimeoutPoll: typeof import('@vueuse/core').useTimeoutPoll
const useTimestamp: typeof import('@vueuse/core').useTimestamp
const useTitle: typeof import('@vueuse/core').useTitle
const useToNumber: typeof import('@vueuse/core').useToNumber
const useToString: typeof import('@vueuse/core').useToString
const useToggle: typeof import('@vueuse/core').useToggle
const useTransition: typeof import('@vueuse/core').useTransition
const useUrlSearchParams: typeof import('@vueuse/core').useUrlSearchParams
const useUserMedia: typeof import('@vueuse/core').useUserMedia
const useUserStore: typeof import('./stores/user').useUserStore
const useVModel: typeof import('@vueuse/core').useVModel
const useVModels: typeof import('@vueuse/core').useVModels
const useVibrate: typeof import('@vueuse/core').useVibrate
const useVirtualList: typeof import('@vueuse/core').useVirtualList
const useWakeLock: typeof import('@vueuse/core').useWakeLock
const useWebNotification: typeof import('@vueuse/core').useWebNotification
const useWebSocket: typeof import('@vueuse/core').useWebSocket
const useWebWorker: typeof import('@vueuse/core').useWebWorker
const useWebWorkerFn: typeof import('@vueuse/core').useWebWorkerFn
const useWindowFocus: typeof import('@vueuse/core').useWindowFocus
const useWindowScroll: typeof import('@vueuse/core').useWindowScroll
const useWindowSize: typeof import('@vueuse/core').useWindowSize
const watch: typeof import('vue').watch
const watchArray: typeof import('@vueuse/core').watchArray
const watchAtMost: typeof import('@vueuse/core').watchAtMost
const watchDebounced: typeof import('@vueuse/core').watchDebounced
const watchDeep: typeof import('@vueuse/core').watchDeep
const watchEffect: typeof import('vue').watchEffect
const watchIgnorable: typeof import('@vueuse/core').watchIgnorable
const watchImmediate: typeof import('@vueuse/core').watchImmediate
const watchOnce: typeof import('@vueuse/core').watchOnce
const watchPausable: typeof import('@vueuse/core').watchPausable
const watchPostEffect: typeof import('vue').watchPostEffect
const watchSyncEffect: typeof import('vue').watchSyncEffect
const watchThrottled: typeof import('@vueuse/core').watchThrottled
const watchTriggerable: typeof import('@vueuse/core').watchTriggerable
const watchWithFilter: typeof import('@vueuse/core').watchWithFilter
const whenever: typeof import('@vueuse/core').whenever
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}
// for vue template auto import
import { UnwrapRef } from 'vue'
declare module 'vue' {
interface GlobalComponents {}
interface ComponentCustomProperties {
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
readonly computed: UnwrapRef<typeof import('vue')['computed']>
readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']>
readonly computedInject: UnwrapRef<typeof import('@vueuse/core')['computedInject']>
readonly computedWithControl: UnwrapRef<typeof import('@vueuse/core')['computedWithControl']>
readonly controlledComputed: UnwrapRef<typeof import('@vueuse/core')['controlledComputed']>
readonly controlledRef: UnwrapRef<typeof import('@vueuse/core')['controlledRef']>
readonly createApp: UnwrapRef<typeof import('vue')['createApp']>
readonly createEventHook: UnwrapRef<typeof import('@vueuse/core')['createEventHook']>
readonly createGlobalState: UnwrapRef<typeof import('@vueuse/core')['createGlobalState']>
readonly createInjectionState: UnwrapRef<typeof import('@vueuse/core')['createInjectionState']>
readonly createReactiveFn: UnwrapRef<typeof import('@vueuse/core')['createReactiveFn']>
readonly createRef: UnwrapRef<typeof import('@vueuse/core')['createRef']>
readonly createReusableTemplate: UnwrapRef<typeof import('@vueuse/core')['createReusableTemplate']>
readonly createSharedComposable: UnwrapRef<typeof import('@vueuse/core')['createSharedComposable']>
readonly createTemplatePromise: UnwrapRef<typeof import('@vueuse/core')['createTemplatePromise']>
readonly createUnrefFn: UnwrapRef<typeof import('@vueuse/core')['createUnrefFn']>
readonly customRef: UnwrapRef<typeof import('vue')['customRef']>
readonly debouncedRef: UnwrapRef<typeof import('@vueuse/core')['debouncedRef']>
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
readonly definePage: UnwrapRef<typeof import('vue-router/experimental')['definePage']>
readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
readonly extendRef: UnwrapRef<typeof import('@vueuse/core')['extendRef']>
readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']>
readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']>
readonly getCurrentWatcher: UnwrapRef<typeof import('vue')['getCurrentWatcher']>
readonly h: UnwrapRef<typeof import('vue')['h']>
readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']>
readonly inject: UnwrapRef<typeof import('vue')['inject']>
readonly injectHead: UnwrapRef<typeof import('@unhead/vue')['injectHead']>
readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']>
readonly isDark: UnwrapRef<typeof import('./composables/dark')['isDark']>
readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']>
readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']>
readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']>
readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']>
readonly isRef: UnwrapRef<typeof import('vue')['isRef']>
readonly isShallow: UnwrapRef<typeof import('vue')['isShallow']>
readonly makeDestructurable: UnwrapRef<typeof import('@vueuse/core')['makeDestructurable']>
readonly markRaw: UnwrapRef<typeof import('vue')['markRaw']>
readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router')['onBeforeRouteLeave']>
readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router')['onBeforeRouteUpdate']>
readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']>
readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']>
readonly onDeactivated: UnwrapRef<typeof import('vue')['onDeactivated']>
readonly onElementRemoval: UnwrapRef<typeof import('@vueuse/core')['onElementRemoval']>
readonly onErrorCaptured: UnwrapRef<typeof import('vue')['onErrorCaptured']>
readonly onKeyStroke: UnwrapRef<typeof import('@vueuse/core')['onKeyStroke']>
readonly onLongPress: UnwrapRef<typeof import('@vueuse/core')['onLongPress']>
readonly onMounted: UnwrapRef<typeof import('vue')['onMounted']>
readonly onRenderTracked: UnwrapRef<typeof import('vue')['onRenderTracked']>
readonly onRenderTriggered: UnwrapRef<typeof import('vue')['onRenderTriggered']>
readonly onScopeDispose: UnwrapRef<typeof import('vue')['onScopeDispose']>
readonly onServerPrefetch: UnwrapRef<typeof import('vue')['onServerPrefetch']>
readonly onStartTyping: UnwrapRef<typeof import('@vueuse/core')['onStartTyping']>
readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
readonly onWatcherCleanup: UnwrapRef<typeof import('vue')['onWatcherCleanup']>
readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']>
readonly preferredDark: UnwrapRef<typeof import('./composables/dark')['preferredDark']>
readonly provide: UnwrapRef<typeof import('vue')['provide']>
readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']>
readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']>
readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']>
readonly reactive: UnwrapRef<typeof import('vue')['reactive']>
readonly reactiveComputed: UnwrapRef<typeof import('@vueuse/core')['reactiveComputed']>
readonly reactiveOmit: UnwrapRef<typeof import('@vueuse/core')['reactiveOmit']>
readonly reactivePick: UnwrapRef<typeof import('@vueuse/core')['reactivePick']>
readonly readonly: UnwrapRef<typeof import('vue')['readonly']>
readonly ref: UnwrapRef<typeof import('vue')['ref']>
readonly refAutoReset: UnwrapRef<typeof import('@vueuse/core')['refAutoReset']>
readonly refDebounced: UnwrapRef<typeof import('@vueuse/core')['refDebounced']>
readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
readonly refManualReset: UnwrapRef<typeof import('@vueuse/core')['refManualReset']>
readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
readonly syncRef: UnwrapRef<typeof import('@vueuse/core')['syncRef']>
readonly syncRefs: UnwrapRef<typeof import('@vueuse/core')['syncRefs']>
readonly templateRef: UnwrapRef<typeof import('@vueuse/core')['templateRef']>
readonly throttledRef: UnwrapRef<typeof import('@vueuse/core')['throttledRef']>
readonly throttledWatch: UnwrapRef<typeof import('@vueuse/core')['throttledWatch']>
readonly toRaw: UnwrapRef<typeof import('vue')['toRaw']>
readonly toReactive: UnwrapRef<typeof import('@vueuse/core')['toReactive']>
readonly toRef: UnwrapRef<typeof import('vue')['toRef']>
readonly toRefs: UnwrapRef<typeof import('vue')['toRefs']>
readonly toValue: UnwrapRef<typeof import('vue')['toValue']>
readonly toggleDark: UnwrapRef<typeof import('./composables/dark')['toggleDark']>
readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']>
readonly tryOnBeforeMount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeMount']>
readonly tryOnBeforeUnmount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeUnmount']>
readonly tryOnMounted: UnwrapRef<typeof import('@vueuse/core')['tryOnMounted']>
readonly tryOnScopeDispose: UnwrapRef<typeof import('@vueuse/core')['tryOnScopeDispose']>
readonly tryOnUnmounted: UnwrapRef<typeof import('@vueuse/core')['tryOnUnmounted']>
readonly unref: UnwrapRef<typeof import('vue')['unref']>
readonly unrefElement: UnwrapRef<typeof import('@vueuse/core')['unrefElement']>
readonly until: UnwrapRef<typeof import('@vueuse/core')['until']>
readonly useActiveElement: UnwrapRef<typeof import('@vueuse/core')['useActiveElement']>
readonly useAnimate: UnwrapRef<typeof import('@vueuse/core')['useAnimate']>
readonly useArrayDifference: UnwrapRef<typeof import('@vueuse/core')['useArrayDifference']>
readonly useArrayEvery: UnwrapRef<typeof import('@vueuse/core')['useArrayEvery']>
readonly useArrayFilter: UnwrapRef<typeof import('@vueuse/core')['useArrayFilter']>
readonly useArrayFind: UnwrapRef<typeof import('@vueuse/core')['useArrayFind']>
readonly useArrayFindIndex: UnwrapRef<typeof import('@vueuse/core')['useArrayFindIndex']>
readonly useArrayFindLast: UnwrapRef<typeof import('@vueuse/core')['useArrayFindLast']>
readonly useArrayIncludes: UnwrapRef<typeof import('@vueuse/core')['useArrayIncludes']>
readonly useArrayJoin: UnwrapRef<typeof import('@vueuse/core')['useArrayJoin']>
readonly useArrayMap: UnwrapRef<typeof import('@vueuse/core')['useArrayMap']>
readonly useArrayReduce: UnwrapRef<typeof import('@vueuse/core')['useArrayReduce']>
readonly useArraySome: UnwrapRef<typeof import('@vueuse/core')['useArraySome']>
readonly useArrayUnique: UnwrapRef<typeof import('@vueuse/core')['useArrayUnique']>
readonly useAsyncQueue: UnwrapRef<typeof import('@vueuse/core')['useAsyncQueue']>
readonly useAsyncState: UnwrapRef<typeof import('@vueuse/core')['useAsyncState']>
readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']>
readonly useBase64: UnwrapRef<typeof import('@vueuse/core')['useBase64']>
readonly useBattery: UnwrapRef<typeof import('@vueuse/core')['useBattery']>
readonly useBluetooth: UnwrapRef<typeof import('@vueuse/core')['useBluetooth']>
readonly useBreakpoints: UnwrapRef<typeof import('@vueuse/core')['useBreakpoints']>
readonly useBroadcastChannel: UnwrapRef<typeof import('@vueuse/core')['useBroadcastChannel']>
readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']>
readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']>
readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']>
readonly useClipboardItems: UnwrapRef<typeof import('@vueuse/core')['useClipboardItems']>
readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']>
readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']>
readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']>
readonly useCountdown: UnwrapRef<typeof import('@vueuse/core')['useCountdown']>
readonly useCounter: UnwrapRef<typeof import('@vueuse/core')['useCounter']>
readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
readonly useCssSupports: UnwrapRef<typeof import('@vueuse/core')['useCssSupports']>
readonly useCssVar: UnwrapRef<typeof import('@vueuse/core')['useCssVar']>
readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
readonly useCurrentElement: UnwrapRef<typeof import('@vueuse/core')['useCurrentElement']>
readonly useCycleList: UnwrapRef<typeof import('@vueuse/core')['useCycleList']>
readonly useDark: UnwrapRef<typeof import('@vueuse/core')['useDark']>
readonly useDateFormat: UnwrapRef<typeof import('@vueuse/core')['useDateFormat']>
readonly useDebounce: UnwrapRef<typeof import('@vueuse/core')['useDebounce']>
readonly useDebounceFn: UnwrapRef<typeof import('@vueuse/core')['useDebounceFn']>
readonly useDebouncedRefHistory: UnwrapRef<typeof import('@vueuse/core')['useDebouncedRefHistory']>
readonly useDeviceMotion: UnwrapRef<typeof import('@vueuse/core')['useDeviceMotion']>
readonly useDeviceOrientation: UnwrapRef<typeof import('@vueuse/core')['useDeviceOrientation']>
readonly useDevicePixelRatio: UnwrapRef<typeof import('@vueuse/core')['useDevicePixelRatio']>
readonly useDevicesList: UnwrapRef<typeof import('@vueuse/core')['useDevicesList']>
readonly useDisplayMedia: UnwrapRef<typeof import('@vueuse/core')['useDisplayMedia']>
readonly useDocumentVisibility: UnwrapRef<typeof import('@vueuse/core')['useDocumentVisibility']>
readonly useDraggable: UnwrapRef<typeof import('@vueuse/core')['useDraggable']>
readonly useDropZone: UnwrapRef<typeof import('@vueuse/core')['useDropZone']>
readonly useElementBounding: UnwrapRef<typeof import('@vueuse/core')['useElementBounding']>
readonly useElementByPoint: UnwrapRef<typeof import('@vueuse/core')['useElementByPoint']>
readonly useElementHover: UnwrapRef<typeof import('@vueuse/core')['useElementHover']>
readonly useElementSize: UnwrapRef<typeof import('@vueuse/core')['useElementSize']>
readonly useElementVisibility: UnwrapRef<typeof import('@vueuse/core')['useElementVisibility']>
readonly useEventBus: UnwrapRef<typeof import('@vueuse/core')['useEventBus']>
readonly useEventListener: UnwrapRef<typeof import('@vueuse/core')['useEventListener']>
readonly useEventSource: UnwrapRef<typeof import('@vueuse/core')['useEventSource']>
readonly useEyeDropper: UnwrapRef<typeof import('@vueuse/core')['useEyeDropper']>
readonly useFavicon: UnwrapRef<typeof import('@vueuse/core')['useFavicon']>
readonly useFetch: UnwrapRef<typeof import('@vueuse/core')['useFetch']>
readonly useFileDialog: UnwrapRef<typeof import('@vueuse/core')['useFileDialog']>
readonly useFileSystemAccess: UnwrapRef<typeof import('@vueuse/core')['useFileSystemAccess']>
readonly useFocus: UnwrapRef<typeof import('@vueuse/core')['useFocus']>
readonly useFocusWithin: UnwrapRef<typeof import('@vueuse/core')['useFocusWithin']>
readonly useFps: UnwrapRef<typeof import('@vueuse/core')['useFps']>
readonly useFullscreen: UnwrapRef<typeof import('@vueuse/core')['useFullscreen']>
readonly useGamepad: UnwrapRef<typeof import('@vueuse/core')['useGamepad']>
readonly useGeolocation: UnwrapRef<typeof import('@vueuse/core')['useGeolocation']>
readonly useHead: UnwrapRef<typeof import('@unhead/vue')['useHead']>
readonly useHeadSafe: UnwrapRef<typeof import('@unhead/vue')['useHeadSafe']>
readonly useI18n: UnwrapRef<typeof import('vue-i18n')['useI18n']>
readonly useId: UnwrapRef<typeof import('vue')['useId']>
readonly useIdle: UnwrapRef<typeof import('@vueuse/core')['useIdle']>
readonly useImage: UnwrapRef<typeof import('@vueuse/core')['useImage']>
readonly useInfiniteScroll: UnwrapRef<typeof import('@vueuse/core')['useInfiniteScroll']>
readonly useIntersectionObserver: UnwrapRef<typeof import('@vueuse/core')['useIntersectionObserver']>
readonly useInterval: UnwrapRef<typeof import('@vueuse/core')['useInterval']>
readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
readonly useLink: UnwrapRef<typeof import('vue-router/auto')['useLink']>
readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
readonly useMagicKeys: UnwrapRef<typeof import('@vueuse/core')['useMagicKeys']>
readonly useManualRefHistory: UnwrapRef<typeof import('@vueuse/core')['useManualRefHistory']>
readonly useMediaControls: UnwrapRef<typeof import('@vueuse/core')['useMediaControls']>
readonly useMediaQuery: UnwrapRef<typeof import('@vueuse/core')['useMediaQuery']>
readonly useMemoize: UnwrapRef<typeof import('@vueuse/core')['useMemoize']>
readonly useMemory: UnwrapRef<typeof import('@vueuse/core')['useMemory']>
readonly useModel: UnwrapRef<typeof import('vue')['useModel']>
readonly useMounted: UnwrapRef<typeof import('@vueuse/core')['useMounted']>
readonly useMouse: UnwrapRef<typeof import('@vueuse/core')['useMouse']>
readonly useMouseInElement: UnwrapRef<typeof import('@vueuse/core')['useMouseInElement']>
readonly useMousePressed: UnwrapRef<typeof import('@vueuse/core')['useMousePressed']>
readonly useMutationObserver: UnwrapRef<typeof import('@vueuse/core')['useMutationObserver']>
readonly useNavigatorLanguage: UnwrapRef<typeof import('@vueuse/core')['useNavigatorLanguage']>
readonly useNetwork: UnwrapRef<typeof import('@vueuse/core')['useNetwork']>
readonly useNow: UnwrapRef<typeof import('@vueuse/core')['useNow']>
readonly useObjectUrl: UnwrapRef<typeof import('@vueuse/core')['useObjectUrl']>
readonly useOffsetPagination: UnwrapRef<typeof import('@vueuse/core')['useOffsetPagination']>
readonly useOnline: UnwrapRef<typeof import('@vueuse/core')['useOnline']>
readonly usePageLeave: UnwrapRef<typeof import('@vueuse/core')['usePageLeave']>
readonly useParallax: UnwrapRef<typeof import('@vueuse/core')['useParallax']>
readonly useParentElement: UnwrapRef<typeof import('@vueuse/core')['useParentElement']>
readonly usePerformanceObserver: UnwrapRef<typeof import('@vueuse/core')['usePerformanceObserver']>
readonly usePermission: UnwrapRef<typeof import('@vueuse/core')['usePermission']>
readonly usePointer: UnwrapRef<typeof import('@vueuse/core')['usePointer']>
readonly usePointerLock: UnwrapRef<typeof import('@vueuse/core')['usePointerLock']>
readonly usePointerSwipe: UnwrapRef<typeof import('@vueuse/core')['usePointerSwipe']>
readonly usePreferredColorScheme: UnwrapRef<typeof import('@vueuse/core')['usePreferredColorScheme']>
readonly usePreferredContrast: UnwrapRef<typeof import('@vueuse/core')['usePreferredContrast']>
readonly usePreferredDark: UnwrapRef<typeof import('@vueuse/core')['usePreferredDark']>
readonly usePreferredLanguages: UnwrapRef<typeof import('@vueuse/core')['usePreferredLanguages']>
readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']>
readonly usePreferredReducedTransparency: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedTransparency']>
readonly usePrevious: UnwrapRef<typeof import('@vueuse/core')['usePrevious']>
readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']>
readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']>
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
readonly useSSRWidth: UnwrapRef<typeof import('@vueuse/core')['useSSRWidth']>
readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>
readonly useScroll: UnwrapRef<typeof import('@vueuse/core')['useScroll']>
readonly useScrollLock: UnwrapRef<typeof import('@vueuse/core')['useScrollLock']>
readonly useSeoMeta: UnwrapRef<typeof import('@unhead/vue')['useSeoMeta']>
readonly useServerHead: UnwrapRef<typeof import('@unhead/vue')['useServerHead']>
readonly useServerHeadSafe: UnwrapRef<typeof import('@unhead/vue')['useServerHeadSafe']>
readonly useServerSeoMeta: UnwrapRef<typeof import('@unhead/vue')['useServerSeoMeta']>
readonly useSessionStorage: UnwrapRef<typeof import('@vueuse/core')['useSessionStorage']>
readonly useShare: UnwrapRef<typeof import('@vueuse/core')['useShare']>
readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
readonly useSorted: UnwrapRef<typeof import('@vueuse/core')['useSorted']>
readonly useSpeechRecognition: UnwrapRef<typeof import('@vueuse/core')['useSpeechRecognition']>
readonly useSpeechSynthesis: UnwrapRef<typeof import('@vueuse/core')['useSpeechSynthesis']>
readonly useStepper: UnwrapRef<typeof import('@vueuse/core')['useStepper']>
readonly useStorage: UnwrapRef<typeof import('@vueuse/core')['useStorage']>
readonly useStorageAsync: UnwrapRef<typeof import('@vueuse/core')['useStorageAsync']>
readonly useStyleTag: UnwrapRef<typeof import('@vueuse/core')['useStyleTag']>
readonly useSupported: UnwrapRef<typeof import('@vueuse/core')['useSupported']>
readonly useSwipe: UnwrapRef<typeof import('@vueuse/core')['useSwipe']>
readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
readonly useTemplateRefsList: UnwrapRef<typeof import('@vueuse/core')['useTemplateRefsList']>
readonly useTextDirection: UnwrapRef<typeof import('@vueuse/core')['useTextDirection']>
readonly useTextSelection: UnwrapRef<typeof import('@vueuse/core')['useTextSelection']>
readonly useTextareaAutosize: UnwrapRef<typeof import('@vueuse/core')['useTextareaAutosize']>
readonly useThrottle: UnwrapRef<typeof import('@vueuse/core')['useThrottle']>
readonly useThrottleFn: UnwrapRef<typeof import('@vueuse/core')['useThrottleFn']>
readonly useThrottledRefHistory: UnwrapRef<typeof import('@vueuse/core')['useThrottledRefHistory']>
readonly useTimeAgo: UnwrapRef<typeof import('@vueuse/core')['useTimeAgo']>
readonly useTimeAgoIntl: UnwrapRef<typeof import('@vueuse/core')['useTimeAgoIntl']>
readonly useTimeout: UnwrapRef<typeof import('@vueuse/core')['useTimeout']>
readonly useTimeoutFn: UnwrapRef<typeof import('@vueuse/core')['useTimeoutFn']>
readonly useTimeoutPoll: UnwrapRef<typeof import('@vueuse/core')['useTimeoutPoll']>
readonly useTimestamp: UnwrapRef<typeof import('@vueuse/core')['useTimestamp']>
readonly useTitle: UnwrapRef<typeof import('@vueuse/core')['useTitle']>
readonly useToNumber: UnwrapRef<typeof import('@vueuse/core')['useToNumber']>
readonly useToString: UnwrapRef<typeof import('@vueuse/core')['useToString']>
readonly useToggle: UnwrapRef<typeof import('@vueuse/core')['useToggle']>
readonly useTransition: UnwrapRef<typeof import('@vueuse/core')['useTransition']>
readonly useUrlSearchParams: UnwrapRef<typeof import('@vueuse/core')['useUrlSearchParams']>
readonly useUserMedia: UnwrapRef<typeof import('@vueuse/core')['useUserMedia']>
readonly useUserStore: UnwrapRef<typeof import('./stores/user')['useUserStore']>
readonly useVModel: UnwrapRef<typeof import('@vueuse/core')['useVModel']>
readonly useVModels: UnwrapRef<typeof import('@vueuse/core')['useVModels']>
readonly useVibrate: UnwrapRef<typeof import('@vueuse/core')['useVibrate']>
readonly useVirtualList: UnwrapRef<typeof import('@vueuse/core')['useVirtualList']>
readonly useWakeLock: UnwrapRef<typeof import('@vueuse/core')['useWakeLock']>
readonly useWebNotification: UnwrapRef<typeof import('@vueuse/core')['useWebNotification']>
readonly useWebSocket: UnwrapRef<typeof import('@vueuse/core')['useWebSocket']>
readonly useWebWorker: UnwrapRef<typeof import('@vueuse/core')['useWebWorker']>
readonly useWebWorkerFn: UnwrapRef<typeof import('@vueuse/core')['useWebWorkerFn']>
readonly useWindowFocus: UnwrapRef<typeof import('@vueuse/core')['useWindowFocus']>
readonly useWindowScroll: UnwrapRef<typeof import('@vueuse/core')['useWindowScroll']>
readonly useWindowSize: UnwrapRef<typeof import('@vueuse/core')['useWindowSize']>
readonly watch: UnwrapRef<typeof import('vue')['watch']>
readonly watchArray: UnwrapRef<typeof import('@vueuse/core')['watchArray']>
readonly watchAtMost: UnwrapRef<typeof import('@vueuse/core')['watchAtMost']>
readonly watchDebounced: UnwrapRef<typeof import('@vueuse/core')['watchDebounced']>
readonly watchDeep: UnwrapRef<typeof import('@vueuse/core')['watchDeep']>
readonly watchEffect: UnwrapRef<typeof import('vue')['watchEffect']>
readonly watchIgnorable: UnwrapRef<typeof import('@vueuse/core')['watchIgnorable']>
readonly watchImmediate: UnwrapRef<typeof import('@vueuse/core')['watchImmediate']>
readonly watchOnce: UnwrapRef<typeof import('@vueuse/core')['watchOnce']>
readonly watchPausable: UnwrapRef<typeof import('@vueuse/core')['watchPausable']>
readonly watchPostEffect: UnwrapRef<typeof import('vue')['watchPostEffect']>
readonly watchSyncEffect: UnwrapRef<typeof import('vue')['watchSyncEffect']>
readonly watchThrottled: UnwrapRef<typeof import('@vueuse/core')['watchThrottled']>
readonly watchTriggerable: UnwrapRef<typeof import('@vueuse/core')['watchTriggerable']>
readonly watchWithFilter: UnwrapRef<typeof import('@vueuse/core')['watchWithFilter']>
readonly whenever: UnwrapRef<typeof import('@vueuse/core')['whenever']>
}
}
+21
View File
@@ -0,0 +1,21 @@
/* eslint-disable */
// @ts-nocheck
// biome-ignore lint: disable
// oxlint-disable
// ------
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
README: typeof import('./components/README.md')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
TheCounter: typeof import('./components/TheCounter.vue')['default']
TheFooter: typeof import('./components/TheFooter.vue')['default']
TheInput: typeof import('./components/TheInput.vue')['default']
}
}
-37
View File
@@ -1,37 +0,0 @@
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
import { isDark, toggleDark } from '~/logics'
const { t, availableLocales, locale } = useI18n()
const toggleLocales = () => {
// change to some real logic
const locales = availableLocales
locale.value = locales[(locales.indexOf(locale.value) + 1) % locales.length]
}
</script>
<template>
<nav class="text-xl mt-6">
<router-link class="icon-btn mx-2" to="/" :title="t('button.home')">
<carbon-campsite />
</router-link>
<a class="icon-btn mx-2" :title="t('button.toggle_dark')" @click="toggleDark">
<carbon-moon v-if="isDark" />
<carbon-sun v-else />
</a>
<a class="icon-btn mx-2" :title="t('button.toggle_langs')" @click="toggleLocales">
<carbon-language />
</a>
<router-link class="icon-btn mx-2" to="/about" :title="t('button.about')">
<carbon-dicom-overlay />
</router-link>
<a class="icon-btn mx-2" rel="noreferrer" href="https://github.com/antfu/vitesse" target="_blank" title="GitHub">
<carbon-logo-github />
</a>
</nav>
</template>
+3 -4
View File
@@ -1,10 +1,9 @@
## Components
Components in this dir will be auto-registered and on-demand, powered by [`vite-plugin-components`](https://github.com/antfu/vite-plugin-components).
Components in this dir will be auto-registered and on-demand, powered by [`unplugin-vue-components`](https://github.com/antfu/unplugin-vue-components).
### Icons
You can uses icons from almost any icon sets by the power of [Iconify](https://iconify.design/).
You can use icons from almost any icon sets by the power of [Iconify](https://iconify.design/).
It will only bundles the icons you use, check out [vite-plugin-icons](https://github.com/antfu/vite-plugin-icons) for more details.
It will only bundle the icons you use. Check out [`unplugin-icons`](https://github.com/antfu/unplugin-icons) for more details.
+19
View File
@@ -0,0 +1,19 @@
<script setup lang="ts">
const props = defineProps<{
initial: number
}>()
const { count, inc, dec } = useCounter(props.initial)
</script>
<template>
<div>
{{ count }}
<button class="inc" @click="inc()">
+
</button>
<button class="dec" @click="dec()">
-
</button>
</div>
</template>
+37
View File
@@ -0,0 +1,37 @@
<script setup lang="ts">
import { availableLocales, loadLanguageAsync } from '~/modules/i18n'
const { t, locale } = useI18n()
async function toggleLocales() {
// change to some real logic
const locales = availableLocales
const newLocale = locales[(locales.indexOf(locale.value) + 1) % locales.length]
await loadLanguageAsync(newLocale)
locale.value = newLocale
}
</script>
<template>
<nav flex="~ gap-4" mt-6 justify-center text-xl>
<RouterLink icon-btn to="/" :title="t('button.home')">
<div i-carbon-campsite />
</RouterLink>
<button icon-btn :title="t('button.toggle_dark')" @click="toggleDark()">
<div i="carbon-sun dark:carbon-moon" />
</button>
<a icon-btn :title="t('button.toggle_langs')" @click="toggleLocales()">
<div i-carbon-language />
</a>
<RouterLink icon-btn to="/about" :title="t('button.about')" data-test-id="about">
<div i-carbon-dicom-overlay />
</RouterLink>
<a icon-btn rel="noreferrer" href="https://github.com/antfu/vitesse" target="_blank" title="GitHub">
<div i-carbon-logo-github />
</a>
</nav>
</template>
+20
View File
@@ -0,0 +1,20 @@
<script setup lang="ts">
const { modelValue } = defineModels<{
modelValue: string
}>()
</script>
<template>
<input
id="input"
v-model="modelValue"
v-bind="$attrs"
type="text"
p="x-4 y-2"
w="250px"
text="center"
bg="transparent"
border="~ rounded gray-200 dark:gray-700"
outline="none active:none"
>
</template>
+4
View File
@@ -0,0 +1,4 @@
// these APIs are auto-imported from @vueuse/core
export const isDark = useDark()
export const toggleDark = useToggle(isDark)
export const preferredDark = usePreferredDark()
+8 -13
View File
@@ -1,24 +1,19 @@
<script setup lang="ts">
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
const router = useRouter()
const { t } = useI18n()
useHead({
title: () => t('not-found'),
})
</script>
<template>
<main class="px-4 py-10 text-center text-teal-700 dark:text-gray-200">
<div>
<p class="text-4xl">
<carbon-warning class="inline-block" />
</p>
<main p="x4 y10" text="center teal-700 dark:gray-200">
<div text-4xl>
<div i-carbon-warning inline-block />
</div>
<router-view />
<RouterView />
<div>
<button
class="btn m-3 text-sm mt-8"
@click="router.back()"
>
<button btn text-sm m="3 t8" @click="router.back()">
{{ t('button.back') }}
</button>
</div>
+2 -2
View File
@@ -4,9 +4,9 @@ Vue components in this dir are used as layouts.
By default, `default.vue` will be used unless an alternative is specified in the route meta.
With [`vite-plugin-pages`](https://github.com/hannoeru/vite-plugin-pages) and [`vite-plugin-vue-layouts`](https://github.com/JohnCampionJr/vite-plugin-vue-layouts), you can specify the layout in the page's SFCs like this:
With [`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router) and [`vite-plugin-vue-layouts`](https://github.com/JohnCampionJr/vite-plugin-vue-layouts), you can specify the layout in the page's SFCs like this:
```html
```vue
<route lang="yaml">
meta:
layout: home
+7 -4
View File
@@ -1,8 +1,11 @@
<template>
<main class="px-4 py-10 text-center text-gray-700 dark:text-gray-200">
<router-view />
<Footer />
<div class="mt-5 m-auto text-center opacity-25 text-sm">
<main
px-4 py-10
text="center gray-700 dark:gray-200"
>
<RouterView />
<TheFooter />
<div mx-auto mt-5 text-center text-sm opacity-50>
[Default Layout]
</div>
</main>
+7 -4
View File
@@ -1,8 +1,11 @@
<template>
<main class="px-4 py-10 text-center text-gray-700 dark:text-gray-200">
<router-view />
<Footer />
<div class="mt-5 m-auto text-center opacity-25 text-sm">
<main
px-4 py-10
text="center gray-700 dark:gray-200"
>
<RouterView />
<TheFooter />
<div mx-auto mt-5 text-center text-sm opacity-50>
[Home Layout]
</div>
</main>
-25
View File
@@ -1,25 +0,0 @@
import { watch, computed } from 'vue'
import { usePreferredDark, useToggle } from '@vueuse/core'
import { colorSchema } from './store'
const preferredDark = usePreferredDark()
export const isDark = computed({
get() {
return colorSchema.value === 'auto' ? preferredDark.value : colorSchema.value === 'dark'
},
set(v: boolean) {
if (v === preferredDark.value)
colorSchema.value = 'auto'
else
colorSchema.value = v ? 'dark' : 'light'
},
})
export const toggleDark = useToggle(isDark)
watch(
isDark,
v => typeof document !== 'undefined' && document.documentElement.classList.toggle('dark', v),
{ immediate: true },
)
-1
View File
@@ -1 +0,0 @@
export * from './dark'
-4
View File
@@ -1,4 +0,0 @@
import { Ref } from 'vue'
import { useStorage } from '@vueuse/core'
export const colorSchema = useStorage('color-schema', 'auto') as Ref<'auto' | 'dark' | 'light'>
+14 -6
View File
@@ -1,17 +1,25 @@
import './styles/main.postcss'
import type { UserModule } from './types'
import { setupLayouts } from 'virtual:generated-layouts'
import { ViteSSG } from 'vite-ssg'
import generatedRoutes from 'pages-generated'
import { setupLayouts } from 'layouts-generated'
import { routes } from 'vue-router/auto-routes'
import App from './App.vue'
const routes = setupLayouts(generatedRoutes)
import '@unocss/reset/tailwind.css'
import './styles/main.css'
import 'uno.css'
// https://github.com/antfu/vite-ssg
export const createApp = ViteSSG(
App,
{ routes },
{
routes: setupLayouts([...routes]),
base: import.meta.env.BASE_URL,
},
(ctx) => {
// install all modules under `modules/`
Object.values(import.meta.globEager('./modules/*.ts')).map(i => i.install?.(ctx))
Object.values(import.meta.glob<{ install: UserModule }>('./modules/*.ts', { eager: true }))
.forEach(i => i.install?.(ctx))
// ctx.app.use(Previewer)
},
)
+1 -1
View File
@@ -3,7 +3,7 @@
A custom user module system. Place a `.ts` file with the following template, it will be installed automatically.
```ts
import { UserModule } from '~/types'
import type { UserModule } from '~/types'
export const install: UserModule = ({ app, router, isClient }) => {
// do something
+43 -15
View File
@@ -1,22 +1,50 @@
import type { Locale } from 'vue-i18n'
import type { UserModule } from '~/types'
import { createI18n } from 'vue-i18n'
import { UserModule } from '~/types'
// import i18n resources
// Import i18n resources
// https://vitejs.dev/guide/features.html#glob-import
const messages = Object.fromEntries(
Object.entries(
import.meta.globEager('../../locales/*.json'))
.map(([key, value]) => {
return [key.slice(14, -5), value.default]
}),
)
//
// Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite
const i18n = createI18n({
legacy: false,
locale: '',
messages: {},
})
const localesMap = Object.fromEntries(
Object.entries(import.meta.glob('../../locales/*.yml'))
.map(([path, loadLocale]) => [path.match(/([\w-]*)\.yml$/)?.[1], loadLocale]),
) as Record<Locale, () => Promise<{ default: Record<string, string> }>>
export const availableLocales = Object.keys(localesMap)
const loadedLanguages: string[] = []
function setI18nLanguage(lang: Locale) {
i18n.global.locale.value = lang as any
if (typeof document !== 'undefined')
document.querySelector('html')?.setAttribute('lang', lang)
return lang
}
export async function loadLanguageAsync(lang: string): Promise<Locale> {
// If the same language
if (i18n.global.locale.value === lang)
return setI18nLanguage(lang)
// If the language was already loaded
if (loadedLanguages.includes(lang))
return setI18nLanguage(lang)
// If the language hasn't been loaded yet
const messages = await localesMap[lang]()
i18n.global.setLocaleMessage(lang, messages.default)
loadedLanguages.push(lang)
return setI18nLanguage(lang)
}
export const install: UserModule = ({ app }) => {
const i18n = createI18n({
legacy: false,
locale: 'en',
messages,
})
app.use(i18n)
loadLanguageAsync('en')
}
+8 -3
View File
@@ -1,9 +1,14 @@
import type { UserModule } from '~/types'
import NProgress from 'nprogress'
import { UserModule } from '~/types'
export const install: UserModule = ({ isClient, router }) => {
if (isClient) {
router.beforeEach(() => { NProgress.start() })
router.afterEach(() => { NProgress.done() })
router.beforeEach((to, from) => {
if (to.path !== from.path)
NProgress.start()
})
router.afterEach(() => {
NProgress.done()
})
}
}
+17
View File
@@ -0,0 +1,17 @@
import type { UserModule } from '~/types'
import { createPinia } from 'pinia'
// Setup Pinia
// https://pinia.vuejs.org/
export const install: UserModule = ({ isClient, initialState, app }) => {
const pinia = createPinia()
app.use(pinia)
// Refer to
// https://github.com/antfu/vite-ssg/blob/main/README.md#state-serialization
// for other serialization strategies.
if (isClient)
pinia.state.value = (initialState.pinia) || {}
else
initialState.pinia = pinia.state.value
}
+14
View File
@@ -0,0 +1,14 @@
import type { UserModule } from '~/types'
// https://github.com/antfu/vite-plugin-pwa#automatic-reload-when-new-content-available
export const install: UserModule = ({ isClient, router }) => {
if (!isClient)
return
router.isReady()
.then(async () => {
const { registerSW } = await import('virtual:pwa-register')
registerSW({ immediate: true })
})
.catch(() => {})
}
+5 -5
View File
@@ -1,7 +1,7 @@
## File-based Routing
Routes will auto-generated for Vue files in this dir with the same file structure.
Check out [`vite-plugin-pages`](https://github.com/hannoeru/vite-plugin-pages) for more details.
Routes will be auto-generated for Vue files in this dir with the same file structure.
Check out [`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router) for more details.
### Path Aliasing
@@ -10,11 +10,11 @@ Check out [`vite-plugin-pages`](https://github.com/hannoeru/vite-plugin-pages) f
For example, instead of having
```ts
import { isDark } from '../../../../logics'
import { isDark } from '../../../../composables'
```
now you can use
now, you can use
```ts
import { isDark } from '~/logics'
import { isDark } from '~/composables'
```
-2
View File
@@ -1,6 +1,4 @@
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
</script>
+8 -3
View File
@@ -2,13 +2,18 @@
title: About
---
<script setup>
const { t } = useI18n()
useHead({ title: () => t('button.about') })
</script>
<div class="text-center">
<!-- You can use Vue components inside markdown -->
<carbon-dicom-overlay class="text-4xl -mb-6 m-auto" />
<h3>About</h3>
<div i-carbon-dicom-overlay class="text-4xl -mb-6 m-auto" />
<h3>{{ t('button.about') }}</h3>
</div>
[Vitesse](https://github.com/antfu/vitesse) is an opinionated [Vite](https://github.com/vitejs/vite) starter template made by [@antfu](https://github.com/antfu) for mocking apps swiftly. With **file-based routing**, **components auto importing**, **markdown support**, I18n, PWA and uses **Tailwind** v2 for UI.
[Vitesse](https://github.com/antfu/vitesse) is an opinionated [Vite](https://github.com/vitejs/vite) starter template made by [@antfu](https://github.com/antfu) for mocking apps swiftly. With **file-based routing**, **components auto importing**, **markdown support**, I18n, PWA and uses **UnoCSS** for styling and icons.
```js
// syntax highlighting example
+29 -17
View File
@@ -1,34 +1,46 @@
<script setup lang="ts">
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { defineProps } from 'vue'
const props = defineProps({
name: {
type: String,
required: true,
},
})
const router = useRouter()
const route = useRoute('/hi/[name]')
const user = useUserStore()
const { t } = useI18n()
watchEffect(() => {
user.setNewName(route.params.name)
})
useHead({
title: () => t('intro.hi', { name: user.savedName }),
})
</script>
<template>
<div>
<p class="text-4xl">
<carbon-pedestrian class="inline-block" />
</p>
<div text-4xl>
<div i-carbon-pedestrian inline-block />
</div>
<p>
{{ t('intro.hi', { name: props.name }) }}
{{ t('intro.hi', { name: user.savedName }) }}
</p>
<p class="text-sm opacity-50">
<p text-sm opacity-75>
<em>{{ t('intro.dynamic-route') }}</em>
</p>
<template v-if="user.otherNames.length">
<div mt-4 text-sm>
<span opacity-75>{{ t('intro.aka') }}:</span>
<ul>
<li v-for="otherName in user.otherNames" :key="otherName">
<RouterLink :to="`/hi/${otherName}`" replace>
{{ otherName }}
</RouterLink>
</li>
</ul>
</div>
</template>
<div>
<button
class="btn m-3 text-sm mt-8"
m="3 t6" btn text-sm
@click="router.back()"
>
{{ t('button.back') }}
+17 -19
View File
@@ -1,51 +1,49 @@
<script setup lang="ts">
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
const name = ref('')
defineOptions({
name: 'IndexPage',
})
const user = useUserStore()
const name = ref(user.savedName)
const router = useRouter()
const go = () => {
function go() {
if (name.value)
router.push(`/hi/${encodeURIComponent(name.value)}`)
}
const { t } = useI18n()
useHead({
title: () => t('button.home'),
})
</script>
<template>
<div>
<p class="text-4xl">
<carbon-campsite class="inline-block" />
</p>
<div text-4xl>
<div i-carbon-campsite inline-block />
</div>
<p>
<a rel="noreferrer" href="https://github.com/antfu/vitesse" target="_blank">
Vitesse
</a>
</p>
<p>
<em class="text-sm opacity-75">{{ t('intro.desc') }}</em>
<em text-sm opacity-75>{{ t('intro.desc') }}</em>
</p>
<div class="py-4" />
<div py-4 />
<input
id="input"
<TheInput
v-model="name"
:placeholder="t('intro.whats-your-name')"
:aria-label="t('intro.whats-your-name')"
type="text"
autocomplete="false"
class="px-4 py-2 text-sm text-center bg-transparent border border-gray-200 rounded outline-none active:outline-none dark:border-gray-700"
style="width: 250px"
@keydown.enter="go"
>
/>
<label class="hidden" for="input">{{ t('intro.whats-your-name') }}</label>
<div>
<button
class="m-3 text-sm btn"
m-3 btn text-sm
:disabled="!name"
@click="go"
>
+121
View File
@@ -0,0 +1,121 @@
/* eslint-disable */
/* prettier-ignore */
// oxfmt-ignore
// @ts-nocheck
// noinspection ES6UnusedImports
// Generated by vue-router. !! DO NOT MODIFY THIS FILE !!
// It's recommended to commit this file.
// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry.
import type {
RouteRecordInfo,
ParamValue,
ParamValueOneOrMore,
ParamValueZeroOrMore,
ParamValueZeroOrOne,
} from 'vue-router'
declare module 'vue-router' {
interface TypesConfig {
ParamParsers: never
}
}
declare module 'vue-router/auto-routes' {
/**
* Route name map generated by vue-router
*/
export interface RouteNamedMap {
'/': RouteRecordInfo<
'/',
'/',
Record<never, never>,
Record<never, never>,
| never
>,
'/[...all]': RouteRecordInfo<
'/[...all]',
'/:all(.*)',
{ all: ParamValue<true> },
{ all: ParamValue<false> },
| never
>,
'/about': RouteRecordInfo<
'/about',
'/about',
Record<never, never>,
Record<never, never>,
| never
>,
'/hi/[name]': RouteRecordInfo<
'/hi/[name]',
'/hi/:name',
{ name: ParamValue<true> },
{ name: ParamValue<false> },
| never
>,
'/README': RouteRecordInfo<
'/README',
'/README',
Record<never, never>,
Record<never, never>,
| never
>,
}
/**
* Route file to route info map by vue-router.
* Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`.
*
* Each key is a file path relative to the project root with 2 properties:
* - routes: union of route names of the possible routes when in this page (passed to useRoute<...>())
* - views: names of nested views (can be passed to <RouterView name="...">)
*
* @internal
*/
export interface _RouteFileInfoMap {
'src/pages/index.vue': {
routes:
| '/'
views:
| never
}
'src/pages/[...all].vue': {
routes:
| '/[...all]'
views:
| never
}
'src/pages/about.md': {
routes:
| '/about'
views:
| never
}
'src/pages/hi/[name].vue': {
routes:
| '/hi/[name]'
views:
| never
}
'src/pages/README.md': {
routes:
| '/README'
views:
| never
}
}
/**
* Get a union of possible route names in a certain route component file.
* Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`.
*
* @internal
*/
export type _RouteNamesForFilePath<FilePath extends string> =
_RouteFileInfoMap extends Record<FilePath, infer Info>
? Info['routes']
: keyof RouteNamedMap
}
export {}
+11 -5
View File
@@ -1,12 +1,18 @@
/* eslint-disable import/no-duplicates */
declare interface Window {
// extend the window
}
// with vite-plugin-md, markdowns can be treat as Vue components
// with unplugin-vue-markdown, markdown files can be treated as Vue components
declare module '*.md' {
import { ComponentOptions } from 'vue'
const component: ComponentOptions
import type { DefineComponent } from 'vue'
const component: DefineComponent<object, object, any>
export default component
}
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<object, object, any>
export default component
}
+34
View File
@@ -0,0 +1,34 @@
import { acceptHMRUpdate, defineStore } from 'pinia'
export const useUserStore = defineStore('user', () => {
/**
* Current name of the user.
*/
const savedName = ref('')
const previousNames = ref(new Set<string>())
const usedNames = computed(() => Array.from(previousNames.value))
const otherNames = computed(() => usedNames.value.filter(name => name !== savedName.value))
/**
* Changes the current name of the user and saves the one that was used
* before.
*
* @param name - new name to set
*/
function setNewName(name: string) {
if (savedName.value)
previousNames.value.add(savedName.value)
savedName.value = name
}
return {
setNewName,
otherNames,
savedName,
}
})
if (import.meta.hot)
import.meta.hot.accept(acceptHMRUpdate(useUserStore as any, import.meta.hot))
+29
View File
@@ -0,0 +1,29 @@
@import './markdown.css';
html,
body,
#app {
height: 100%;
margin: 0;
padding: 0;
}
html.dark {
background: #121212;
color-scheme: dark;
}
#nprogress {
pointer-events: none;
}
#nprogress .bar {
background: rgb(13, 148, 136);
opacity: 0.75;
position: fixed;
z-index: 1031;
top: 0;
left: 0;
width: 100%;
height: 2px;
}
-46
View File
@@ -1,46 +0,0 @@
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
@import './markdown.postcss';
html,
body,
#app {
height: 100vh;
margin: 0;
padding: 0;
}
html.dark {
background: #222;
}
#nprogress {
pointer-events: none;
.bar {
@apply bg-teal-600 opacity-75;
position: fixed;
z-index: 1031;
top: 0;
left: 0;
width: 100%;
height: 2px;
}
}
.btn {
@apply px-4 py-1 rounded inline-block
bg-teal-600 text-white cursor-pointer
hover:bg-teal-700
disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50;
}
.icon-btn {
@apply inline-block cursor-pointer select-none
opacity-75 transition duration-200 ease-in-out
hover:opacity-100 hover:text-teal-600;
font-size: 0.9em;
}
+25
View File
@@ -0,0 +1,25 @@
.prose pre:not(.shiki) {
padding: 0;
}
.prose .shiki {
font-family: 'DM Mono', monospace;
font-size: 1.2em;
line-height: 1.4;
}
.prose img {
width: 100%;
}
.shiki,
.shiki span {
color: var(--shiki-light);
background: var(--shiki-light-bg);
}
html.dark .shiki,
html.dark .shiki span {
color: var(--shiki-dark);
background: var(--shiki-dark-bg);
}
-55
View File
@@ -1,55 +0,0 @@
/* https://github.com/antfu/prism-theme-vars */
@import 'prism-theme-vars/base.css';
:root {
--prism-font-family: 'Input Mono', monospace;
}
html:not(.dark) {
--prism-foreground: #393a34;
--prism-background: #fbfbfb;
--prism-comment: #8e8f8e;
--prism-string: #a1644c;
--prism-literal: #3a9c9b;
--prism-keyword: #248358;
--prism-function: #7e8a42;
--prism-deleted: #a14f55;
--prism-class: #2b91af;
--prism-builtin: #a52727;
--prism-property: #ad502b;
--prism-namespace: #c96880;
--prism-punctuation: #8e8f8b;
--prism-decorator: #bd8f8f;
--prism-json-property: #698c96;
}
html.dark {
--prism-scheme: dark;
--prism-foreground: #d4cfbf;
--prism-background: #1e1e1e;
--prism-comment: #758575;
--prism-string: #ce9178;
--prism-literal: #4fb09d;
--prism-keyword: #4d9375;
--prism-function: #c2c275;
--prism-deleted: #a14f55;
--prism-class: #5ebaa8;
--prism-builtin: #cb7676;
--prism-property: #dd8e6e;
--prism-namespace: #c96880;
--prism-punctuation: #d4d4d4;
--prism-decorator: #bd8f8f;
--prism-regex: #ab5e3f;
--prism-json-property: #6b8b9e;
--prism-line-number: #888888;
--prism-line-number-gutter: #eeeeee;
--prism-line-highlight-background: #444444;
--prism-selection-background: #444444;
}
/* fix tailwind typography in darkmode */
.prose {
a code {
color: inherit;
}
}
+1 -1
View File
@@ -1,3 +1,3 @@
import { ViteSSGContext } from 'vite-ssg'
import type { ViteSSGContext } from 'vite-ssg'
export type UserModule = (ctx: ViteSSGContext) => void
-60
View File
@@ -1,60 +0,0 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const colors = require('tailwindcss/colors')
const typography = require('@tailwindcss/typography')
module.exports = {
purge: {
enabled: process.env.NODE_ENV === 'production',
content: [
'./index.html',
'./src/**/*.vue',
'./src/**/*.md',
'./src/**/*.js',
'./src/**/*.ts',
],
options: {
safelist: ['prose', 'prose-sm', 'm-auto'],
},
},
variants: {
extend: {
cursor: ['disabled'],
backgroundColor: ['disabled'],
borderColor: ['active', 'disabled'],
textColor: ['active', 'disabled'],
opacity: ['dark', 'active', 'disabled'],
}
},
darkMode: 'class',
plugins: [typography],
theme: {
extend: {
colors: {
teal: colors.teal,
},
typography: {
DEFAULT: {
css: {
color: 'inherit',
a: {
color: 'inherit',
opacity: 0.75,
'&:hover': {
opacity: 1,
color: colors.teal[600],
},
},
b: { color: 'inherit' },
strong: { color: 'inherit' },
em: { color: 'inherit' },
h1: { color: 'inherit' },
h2: { color: 'inherit' },
h3: { color: 'inherit' },
h4: { color: 'inherit' },
code: { color: 'inherit' },
},
},
},
},
},
}
@@ -0,0 +1,3 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`component TheCounter.vue > should render 1`] = `"<div>10 <button class="inc"> + </button><button class="dec"> - </button></div>"`;
+7
View File
@@ -0,0 +1,7 @@
import { describe, expect, it } from 'vitest'
describe('tests', () => {
it('should works', () => {
expect(1 + 1).toEqual(2)
})
})
+28
View File
@@ -0,0 +1,28 @@
import { mount } from '@vue/test-utils'
import { describe, expect, it } from 'vitest'
import TheCounter from '../src/components/TheCounter.vue'
describe('component TheCounter.vue', () => {
it('should render', () => {
const wrapper = mount(TheCounter, { props: { initial: 10 } })
expect(wrapper.text()).toContain('10')
expect(wrapper.html()).toMatchSnapshot()
})
it('should be interactive', async () => {
const wrapper = mount(TheCounter, { props: { initial: 0 } })
expect(wrapper.text()).toContain('0')
expect(wrapper.find('.inc').exists()).toBe(true)
expect(wrapper.find('.dec').exists()).toBe(true)
await wrapper.get('.inc').trigger('click')
expect(wrapper.text()).toContain('1')
await wrapper.get('.dec').trigger('click')
expect(wrapper.text()).toContain('0')
})
})
+29 -18
View File
@@ -1,26 +1,37 @@
{
"compilerOptions": {
"target": "ESNext",
"jsx": "preserve",
"lib": ["DOM", "ESNext"],
"baseUrl": ".",
"module": "ESNext",
"target": "es2016",
"lib": ["DOM", "ESNext"],
"strict": true,
"esModuleInterop": true,
"incremental": true,
"skipLibCheck": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"noUnusedLocals": true,
"strictNullChecks": true,
"forceConsistentCasingInFileNames": true,
"types": [
"vite/client",
"vite-plugin-pages/client",
"vite-plugin-vue-layouts/client"
],
"moduleResolution": "Bundler",
"paths": {
"~/*": ["src/*"]
}
},
"resolveJsonModule": true,
"types": [
"vitest",
"vite/client",
"vite-plugin-vue-layouts/client",
"vite-plugin-pwa/client",
"unplugin-vue-macros/macros-global"
],
"allowJs": true,
"strict": true,
"strictNullChecks": true,
"noUnusedLocals": true,
"noEmit": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
"skipLibCheck": true
},
"exclude": ["dist", "node_modules"]
"vueCompilerOptions": {
"plugins": [
"@vue-macros/volar/define-models",
"@vue-macros/volar/define-slots"
]
},
"exclude": ["dist", "node_modules", "cypress"]
}
+41
View File
@@ -0,0 +1,41 @@
import {
createLocalFontProcessor,
} from '@unocss/preset-web-fonts/local'
import {
defineConfig,
presetAttributify,
presetIcons,
presetTypography,
presetUno,
presetWebFonts,
transformerDirectives,
transformerVariantGroup,
} from 'unocss'
export default defineConfig({
shortcuts: [
['btn', 'px-4 py-1 rounded inline-block bg-teal-700 text-white cursor-pointer !outline-none hover:bg-teal-800 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50'],
['icon-btn', 'inline-block cursor-pointer select-none opacity-75 transition duration-200 ease-in-out hover:opacity-100 hover:text-teal-600'],
],
presets: [
presetUno(),
presetAttributify(),
presetIcons({
scale: 1.2,
}),
presetTypography(),
presetWebFonts({
fonts: {
sans: 'DM Sans',
serif: 'DM Serif Display',
mono: 'DM Mono',
},
processors: createLocalFontProcessor(),
}),
],
transformers: [
transformerDirectives(),
transformerVariantGroup(),
],
safelist: 'prose prose-sm m-auto text-left'.split(' '),
})
+105 -50
View File
@@ -1,14 +1,22 @@
import path from 'path'
import { defineConfig } from 'vite'
import path from 'node:path'
import VueI18n from '@intlify/unplugin-vue-i18n/vite'
import Shiki from '@shikijs/markdown-it'
import { unheadVueComposablesImports } from '@unhead/vue'
import Vue from '@vitejs/plugin-vue'
import Pages from 'vite-plugin-pages'
import Layouts from 'vite-plugin-vue-layouts'
import ViteIcons, { ViteIconsResolver } from 'vite-plugin-icons'
import ViteComponents from 'vite-plugin-components'
import Markdown from 'vite-plugin-md'
import LinkAttributes from 'markdown-it-link-attributes'
import Unocss from 'unocss/vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import VueMacros from 'unplugin-vue-macros/vite'
import Markdown from 'unplugin-vue-markdown/vite'
import { defineConfig } from 'vite'
import { VitePWA } from 'vite-plugin-pwa'
import VueI18n from '@intlify/vite-plugin-vue-i18n'
import Prism from 'markdown-it-prism'
import VueDevTools from 'vite-plugin-vue-devtools'
import Layouts from 'vite-plugin-vue-layouts'
import generateSitemap from 'vite-ssg-sitemap'
import { VueRouterAutoImports } from 'vue-router/unplugin'
import VueRouter from 'vue-router/vite'
import 'vitest/config'
export default defineConfig({
resolve: {
@@ -16,53 +24,87 @@ export default defineConfig({
'~/': `${path.resolve(__dirname, 'src')}/`,
},
},
plugins: [
Vue({
include: [/\.vue$/, /\.md$/],
// https://github.com/vuejs/router
VueRouter({
extensions: ['.vue', '.md'],
dts: 'src/route-map.d.ts',
}),
// https://github.com/hannoeru/vite-plugin-pages
Pages({
extensions: ['vue', 'md'],
VueMacros({
plugins: {
vue: Vue({
include: [/\.vue$/, /\.md$/],
}),
},
}),
// https://github.com/JohnCampionJr/vite-plugin-vue-layouts
Layouts(),
// https://github.com/antfu/vite-plugin-md
// https://github.com/antfu/unplugin-auto-import
AutoImport({
include: [/\.[jt]sx?$/, /\.vue$/, /\.vue\?vue/, /\.md$/],
imports: [
'vue',
'vue-i18n',
'@vueuse/core',
unheadVueComposablesImports,
VueRouterAutoImports,
{
// add any other imports you were relying on
'vue-router/auto': ['useLink'],
},
],
dts: 'src/auto-imports.d.ts',
dirs: [
'src/composables',
'src/stores',
],
vueTemplate: true,
}),
// https://github.com/antfu/unplugin-vue-components
Components({
// allow auto load markdown components under `./src/components/`
extensions: ['vue', 'md'],
// allow auto import and register components used in markdown
include: [/\.vue$/, /\.vue\?vue/, /\.md$/],
dts: 'src/components.d.ts',
}),
// https://github.com/antfu/unocss
// see uno.config.ts for config
Unocss(),
// https://github.com/unplugin/unplugin-vue-markdown
// Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite
Markdown({
wrapperClasses: 'prose prose-sm m-auto text-left',
headEnabled: true,
markdownItSetup(md) {
// https://prismjs.com/
md.use(Prism)
async markdownItSetup(md) {
md.use(LinkAttributes, {
matcher: (link: string) => /^https?:\/\//.test(link),
attrs: {
target: '_blank',
rel: 'noopener',
},
})
md.use(await Shiki({
defaultColor: false,
themes: {
light: 'vitesse-light',
dark: 'vitesse-dark',
},
}))
},
}),
// https://github.com/antfu/vite-plugin-components
ViteComponents({
// allow auto load markdown components under `./src/components/`
extensions: ['vue', 'md'],
// allow auto import and register components used in markdown
customLoaderMatcher: id => id.endsWith('.md'),
// auto import icons
customComponentResolvers: [
// https://github.com/antfu/vite-plugin-icons
ViteIconsResolver({
componentPrefix: '',
// enabledCollections: ['carbon']
}),
],
}),
// https://github.com/antfu/vite-plugin-icons
ViteIcons(),
// https://github.com/antfu/vite-plugin-pwa
VitePWA({
inlineRegister: false,
registerType: 'autoUpdate',
includeAssets: ['favicon.svg', 'safari-pinned-tab.svg'],
manifest: {
name: 'Vitesse',
short_name: 'Vitesse',
@@ -88,25 +130,38 @@ export default defineConfig({
},
}),
// https://github.com/intlify/vite-plugin-vue-i18n
// https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n
VueI18n({
runtimeOnly: true,
compositionOnly: true,
fullInstall: true,
include: [path.resolve(__dirname, 'locales/**')],
}),
// https://github.com/webfansplz/vite-plugin-vue-devtools
VueDevTools(),
],
// https://github.com/vitest-dev/vitest
test: {
include: ['test/**/*.test.ts'],
environment: 'jsdom',
},
// https://github.com/antfu/vite-ssg
ssgOptions: {
script: 'async',
formatting: 'minify',
beastiesOptions: {
reduceInlineStyles: false,
},
onFinished() {
generateSitemap()
},
},
optimizeDeps: {
include: [
'vue',
'vue-router',
'@vueuse/core',
],
exclude: [
'vue-demi',
],
ssr: {
// TODO: workaround until they support native ESM
noExternal: ['workbox-window', /vue-i18n/],
},
})