create-bubbles 0.1.19 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/dist/{index.js → index.mjs} +9 -7
  2. package/package.json +7 -5
  3. package/template-nextjs-vinext-eslint/.dockerignore +3 -0
  4. package/template-nextjs-vinext-eslint/.vscode/settings.json +53 -0
  5. package/template-nextjs-vinext-eslint/Dockerfile +21 -0
  6. package/template-nextjs-vinext-eslint/README.md +100 -0
  7. package/template-nextjs-vinext-eslint/commitlint.config.js +1 -0
  8. package/template-nextjs-vinext-eslint/docker-compose.yaml +22 -0
  9. package/template-nextjs-vinext-eslint/eslint.config.js +20 -0
  10. package/template-nextjs-vinext-eslint/lefthook.yml +11 -0
  11. package/template-nextjs-vinext-eslint/next.config.ts +8 -0
  12. package/template-nextjs-vinext-eslint/nginx.conf +14 -0
  13. package/template-nextjs-vinext-eslint/package.json +50 -0
  14. package/template-nextjs-vinext-eslint/pnpm-workspace.yaml +7 -0
  15. package/template-nextjs-vinext-eslint/public/file.svg +1 -0
  16. package/template-nextjs-vinext-eslint/public/globe.svg +1 -0
  17. package/template-nextjs-vinext-eslint/public/logo-white.svg +128 -0
  18. package/template-nextjs-vinext-eslint/public/next.svg +1 -0
  19. package/template-nextjs-vinext-eslint/public/vercel.svg +1 -0
  20. package/template-nextjs-vinext-eslint/public/window.svg +1 -0
  21. package/template-nextjs-vinext-eslint/src/app/_components/Header/header.module.css +0 -0
  22. package/template-nextjs-vinext-eslint/src/app/_components/Header/header.tsx +7 -0
  23. package/template-nextjs-vinext-eslint/src/app/_components/Main/index.tsx +13 -0
  24. package/template-nextjs-vinext-eslint/src/app/antd-provider.tsx +30 -0
  25. package/template-nextjs-vinext-eslint/src/app/icon.svg +26 -0
  26. package/template-nextjs-vinext-eslint/src/app/layout.tsx +68 -0
  27. package/template-nextjs-vinext-eslint/src/app/page.module.css +141 -0
  28. package/template-nextjs-vinext-eslint/src/app/page.tsx +43 -0
  29. package/template-nextjs-vinext-eslint/src/app/uno-css.tsx +7 -0
  30. package/template-nextjs-vinext-eslint/src/assets/icon/logo-white.svg +128 -0
  31. package/template-nextjs-vinext-eslint/src/assets/icon/logo.svg +26 -0
  32. package/template-nextjs-vinext-eslint/src/assets/image/QR.png +0 -0
  33. package/template-nextjs-vinext-eslint/src/assets/image/banner_1.png +0 -0
  34. package/template-nextjs-vinext-eslint/src/assets/image/banner_2.png +0 -0
  35. package/template-nextjs-vinext-eslint/src/assets/image/banner_3.png +0 -0
  36. package/template-nextjs-vinext-eslint/src/assets/image/banner_4.png +0 -0
  37. package/template-nextjs-vinext-eslint/src/assets/image/banner_top.png +0 -0
  38. package/template-nextjs-vinext-eslint/src/assets/image/icon_title_left.png +0 -0
  39. package/template-nextjs-vinext-eslint/src/assets/image/icon_title_right.png +0 -0
  40. package/template-nextjs-vinext-eslint/src/assets/image/img.png +0 -0
  41. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_COCT.png +0 -0
  42. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/207/347/247/221.png +0 -0
  43. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/205/264.png +0 -0
  44. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/206/266/345/273/272/345/267/245.png +0 -0
  45. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/233/275/344/270/255/351/223/201.png +0 -0
  46. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/233/275/344/272/224/345/206/266.png +0 -0
  47. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/233/275/344/272/244/351/200/232/345/273/272/350/256/276.png +0 -0
  48. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/233/275/345/273/272/344/270/232.png +0 -0
  49. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/233/275/345/273/272/347/255/221/347/247/221/345/255/246/351/231/242.png +0 -0
  50. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/233/275/347/224/265/345/273/272.png +0 -0
  51. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/344/270/255/345/233/275/351/223/201/345/273/272.png +0 -0
  52. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/345/256/234/351/200/232/344/270/226/347/272/252.png +0 -0
  53. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/346/225/260/347/273/264/347/251/272/351/227/264.png +0 -0
  54. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/346/226/260/346/230/212/350/276/260/345/273/272/350/256/276.png +0 -0
  55. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/346/236/227/345/220/214/346/243/252/345/233/275/351/231/205.png +0 -0
  56. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/346/270/235/351/232/206/351/233/206/345/233/242.png +0 -0
  57. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/347/273/264/345/241/224/347/247/221/346/212/200.png +0 -0
  58. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/350/205/276/350/256/257.png +0 -0
  59. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/350/265/233/350/277/252/344/277/241/346/201/257.png +0 -0
  60. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/207/215/345/272/206/344/272/244/351/200/232/345/244/247/345/255/246.png +0 -0
  61. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/207/215/345/272/206/344/272/244/351/200/232/350/201/214/344/270/232/345/255/246/351/231/242.png +0 -0
  62. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/207/215/345/272/206/345/244/247/345/255/246.png +0 -0
  63. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/207/215/345/272/206/345/267/245/345/225/206/350/201/214/344/270/232/345/255/246/351/231/242.png +0 -0
  64. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/207/215/345/272/206/345/267/245/347/250/213/350/201/214/344/270/232/346/212/200/346/234/257/345/255/246/351/231/242.png +0 -0
  65. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/207/215/345/272/206/345/273/272/345/267/245.png +0 -0
  66. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/230/277/351/207/214/344/272/221.png +0 -0
  67. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/231/206/345/206/233/345/206/233/345/214/273/345/244/247/345/255/246.png +0 -0
  68. package/template-nextjs-vinext-eslint/src/assets/image/parteners/logo_/351/276/231/346/271/226.png +0 -0
  69. package/template-nextjs-vinext-eslint/src/styles/globals.css +47 -0
  70. package/template-nextjs-vinext-eslint/src/types/vite-env.d.ts +18 -0
  71. package/template-nextjs-vinext-eslint/src/utils/env.ts +14 -0
  72. package/template-nextjs-vinext-eslint/src/utils/index.ts +0 -0
  73. package/template-nextjs-vinext-eslint/src/utils/request/core/index.ts +425 -0
  74. package/template-nextjs-vinext-eslint/src/utils/request/core/utils.ts +39 -0
  75. package/template-nextjs-vinext-eslint/src/utils/request/index.ts +48 -0
  76. package/template-nextjs-vinext-eslint/tsconfig.json +34 -0
  77. package/template-nextjs-vinext-eslint/uno.config.ts +8 -0
  78. package/template-nextjs-vinext-eslint/vite.config.ts +8 -0
  79. package/template-react-rsbuild-biome/.env +5 -0
  80. package/template-react-rsbuild-biome/.env.development +1 -0
  81. package/template-react-rsbuild-biome/.env.production +1 -0
  82. package/template-react-rsbuild-biome/.prettierignore +34 -0
  83. package/template-react-rsbuild-biome/.prettierrc +16 -0
  84. package/template-react-rsbuild-biome/.vscode/settings.json +10 -0
  85. package/template-react-rsbuild-biome/README.md +29 -0
  86. package/template-react-rsbuild-biome/biome.json +116 -0
  87. package/template-react-rsbuild-biome/commitlint.config.js +1 -0
  88. package/template-react-rsbuild-biome/index.html +7 -0
  89. package/template-react-rsbuild-biome/lefthook.yml +14 -0
  90. package/template-react-rsbuild-biome/package.json +42 -0
  91. package/template-react-rsbuild-biome/public/.gitkeep +0 -0
  92. package/template-react-rsbuild-biome/rsbuild.config.ts +44 -0
  93. package/template-react-rsbuild-biome/src/App.tsx +9 -0
  94. package/template-react-rsbuild-biome/src/assets/font/AlimamaShuHeiTi-Bold.ttf +0 -0
  95. package/template-react-rsbuild-biome/src/assets/icon/logo.svg +7 -0
  96. package/template-react-rsbuild-biome/src/components/Loading/PageLoading.tsx +11 -0
  97. package/template-react-rsbuild-biome/src/env.d.ts +1 -0
  98. package/template-react-rsbuild-biome/src/index.tsx +18 -0
  99. package/template-react-rsbuild-biome/src/layout/default/index.tsx +10 -0
  100. package/template-react-rsbuild-biome/src/pages/home/index.tsx +5 -0
  101. package/template-react-rsbuild-biome/src/router/index.tsx +38 -0
  102. package/template-react-rsbuild-biome/src/store/index.ts +0 -0
  103. package/template-react-rsbuild-biome/src/store/modules/user.ts +11 -0
  104. package/template-react-rsbuild-biome/src/styles/fonts.scss +4 -0
  105. package/template-react-rsbuild-biome/src/styles/index.scss +19 -0
  106. package/template-react-rsbuild-biome/src/styles/variables.scss +4 -0
  107. package/template-react-rsbuild-biome/src/types/auto-import.d.ts +49 -0
  108. package/template-react-rsbuild-biome/src/utils/env.ts +10 -0
  109. package/template-react-rsbuild-biome/src/utils/request/core/index.ts +425 -0
  110. package/template-react-rsbuild-biome/src/utils/request/core/utils.ts +39 -0
  111. package/template-react-rsbuild-biome/src/utils/request/index.ts +42 -0
  112. package/template-react-rsbuild-biome/tsconfig.json +35 -0
  113. package/template-react-rsbuild-biome/uno.config.ts +8 -0
  114. package/template-taro-react-oxc/.editorconfig +12 -0
  115. package/template-taro-react-oxc/.env +1 -0
  116. package/template-taro-react-oxc/.env.development +6 -0
  117. package/template-taro-react-oxc/.env.production +5 -0
  118. package/template-taro-react-oxc/.oxfmtrc.json +12 -0
  119. package/template-taro-react-oxc/.oxlintrc.json +9 -0
  120. package/template-taro-react-oxc/.vscode/settings.json +13 -0
  121. package/template-taro-react-oxc/babel.config.js +45 -0
  122. package/template-taro-react-oxc/commitlint.config.mjs +1 -0
  123. package/template-taro-react-oxc/config/dev.ts +10 -0
  124. package/template-taro-react-oxc/config/index.ts +172 -0
  125. package/template-taro-react-oxc/config/prod.ts +39 -0
  126. package/template-taro-react-oxc/config/release.ts +106 -0
  127. package/template-taro-react-oxc/key/.gitkeep +0 -0
  128. package/template-taro-react-oxc/lefthook.yaml +18 -0
  129. package/template-taro-react-oxc/package.json +118 -0
  130. package/template-taro-react-oxc/patches/@tarojs__plugin-mini-ci.patch +13 -0
  131. package/template-taro-react-oxc/pnpm-workspace.yaml +13 -0
  132. package/template-taro-react-oxc/postcss.config.js +6 -0
  133. package/template-taro-react-oxc/project.config.json +15 -0
  134. package/template-taro-react-oxc/src/app.config.ts +11 -0
  135. package/template-taro-react-oxc/src/app.ts +14 -0
  136. package/template-taro-react-oxc/src/index.html +17 -0
  137. package/template-taro-react-oxc/src/pages/index/index.config.ts +3 -0
  138. package/template-taro-react-oxc/src/pages/index/index.scss +0 -0
  139. package/template-taro-react-oxc/src/pages/index/index.tsx +44 -0
  140. package/template-taro-react-oxc/src/store/taroStorage.ts +7 -0
  141. package/template-taro-react-oxc/src/store/user.ts +13 -0
  142. package/template-taro-react-oxc/src/styles/index.css +1 -0
  143. package/template-taro-react-oxc/src/utils/env.ts +10 -0
  144. package/template-taro-react-oxc/src/utils/request/core/index.ts +425 -0
  145. package/template-taro-react-oxc/src/utils/request/core/utils.ts +39 -0
  146. package/template-taro-react-oxc/src/utils/request/index.ts +37 -0
  147. package/template-taro-react-oxc/stylelint.config.mjs +28 -0
  148. package/template-taro-react-oxc/tailwind.config.js +12 -0
  149. package/template-taro-react-oxc/tsconfig.json +28 -0
  150. package/template-taro-react-oxc/types/global.d.ts +29 -0
  151. package/template-taro-vue-eslint/.editorconfig +12 -0
  152. package/template-taro-vue-eslint/.env +3 -0
  153. package/template-taro-vue-eslint/.env.development +5 -0
  154. package/template-taro-vue-eslint/.env.production +5 -0
  155. package/template-taro-vue-eslint/.vscode/settings.json +57 -0
  156. package/template-taro-vue-eslint/babel.config.js +12 -0
  157. package/template-taro-vue-eslint/commitlint.config.mjs +1 -0
  158. package/template-taro-vue-eslint/config/dev.ts +27 -0
  159. package/template-taro-vue-eslint/config/index.ts +134 -0
  160. package/template-taro-vue-eslint/config/output-root.ts +11 -0
  161. package/template-taro-vue-eslint/config/prod.ts +39 -0
  162. package/template-taro-vue-eslint/config/release.ts +113 -0
  163. package/template-taro-vue-eslint/eslint.config.mjs +22 -0
  164. package/template-taro-vue-eslint/lefthook.yaml +13 -0
  165. package/template-taro-vue-eslint/package.json +115 -0
  166. package/template-taro-vue-eslint/patches/@tarojs__plugin-mini-ci.patch +13 -0
  167. package/template-taro-vue-eslint/pnpm-workspace.yaml +13 -0
  168. package/template-taro-vue-eslint/project.config.json +16 -0
  169. package/template-taro-vue-eslint/src/api/common/upload.ts +53 -0
  170. package/template-taro-vue-eslint/src/app.config.ts +19 -0
  171. package/template-taro-vue-eslint/src/app.ts +14 -0
  172. package/template-taro-vue-eslint/src/assets/image/.gitkeep +0 -0
  173. package/template-taro-vue-eslint/src/index.html +17 -0
  174. package/template-taro-vue-eslint/src/pages/example/upload/index.config.ts +3 -0
  175. package/template-taro-vue-eslint/src/pages/example/upload/index.module.scss +4 -0
  176. package/template-taro-vue-eslint/src/pages/example/upload/index.vue +71 -0
  177. package/template-taro-vue-eslint/src/pages/index/index.config.ts +3 -0
  178. package/template-taro-vue-eslint/src/pages/index/index.module.scss +4 -0
  179. package/template-taro-vue-eslint/src/pages/index/index.vue +77 -0
  180. package/template-taro-vue-eslint/src/store/index.ts +10 -0
  181. package/template-taro-vue-eslint/src/store/modules/user.ts +15 -0
  182. package/template-taro-vue-eslint/src/store/taroStorage.ts +7 -0
  183. package/template-taro-vue-eslint/src/styles/index.css +1 -0
  184. package/template-taro-vue-eslint/src/styles/nut-theme.css +4 -0
  185. package/template-taro-vue-eslint/src/utils/env.ts +13 -0
  186. package/template-taro-vue-eslint/src/utils/index.ts +40 -0
  187. package/template-taro-vue-eslint/src/utils/request/core/index.ts +425 -0
  188. package/template-taro-vue-eslint/src/utils/request/core/utils.ts +39 -0
  189. package/template-taro-vue-eslint/src/utils/request/index.ts +73 -0
  190. package/template-taro-vue-eslint/tsconfig.json +30 -0
  191. package/template-taro-vue-eslint/types/components.d.ts +16 -0
  192. package/template-taro-vue-eslint/types/global.d.ts +31 -0
  193. package/template-taro-vue-eslint/types/vue.d.ts +10 -0
  194. package/template-taro-vue-eslint/unocss.config.ts +42 -0
  195. package/template-vp-monorepo-react-nestjs/.agents/auth.config.ts +0 -0
  196. package/template-vp-monorepo-react-nestjs/.spaces/server//347/231/273/345/275/225/JWT/344/270/216RefreshToken/350/275/256/346/215/242/351/211/264/346/235/203/346/236/266/346/236/204/345/256/236/347/216/260/346/214/207/345/215/227.md +6614 -0
  197. package/template-vp-monorepo-react-nestjs/.vite-hooks/commit-msg +2 -0
  198. package/template-vp-monorepo-react-nestjs/.vite-hooks/pre-commit +2 -0
  199. package/template-vp-monorepo-react-nestjs/.vscode/settings.json +25 -0
  200. package/template-vp-monorepo-react-nestjs/AGENTS.md +16 -0
  201. package/template-vp-monorepo-react-nestjs/README.md +29 -0
  202. package/template-vp-monorepo-react-nestjs/apps/server/.env.development +61 -0
  203. package/template-vp-monorepo-react-nestjs/apps/server/.env.production +20 -0
  204. package/template-vp-monorepo-react-nestjs/apps/server/README.md +3 -0
  205. package/template-vp-monorepo-react-nestjs/apps/server/drizzle.config.ts +15 -0
  206. package/template-vp-monorepo-react-nestjs/apps/server/nest-cli.json +8 -0
  207. package/template-vp-monorepo-react-nestjs/apps/server/package.json +57 -0
  208. package/template-vp-monorepo-react-nestjs/apps/server/src/app.controller.ts +12 -0
  209. package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +58 -0
  210. package/template-vp-monorepo-react-nestjs/apps/server/src/app.service.ts +8 -0
  211. package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/decorator.ts +2 -0
  212. package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/response.ts +15 -0
  213. package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/bypass.ts +12 -0
  214. package/template-vp-monorepo-react-nestjs/apps/server/src/common/interceptors/transform.ts +34 -0
  215. package/template-vp-monorepo-react-nestjs/apps/server/src/common/model/response.ts +23 -0
  216. package/template-vp-monorepo-react-nestjs/apps/server/src/config/app.config.ts +6 -0
  217. package/template-vp-monorepo-react-nestjs/apps/server/src/config/auth.config.ts +64 -0
  218. package/template-vp-monorepo-react-nestjs/apps/server/src/config/database.config.ts +10 -0
  219. package/template-vp-monorepo-react-nestjs/apps/server/src/config/index.ts +5 -0
  220. package/template-vp-monorepo-react-nestjs/apps/server/src/config/llm.config.ts +7 -0
  221. package/template-vp-monorepo-react-nestjs/apps/server/src/config/redis.config.ts +18 -0
  222. package/template-vp-monorepo-react-nestjs/apps/server/src/config/security.config.ts +0 -0
  223. package/template-vp-monorepo-react-nestjs/apps/server/src/database/db.module.ts +32 -0
  224. package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +14 -0
  225. package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +34 -0
  226. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.controller.ts +28 -0
  227. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.module.ts +9 -0
  228. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.service.ts +22 -0
  229. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/dto/create-user.dto.ts +27 -0
  230. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/dto/redis-quary.dto.ts +18 -0
  231. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.controller.ts +31 -0
  232. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.module.ts +9 -0
  233. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.service.ts +37 -0
  234. package/template-vp-monorepo-react-nestjs/apps/server/src/utils/server-address.ts +33 -0
  235. package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.build.json +4 -0
  236. package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.json +28 -0
  237. package/template-vp-monorepo-react-nestjs/apps/web/.env +2 -0
  238. package/template-vp-monorepo-react-nestjs/apps/web/.env.dev +1 -0
  239. package/template-vp-monorepo-react-nestjs/apps/web/.env.prod +1 -0
  240. package/template-vp-monorepo-react-nestjs/apps/web/index.html +13 -0
  241. package/template-vp-monorepo-react-nestjs/apps/web/package.json +35 -0
  242. package/template-vp-monorepo-react-nestjs/apps/web/public/favicon.svg +1 -0
  243. package/template-vp-monorepo-react-nestjs/apps/web/public/icons.svg +24 -0
  244. package/template-vp-monorepo-react-nestjs/apps/web/src/App.tsx +25 -0
  245. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/hero.png +0 -0
  246. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/react.svg +1 -0
  247. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/vite.svg +1 -0
  248. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.tsx +11 -0
  249. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/en_US.json +4 -0
  250. package/template-vp-monorepo-react-nestjs/apps/web/src/locales/zh_CN.json +4 -0
  251. package/template-vp-monorepo-react-nestjs/apps/web/src/main.tsx +5 -0
  252. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.tsx +47 -0
  253. package/template-vp-monorepo-react-nestjs/apps/web/src/router/index.tsx +25 -0
  254. package/template-vp-monorepo-react-nestjs/apps/web/src/router/modules/.gitkeep +0 -0
  255. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/index.css +7 -0
  256. package/template-vp-monorepo-react-nestjs/apps/web/src/types/auto-imports.d.ts +58 -0
  257. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/env/index.ts +6 -0
  258. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/index.ts +420 -0
  259. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/utils.ts +39 -0
  260. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/index.ts +61 -0
  261. package/template-vp-monorepo-react-nestjs/apps/web/tsconfig.json +28 -0
  262. package/template-vp-monorepo-react-nestjs/apps/web/vite.config.ts +45 -0
  263. package/template-vp-monorepo-react-nestjs/apps/web-vue/.env +6 -0
  264. package/template-vp-monorepo-react-nestjs/apps/web-vue/.env.development +2 -0
  265. package/template-vp-monorepo-react-nestjs/apps/web-vue/.env.production +2 -0
  266. package/template-vp-monorepo-react-nestjs/apps/web-vue/.vscode/extensions.json +3 -0
  267. package/template-vp-monorepo-react-nestjs/apps/web-vue/AGENTS.md +16 -0
  268. package/template-vp-monorepo-react-nestjs/apps/web-vue/README.md +98 -0
  269. package/template-vp-monorepo-react-nestjs/apps/web-vue/commitlint.config.js +1 -0
  270. package/template-vp-monorepo-react-nestjs/apps/web-vue/eslint.config.js +13 -0
  271. package/template-vp-monorepo-react-nestjs/apps/web-vue/index.html +13 -0
  272. package/template-vp-monorepo-react-nestjs/apps/web-vue/lefthook.yml +11 -0
  273. package/template-vp-monorepo-react-nestjs/apps/web-vue/package.json +67 -0
  274. package/template-vp-monorepo-react-nestjs/apps/web-vue/pnpm-workspace.yaml +16 -0
  275. package/template-vp-monorepo-react-nestjs/apps/web-vue/public/vite.svg +1 -0
  276. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/App.vue +12 -0
  277. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/api/index.ts +12 -0
  278. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/icon/computer-data.svg +3 -0
  279. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/icon/cpu.svg +3 -0
  280. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/icon/data-search.svg +3 -0
  281. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/icon/home.svg +3 -0
  282. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/icon/knowledge-graph.svg +3 -0
  283. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/icon/logo.svg +1 -0
  284. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/icon/robot.svg +3 -0
  285. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/assets/image/.gitkeep +0 -0
  286. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/components/Icon/svg-icon.vue +29 -0
  287. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/lib.ts +57 -0
  288. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/useEcharts.ts +65 -0
  289. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/i18n/instance.ts +8 -0
  290. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/header/index.vue +30 -0
  291. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/index.vue +138 -0
  292. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/locales/en_US.json +4 -0
  293. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/locales/zh_CN.json +4 -0
  294. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/main.ts +13 -0
  295. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/index.ts +7 -0
  296. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/permissionGuard.ts +13 -0
  297. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/index.ts +18 -0
  298. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/interface.ts +9 -0
  299. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/modules/index.ts +33 -0
  300. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/index.ts +11 -0
  301. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/modules/user.ts +17 -0
  302. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/styles/font.scss +0 -0
  303. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/styles/index.scss +29 -0
  304. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/styles/variables.scss +3 -0
  305. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/auto-import.d.ts +78 -0
  306. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/components.d.ts +26 -0
  307. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/vite-env.d.ts +15 -0
  308. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/env.ts +11 -0
  309. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/index.ts +425 -0
  310. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/utils.ts +39 -0
  311. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/index.ts +44 -0
  312. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/config.ts +1794 -0
  313. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/index.vue +20 -0
  314. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/tree-chart.vue +16 -0
  315. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/home/index.vue +27 -0
  316. package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/login/index.vue +9 -0
  317. package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.json +29 -0
  318. package/template-vp-monorepo-react-nestjs/apps/web-vue/uno.config.ts +17 -0
  319. package/template-vp-monorepo-react-nestjs/apps/web-vue/vite.config.ts +58 -0
  320. package/template-vp-monorepo-react-nestjs/commitlint.config.js +1 -0
  321. package/template-vp-monorepo-react-nestjs/docker-compose.yml +41 -0
  322. package/template-vp-monorepo-react-nestjs/mise.toml +3 -0
  323. package/template-vp-monorepo-react-nestjs/package.json +25 -0
  324. package/template-vp-monorepo-react-nestjs/packages/i18n/core/package.json +20 -0
  325. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/format.ts +9 -0
  326. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/i18n.ts +73 -0
  327. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/index.ts +24 -0
  328. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/storage.ts +47 -0
  329. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/store.ts +48 -0
  330. package/template-vp-monorepo-react-nestjs/packages/i18n/core/src/types.ts +36 -0
  331. package/template-vp-monorepo-react-nestjs/packages/i18n/core/tsconfig.json +15 -0
  332. package/template-vp-monorepo-react-nestjs/packages/i18n/core/vite.config.ts +13 -0
  333. package/template-vp-monorepo-react-nestjs/packages/i18n/react/package.json +28 -0
  334. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/index.tsx +26 -0
  335. package/template-vp-monorepo-react-nestjs/packages/i18n/react/src/use-store.ts +14 -0
  336. package/template-vp-monorepo-react-nestjs/packages/i18n/react/tsconfig.json +16 -0
  337. package/template-vp-monorepo-react-nestjs/packages/i18n/react/vite.config.ts +16 -0
  338. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/package.json +27 -0
  339. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/index.ts +52 -0
  340. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/src/use-store.ts +19 -0
  341. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/tsconfig.json +15 -0
  342. package/template-vp-monorepo-react-nestjs/packages/i18n/vue/vite.config.ts +16 -0
  343. package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +111 -0
  344. package/template-vp-monorepo-react-nestjs/tsconfig.json +9 -0
  345. package/template-vp-monorepo-react-nestjs/vite.config.ts +19 -0
  346. package/template-vp-react/.env +1 -0
  347. package/template-vp-react/.oxfmtrc.jsonc +8 -0
  348. package/template-vp-react/.oxlintrc.jsonc +11 -0
  349. package/template-vp-react/.vite-hooks/commit-msg +1 -0
  350. package/template-vp-react/.vite-hooks/pre-commit +1 -0
  351. package/template-vp-react/.vscode/extensions.json +3 -0
  352. package/template-vp-react/.vscode/settings.json +11 -0
  353. package/template-vp-react/commitlint.config.js +0 -0
  354. package/template-vp-react/index.html +13 -0
  355. package/template-vp-react/package.json +44 -0
  356. package/template-vp-react/public/favicon.svg +1 -0
  357. package/template-vp-react/public/icons.svg +24 -0
  358. package/template-vp-react/src/App.tsx +24 -0
  359. package/template-vp-react/src/assets/hero.png +0 -0
  360. package/template-vp-react/src/assets/react.svg +1 -0
  361. package/template-vp-react/src/assets/vite.svg +1 -0
  362. package/template-vp-react/src/components/Loading/PageLoading.tsx +11 -0
  363. package/template-vp-react/src/main.tsx +5 -0
  364. package/template-vp-react/src/pages/home/index.tsx +17 -0
  365. package/template-vp-react/src/router/index.tsx +25 -0
  366. package/template-vp-react/src/router/modules/.gitkeep +0 -0
  367. package/template-vp-react/src/styles/index.css +7 -0
  368. package/template-vp-react/src/types/auto-imports.d.ts +58 -0
  369. package/template-vp-react/src/utils/env/index.ts +6 -0
  370. package/template-vp-react/src/utils/request/core/index.ts +420 -0
  371. package/template-vp-react/src/utils/request/core/utils.ts +39 -0
  372. package/template-vp-react/src/utils/request/index.ts +48 -0
  373. package/template-vp-react/tsconfig.json +32 -0
  374. package/template-vp-react/vite.config.ts +35 -0
  375. package/template-vp-react-shadcn/.agents/skills/alova-client-usage/README.md +28 -0
  376. package/template-vp-react-shadcn/.agents/skills/alova-client-usage/SKILL.md +249 -0
  377. package/template-vp-react-shadcn/.agents/skills/alova-client-usage/references/SETUP.md +146 -0
  378. package/template-vp-react-shadcn/.agents/skills/shadcn/SKILL.md +260 -0
  379. package/template-vp-react-shadcn/.agents/skills/shadcn/agents/openai.yml +5 -0
  380. package/template-vp-react-shadcn/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
  381. package/template-vp-react-shadcn/.agents/skills/shadcn/assets/shadcn.png +0 -0
  382. package/template-vp-react-shadcn/.agents/skills/shadcn/cli.md +276 -0
  383. package/template-vp-react-shadcn/.agents/skills/shadcn/customization.md +209 -0
  384. package/template-vp-react-shadcn/.agents/skills/shadcn/evals/evals.json +47 -0
  385. package/template-vp-react-shadcn/.agents/skills/shadcn/mcp.md +94 -0
  386. package/template-vp-react-shadcn/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
  387. package/template-vp-react-shadcn/.agents/skills/shadcn/rules/composition.md +195 -0
  388. package/template-vp-react-shadcn/.agents/skills/shadcn/rules/forms.md +192 -0
  389. package/template-vp-react-shadcn/.agents/skills/shadcn/rules/icons.md +101 -0
  390. package/template-vp-react-shadcn/.agents/skills/shadcn/rules/styling.md +162 -0
  391. package/template-vp-react-shadcn/.agents/skills/vite-plus/README.md +75 -0
  392. package/template-vp-react-shadcn/.agents/skills/vite-plus/SKILL.md +322 -0
  393. package/template-vp-react-shadcn/.agents/skills/vite-plus/evals.json +182 -0
  394. package/template-vp-react-shadcn/.agents/skills/vite-plus/references/config.md +162 -0
  395. package/template-vp-react-shadcn/.agents/skills/vite-plus/references/env-management.md +76 -0
  396. package/template-vp-react-shadcn/.agents/skills/vite-plus/references/task-runner.md +152 -0
  397. package/template-vp-react-shadcn/.agents/skills/vite-plus/sources.yaml +142 -0
  398. package/template-vp-react-shadcn/.env +1 -0
  399. package/template-vp-react-shadcn/.oxfmtrc.jsonc +8 -0
  400. package/template-vp-react-shadcn/.oxlintrc.jsonc +3 -0
  401. package/template-vp-react-shadcn/.vite-hooks/commit-msg +1 -0
  402. package/template-vp-react-shadcn/.vite-hooks/pre-commit +1 -0
  403. package/template-vp-react-shadcn/.vscode/extensions.json +3 -0
  404. package/template-vp-react-shadcn/.vscode/settings.json +12 -0
  405. package/template-vp-react-shadcn/agents.md +44 -0
  406. package/template-vp-react-shadcn/commitlint.config.js +1 -0
  407. package/template-vp-react-shadcn/components.json +25 -0
  408. package/template-vp-react-shadcn/index.html +13 -0
  409. package/template-vp-react-shadcn/package.json +56 -0
  410. package/template-vp-react-shadcn/public/favicon.svg +1 -0
  411. package/template-vp-react-shadcn/public/icons.svg +24 -0
  412. package/template-vp-react-shadcn/skills-lock.json +11 -0
  413. package/template-vp-react-shadcn/src/App.tsx +24 -0
  414. package/template-vp-react-shadcn/src/api/.gitkeep +0 -0
  415. package/template-vp-react-shadcn/src/assets/hero.png +0 -0
  416. package/template-vp-react-shadcn/src/assets/react.svg +1 -0
  417. package/template-vp-react-shadcn/src/assets/vite.svg +1 -0
  418. package/template-vp-react-shadcn/src/components/Loading/PageLoading.tsx +11 -0
  419. package/template-vp-react-shadcn/src/components/Player/VideoJS/index.tsx +163 -0
  420. package/template-vp-react-shadcn/src/components/Player/index.ts +7 -0
  421. package/template-vp-react-shadcn/src/components/ui/button.tsx +67 -0
  422. package/template-vp-react-shadcn/src/components/ui/sonner.tsx +43 -0
  423. package/template-vp-react-shadcn/src/components/ui/spinner.tsx +17 -0
  424. package/template-vp-react-shadcn/src/hooks/.gitkeep +0 -0
  425. package/template-vp-react-shadcn/src/lib/utils.ts +6 -0
  426. package/template-vp-react-shadcn/src/main.tsx +5 -0
  427. package/template-vp-react-shadcn/src/pages/home/index.tsx +96 -0
  428. package/template-vp-react-shadcn/src/router/index.tsx +25 -0
  429. package/template-vp-react-shadcn/src/router/modules/.gitkeep +0 -0
  430. package/template-vp-react-shadcn/src/store/.gitkeep +0 -0
  431. package/template-vp-react-shadcn/src/styles/index.css +16 -0
  432. package/template-vp-react-shadcn/src/styles/shadcn.css +127 -0
  433. package/template-vp-react-shadcn/src/types/auto-imports.d.ts +58 -0
  434. package/template-vp-react-shadcn/src/utils/env/index.tsx +6 -0
  435. package/template-vp-react-shadcn/src/utils/request/alova-core/index.ts +425 -0
  436. package/template-vp-react-shadcn/src/utils/request/alova-core/utils.ts +39 -0
  437. package/template-vp-react-shadcn/src/utils/request/index.ts +48 -0
  438. package/template-vp-react-shadcn/src/utils/request/readme.md +176 -0
  439. package/template-vp-react-shadcn/tsconfig.json +32 -0
  440. package/template-vp-react-shadcn/vite.config.ts +35 -0
  441. package/template-vue-vp-eslint/.env +6 -0
  442. package/template-vue-vp-eslint/.env.development +2 -0
  443. package/template-vue-vp-eslint/.env.production +2 -0
  444. package/template-vue-vp-eslint/.vscode/extensions.json +3 -0
  445. package/template-vue-vp-eslint/AGENTS.md +16 -0
  446. package/template-vue-vp-eslint/README.md +98 -0
  447. package/template-vue-vp-eslint/commitlint.config.js +1 -0
  448. package/template-vue-vp-eslint/eslint.config.js +13 -0
  449. package/template-vue-vp-eslint/index.html +13 -0
  450. package/template-vue-vp-eslint/lefthook.yml +11 -0
  451. package/template-vue-vp-eslint/package.json +63 -0
  452. package/template-vue-vp-eslint/pnpm-workspace.yaml +3 -0
  453. package/template-vue-vp-eslint/public/vite.svg +1 -0
  454. package/template-vue-vp-eslint/src/App.vue +7 -0
  455. package/template-vue-vp-eslint/src/api/index.ts +12 -0
  456. package/template-vue-vp-eslint/src/assets/icon/home.svg +3 -0
  457. package/template-vue-vp-eslint/src/assets/icon/logo.svg +1 -0
  458. package/template-vue-vp-eslint/src/assets/image/.gitkeep +0 -0
  459. package/template-vue-vp-eslint/src/components/Icon/svg-icon.vue +29 -0
  460. package/template-vue-vp-eslint/src/hooks/chart/lib.ts +57 -0
  461. package/template-vue-vp-eslint/src/hooks/chart/useEcharts.ts +65 -0
  462. package/template-vue-vp-eslint/src/layout/default/header/index.vue +30 -0
  463. package/template-vue-vp-eslint/src/layout/default/index.vue +138 -0
  464. package/template-vue-vp-eslint/src/main.ts +16 -0
  465. package/template-vue-vp-eslint/src/router/guard/index.ts +7 -0
  466. package/template-vue-vp-eslint/src/router/guard/permissionGuard.ts +13 -0
  467. package/template-vue-vp-eslint/src/router/index.ts +18 -0
  468. package/template-vue-vp-eslint/src/router/interface.ts +9 -0
  469. package/template-vue-vp-eslint/src/router/modules/index.ts +33 -0
  470. package/template-vue-vp-eslint/src/store/index.ts +11 -0
  471. package/template-vue-vp-eslint/src/store/modules/user.ts +17 -0
  472. package/template-vue-vp-eslint/src/styles/font.scss +0 -0
  473. package/template-vue-vp-eslint/src/styles/index.scss +29 -0
  474. package/template-vue-vp-eslint/src/styles/variables.scss +3 -0
  475. package/template-vue-vp-eslint/src/types/vite-env.d.ts +15 -0
  476. package/template-vue-vp-eslint/src/utils/env.ts +11 -0
  477. package/template-vue-vp-eslint/src/utils/request/core/index.ts +425 -0
  478. package/template-vue-vp-eslint/src/utils/request/core/utils.ts +39 -0
  479. package/template-vue-vp-eslint/src/utils/request/index.ts +44 -0
  480. package/template-vue-vp-eslint/src/views/example/echart/config.ts +1794 -0
  481. package/template-vue-vp-eslint/src/views/example/echart/index.vue +20 -0
  482. package/template-vue-vp-eslint/src/views/example/tree-chart.vue +16 -0
  483. package/template-vue-vp-eslint/src/views/home/index.vue +16 -0
  484. package/template-vue-vp-eslint/src/views/login/index.vue +9 -0
  485. package/template-vue-vp-eslint/tsconfig.json +29 -0
  486. package/template-vue-vp-eslint/uno.config.ts +17 -0
  487. package/template-vue-vp-eslint/vite.config.ts +58 -0
@@ -0,0 +1,142 @@
1
+ # Auto-generated by skill-forge. Review and update before submitting PR.
2
+ # All URLs must be from official documentation only.
3
+ # No Stack Overflow, blog posts, or community wikis.
4
+
5
+ skill: vite-plus
6
+ crawled: 2026-03-14
7
+ sources:
8
+ - url: https://viteplus.dev
9
+ type: readme
10
+ description: Homepage with feature overview and tagline
11
+ accessed: 2026-03-14
12
+ sections_used:
13
+ - Features overview
14
+ - Technology stack
15
+
16
+ - url: https://viteplus.dev/guide/
17
+ type: guide
18
+ description: Main getting started guide with installation and CLI overview
19
+ accessed: 2026-03-14
20
+ sections_used:
21
+ - Installation
22
+ - Core components
23
+ - Key commands
24
+
25
+ - url: https://viteplus.dev/guide/create
26
+ type: guide
27
+ description: Project scaffolding with vp create - templates, options, monorepo setup
28
+ accessed: 2026-03-14
29
+ sections_used:
30
+ - Built-in templates
31
+ - CLI options
32
+ - Template sources
33
+
34
+ - url: https://viteplus.dev/guide/migrate
35
+ type: guide
36
+ description: Migration from standalone Vite/Vitest projects
37
+ accessed: 2026-03-14
38
+ sections_used:
39
+ - What gets migrated
40
+ - Command mappings
41
+ - Post-migration steps
42
+
43
+ - url: https://viteplus.dev/guide/dev
44
+ type: guide
45
+ description: Dev server usage (wraps standard Vite dev server)
46
+ accessed: 2026-03-14
47
+
48
+ - url: https://viteplus.dev/guide/build
49
+ type: guide
50
+ description: Production build with Rolldown
51
+ accessed: 2026-03-14
52
+ sections_used:
53
+ - Build vs run build distinction
54
+
55
+ - url: https://viteplus.dev/guide/check
56
+ type: guide
57
+ description: Unified format + lint + type-check command
58
+ accessed: 2026-03-14
59
+ sections_used:
60
+ - Integrated tools
61
+ - Type-aware checking
62
+
63
+ - url: https://viteplus.dev/guide/test
64
+ type: guide
65
+ description: Vitest integration and watch mode behavior
66
+ accessed: 2026-03-14
67
+ sections_used:
68
+ - Watch mode distinction
69
+ - Configuration
70
+
71
+ - url: https://viteplus.dev/guide/lint
72
+ type: guide
73
+ description: Oxlint integration and type-aware linting
74
+ accessed: 2026-03-14
75
+ sections_used:
76
+ - Type-aware linting
77
+ - JS plugin support
78
+
79
+ - url: https://viteplus.dev/guide/fmt
80
+ type: guide
81
+ description: Oxfmt formatting with Prettier compatibility
82
+ accessed: 2026-03-14
83
+
84
+ - url: https://viteplus.dev/guide/pack
85
+ type: guide
86
+ description: Library packaging with tsdown
87
+ accessed: 2026-03-14
88
+ sections_used:
89
+ - Configuration
90
+ - Standalone executables
91
+
92
+ - url: https://viteplus.dev/guide/run
93
+ type: guide
94
+ description: Task runner with caching and monorepo support
95
+ accessed: 2026-03-14
96
+ sections_used:
97
+ - Caching system
98
+ - Monorepo flags
99
+ - Task configuration
100
+
101
+ - url: https://viteplus.dev/guide/env
102
+ type: guide
103
+ description: Node.js version and runtime management
104
+ accessed: 2026-03-14
105
+ sections_used:
106
+ - Operating modes
107
+ - Version management commands
108
+
109
+ - url: https://viteplus.dev/config/
110
+ type: api-reference
111
+ description: Configuration overview for vite.config.ts
112
+ accessed: 2026-03-14
113
+
114
+ - url: https://viteplus.dev/config/lint
115
+ type: api-reference
116
+ description: Lint configuration options
117
+ accessed: 2026-03-14
118
+
119
+ - url: https://viteplus.dev/config/fmt
120
+ type: api-reference
121
+ description: Format configuration options
122
+ accessed: 2026-03-14
123
+
124
+ - url: https://viteplus.dev/config/test
125
+ type: api-reference
126
+ description: Test configuration options
127
+ accessed: 2026-03-14
128
+
129
+ - url: https://viteplus.dev/config/run
130
+ type: api-reference
131
+ description: Task runner configuration options
132
+ accessed: 2026-03-14
133
+
134
+ - url: https://viteplus.dev/config/pack
135
+ type: api-reference
136
+ description: Pack/library configuration options
137
+ accessed: 2026-03-14
138
+
139
+ - url: https://viteplus.dev/config/staged
140
+ type: api-reference
141
+ description: Staged file pre-commit configuration
142
+ accessed: 2026-03-14
@@ -0,0 +1 @@
1
+ VITE_PORT = 9999
@@ -0,0 +1,8 @@
1
+ {
2
+ "printWidth": 80,
3
+ "semi": false,
4
+ "singleQuote": true,
5
+ "sortImports": {},
6
+ "sortTailwindcss": {},
7
+ "sortPackageJson": true,
8
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "plugins": ["import", "jsdoc", "promise", "react", "react-perf", "jsx-a11y", "promise"],
3
+ }
@@ -0,0 +1 @@
1
+ vp exec commitlint --edit "$1"
@@ -0,0 +1 @@
1
+ NO_COLOR=1 FORCE_COLOR=0 vp staged
@@ -0,0 +1,3 @@
1
+ {
2
+ "recommendations": ["VoidZero.vite-plus-extension-pack"]
3
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "biome.enabled": false,
3
+ "editor.defaultFormatter": "oxc.oxc-vscode",
4
+ "editor.formatOnSave": true,
5
+ "editor.formatOnSaveMode": "file",
6
+ "editor.codeActionsOnSave": {
7
+ "source.fixAll.oxc": "explicit"
8
+ },
9
+ "oxc.configPath": ".oxlintrc.jsonc",
10
+ "oxc.fmt.configPath": ".oxfmtrc.jsonc",
11
+ "cSpell.words": ["alova"]
12
+ }
@@ -0,0 +1,44 @@
1
+ # Agent 指南
2
+
3
+ ## 项目约定
4
+
5
+ - 项目是 Vite+、React 19、TypeScript 前端应用,路径别名 `@/*` 指向 `src/*`。
6
+ - 路由使用 React Router 7,集中维护在 `src/router/index.tsx`。
7
+ - 路由页面放在 `src/pages/<route>/index.tsx`,保持现有 `lazyLoad()` 导入规则。
8
+ - `src/types/auto-imports.d.ts` 是生成文件,不要手动编辑。
9
+
10
+ ## 命令
11
+
12
+ ```bash
13
+ vp dev
14
+ vp check
15
+ tsc && vp build
16
+ ```
17
+
18
+ ## UI 与样式
19
+
20
+ - UI 组件使用 shadcn/ui,已有组件位于 `src/components/ui`。
21
+ - 新增 shadcn/ui 组件使用 `pnpm shadcn add xxx`。
22
+ - 图标优先使用 `lucide-react`。
23
+ - 动效:引人注目的关键区域可适当加入动画,复杂动效优先使用已安装的 `gsap`,避免过度动画影响可用性。
24
+ - 样式优先使用 Tailwind CSS classNames。
25
+ - 复杂、复用、嵌套样式使用 Sass CSS Module,文件命名为 `xxx.module.scss`。
26
+ - CSS Module 类名遵循 BEM:`block`、`block__element`、`block--modifier`。
27
+ - 多个 class 组合使用 `cn()`,工具位于 `src/lib/utils.ts`。
28
+ - 不要随意新增普通全局 class;全局 reset、基础变量和应用级基础规则放在 `src/styles/index.css`。
29
+
30
+ ## 代码规则
31
+
32
+ - 源码内优先使用 `@/` 路径别名。
33
+ - React 组件使用 PascalCase,hooks 使用 `useXxx`,普通变量和函数使用 camelCase,常量使用 UPPER_SNAKE_CASE。
34
+ - 需要枚举值时不要使用 TypeScript `enum`,使用常量对象加类型推导。
35
+ - 接接口时参照 `src/utils/request/readme.md`,业务接口统一放在 `src/api` 并用 `alovaRequest` 封装。
36
+ - 环境变量统一使用 `src/utils/env/index.tsx` 导出的 `envVariables`,不允许在业务代码中直接使用 `import.meta.env`。
37
+ - 日期处理统一使用 `dayjs`。
38
+ - 需要工具函数时优先查看 `radashi` 是否已提供;没有合适方法时,再在 `src/utils` 下新增全局工具类。
39
+ - 需要全局状态管理时使用 `zustand`,在 `src/store` 下按业务拆分模块。
40
+
41
+ ## 验证
42
+
43
+ - 普通代码改动:执行 `vp check` 和 `tsc && vp build`。
44
+ - 视觉改动:启动 `vp dev`,在浏览器中检查受影响页面。
@@ -0,0 +1 @@
1
+ export default { extends: ["@commitlint/config-conventional"] };
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "radix-nova",
4
+ "rsc": false,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "src/styles/index.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "lucide",
14
+ "rtl": false,
15
+ "aliases": {
16
+ "components": "@/components",
17
+ "utils": "@/lib/utils",
18
+ "ui": "@/components/ui",
19
+ "lib": "@/lib",
20
+ "hooks": "@/hooks"
21
+ },
22
+ "menuColor": "default",
23
+ "menuAccent": "subtle",
24
+ "registries": {}
25
+ }
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>vp-react</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "vp-react-shadcn",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vp dev",
8
+ "build": "tsc && vp build",
9
+ "preview": "vp preview",
10
+ "prepare": "vp config",
11
+ "check": "vp check"
12
+ },
13
+ "dependencies": {
14
+ "@fontsource-variable/geist": "^5.2.9",
15
+ "@tailwindcss/vite": "^4.3.0",
16
+ "@videojs/react": "10.0.0-beta.23",
17
+ "alova": "^3.5.1",
18
+ "class-variance-authority": "^0.7.1",
19
+ "classnames": "^2.5.1",
20
+ "clsx": "^2.1.1",
21
+ "dayjs": "^1.11.20",
22
+ "gsap": "^3.15.0",
23
+ "lucide-react": "^1.17.0",
24
+ "next-themes": "^0.4.6",
25
+ "radashi": "^12.9.1",
26
+ "radix-ui": "^1.5.0",
27
+ "react": "^19.2.7",
28
+ "react-dom": "^19.2.7",
29
+ "react-router": "^7.17.0",
30
+ "sonner": "^2.0.7",
31
+ "tailwind-merge": "^3.6.0",
32
+ "tailwindcss": "^4.3.0",
33
+ "tw-animate-css": "^1.4.0",
34
+ "zustand": "^5.0.14"
35
+ },
36
+ "devDependencies": {
37
+ "@commitlint/cli": "^21.0.2",
38
+ "@commitlint/config-conventional": "^21.0.2",
39
+ "@types/react": "^19.2.17",
40
+ "@types/react-dom": "^19.2.3",
41
+ "@vitejs/plugin-react": "^6.0.2",
42
+ "sass": "^1.100.0",
43
+ "shadcn": "^4.10.0",
44
+ "typescript": "~6.0.3",
45
+ "unplugin-auto-import": "^21.0.0",
46
+ "vite": "npm:@voidzero-dev/vite-plus-core@latest",
47
+ "vite-plus": "latest"
48
+ },
49
+ "packageManager": "pnpm@11.5.2",
50
+ "pnpm": {
51
+ "overrides": {
52
+ "vite": "npm:@voidzero-dev/vite-plus-core@latest",
53
+ "vitest": "npm:@voidzero-dev/vite-plus-test@latest"
54
+ }
55
+ }
56
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="46" fill="none" viewBox="0 0 48 46"><path fill="#863bff" d="M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z" style="fill:#863bff;fill:color(display-p3 .5252 .23 1);fill-opacity:1"/><mask id="a" width="48" height="46" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z" style="fill:#000;fill-opacity:1"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#ede6ff" rx="5.508" ry="14.704" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -4.47 31.516)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#ede6ff" rx="10.399" ry="29.851" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -39.328 7.883)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#7e14ff" rx="5.508" ry="30.487" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -25.913 -14.639)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -32.644 -3.334)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -34.34 30.47)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#ede6ff" rx="14.072" ry="22.078" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="rotate(93.35 24.506 48.493)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx=".387" cy="8.972" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(39.51 .387 8.972)"/></g><g filter="url(#k)"><ellipse cx="47.523" cy="-6.092" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 47.523 -6.092)"/></g><g filter="url(#l)"><ellipse cx="41.412" cy="6.333" fill="#47bfff" rx="5.971" ry="9.665" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 41.412 6.333)"/></g><g filter="url(#m)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#n)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#o)"><ellipse cx="35.651" cy="29.907" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 35.651 29.907)"/></g><g filter="url(#p)"><ellipse cx="38.418" cy="32.4" fill="#47bfff" rx="5.971" ry="15.297" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 38.418 32.4)"/></g></g><defs><filter id="b" width="60.045" height="41.654" x="-19.77" y="16.149" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-54.613" y="-7.533" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-49.64" y="2.03" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-45.045" y="20.029" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-43.513" y="21.178" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="15.756" y="-17.901" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-27.636" y="-22.853" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="20.116" y="-38.415" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="24.641" y="-11.323" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="8.244" y="-2.416" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="18.713" y="10.588" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter></defs></svg>
@@ -0,0 +1,24 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg">
2
+ <symbol id="bluesky-icon" viewBox="0 0 16 17">
3
+ <g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
4
+ <defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
5
+ </symbol>
6
+ <symbol id="discord-icon" viewBox="0 0 20 19">
7
+ <path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
8
+ </symbol>
9
+ <symbol id="documentation-icon" viewBox="0 0 21 20">
10
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
11
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
12
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
13
+ </symbol>
14
+ <symbol id="github-icon" viewBox="0 0 19 19">
15
+ <path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
16
+ </symbol>
17
+ <symbol id="social-icon" viewBox="0 0 20 20">
18
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
19
+ <path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
20
+ </symbol>
21
+ <symbol id="x-icon" viewBox="0 0 19 19">
22
+ <path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
23
+ </symbol>
24
+ </svg>
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 1,
3
+ "skills": {
4
+ "shadcn": {
5
+ "source": "shadcn/ui",
6
+ "sourceType": "github",
7
+ "skillPath": "skills/shadcn/SKILL.md",
8
+ "computedHash": "f0fdd03f4755cbb3b57e20fe6fd4a97c00d34e6780187b6559316986e8d848db"
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,24 @@
1
+ import dayjs from "dayjs";
2
+ import "dayjs/locale/zh-cn";
3
+ import { Suspense } from "react";
4
+ import { RouterProvider } from "react-router";
5
+
6
+ import PageLoading from "@/components/Loading/PageLoading";
7
+ import { Toaster } from "@/components/ui/sonner";
8
+
9
+ import { router } from "./router";
10
+
11
+ dayjs.locale("zh-cn");
12
+
13
+ function App() {
14
+ return (
15
+ <>
16
+ <Suspense fallback={<PageLoading />}>
17
+ <RouterProvider router={router} />
18
+ </Suspense>
19
+ <Toaster />
20
+ </>
21
+ );
22
+ }
23
+
24
+ export default App;
File without changes
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="77" height="47" fill="none" aria-labelledby="vite-logo-title" viewBox="0 0 77 47"><title id="vite-logo-title">Vite</title><style>.parenthesis{fill:#000}@media (prefers-color-scheme:dark){.parenthesis{fill:#fff}}</style><path fill="#9135ff" d="M40.151 45.71c-.663.844-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.493c-.92 0-1.457-1.04-.92-1.788l7.479-10.471c1.07-1.498 0-3.578-1.842-3.578H15.443c-.92 0-1.456-1.04-.92-1.788l9.696-13.576c.213-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.472c-1.07 1.497 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.087.89 1.83L40.153 45.712z"/><mask id="a" width="48" height="47" x="14" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M40.047 45.71c-.663.843-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.389c-.92 0-1.457-1.04-.92-1.788l7.479-10.472c1.07-1.497 0-3.578-1.842-3.578H15.34c-.92 0-1.456-1.04-.92-1.788l9.696-13.575c.213-.297.556-.474.92-.474H53.93c.92 0 1.456 1.04.92 1.788L47.37 13.03c-1.07 1.498 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.088.89 1.831L40.049 45.712z"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#eee6ff" rx="5.508" ry="14.704" transform="rotate(269.814 20.96 11.29)scale(-1 1)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#eee6ff" rx="10.399" ry="29.851" transform="rotate(89.814 -16.902 -8.275)scale(1 -1)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#8900ff" rx="5.508" ry="30.487" transform="rotate(89.814 -19.197 -7.127)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.928 4.177)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.738 5.52)scale(1 -1)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#eee6ff" rx="14.072" ry="22.078" transform="rotate(93.35 31.245 55.578)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx="14.592" cy="9.743" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(39.51 14.592 9.743)"/></g><g filter="url(#k)"><ellipse cx="61.728" cy="-5.321" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 61.728 -5.32)"/></g><g filter="url(#l)"><ellipse cx="55.618" cy="7.104" fill="#00c2ff" rx="5.971" ry="9.665" transform="rotate(37.892 55.618 7.104)"/></g><g filter="url(#m)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#n)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#o)"><ellipse cx="49.857" cy="30.678" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 49.857 30.678)"/></g><g filter="url(#p)"><ellipse cx="52.623" cy="33.171" fill="#00c2ff" rx="5.971" ry="15.297" transform="rotate(37.892 52.623 33.17)"/></g></g><path d="M6.919 0c-9.198 13.166-9.252 33.575 0 46.789h6.215c-9.25-13.214-9.196-33.623 0-46.789zm62.424 0h-6.215c9.198 13.166 9.252 33.575 0 46.789h6.215c9.25-13.214 9.196-33.623 0-46.789" class="parenthesis"/><defs><filter id="b" width="60.045" height="41.654" x="-5.564" y="16.92" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-40.407" y="-6.762" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-35.435" y="2.801" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-30.84" y="20.8" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-29.307" y="21.949" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="29.961" y="-17.13" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-13.43" y="-22.082" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="34.321" y="-37.644" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="38.847" y="-10.552" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="22.45" y="-1.645" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="32.919" y="11.36" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter></defs></svg>
@@ -0,0 +1,11 @@
1
+ import { Spinner } from "@/components/ui/spinner";
2
+
3
+ const Loading = () => {
4
+ return (
5
+ <div className="flex h-full w-full items-center justify-center">
6
+ <Spinner className="size-6" />
7
+ </div>
8
+ );
9
+ };
10
+
11
+ export default Loading;
@@ -0,0 +1,163 @@
1
+ import { createPlayer } from "@videojs/react";
2
+ import { HlsVideo } from "@videojs/react/media/hls-video";
3
+ import { Video, VideoSkin, videoFeatures } from "@videojs/react/video";
4
+ import "@videojs/react/video/skin.css";
5
+ import type { ReactNode, VideoHTMLAttributes } from "react";
6
+
7
+ import { cn } from "@/lib/utils";
8
+
9
+ export const VIDEO_JS_SOURCE_TYPES = {
10
+ AUTO: "auto",
11
+ HLS: "hls",
12
+ MP4: "mp4",
13
+ NATIVE: "native",
14
+ } as const;
15
+
16
+ export type VideoJSSourceType = (typeof VIDEO_JS_SOURCE_TYPES)[keyof typeof VIDEO_JS_SOURCE_TYPES];
17
+
18
+ export type VideoJSSource = {
19
+ src: string;
20
+ type?: string;
21
+ sourceType?: Exclude<VideoJSSourceType, "auto">;
22
+ };
23
+
24
+ type VideoJSPreload = "" | "none" | "metadata" | "auto";
25
+
26
+ type NativeVideoProps = Omit<
27
+ VideoHTMLAttributes<HTMLVideoElement>,
28
+ "children" | "className" | "controls" | "poster" | "preload" | "src"
29
+ >;
30
+
31
+ export type VideoJSProps = NativeVideoProps & {
32
+ src?: string;
33
+ type?: string;
34
+ sources?: VideoJSSource[];
35
+ sourceType?: VideoJSSourceType;
36
+ poster?: string;
37
+ className?: string;
38
+ videoClassName?: string;
39
+ preload?: VideoJSPreload;
40
+ hlsConfig?: Record<string, unknown>;
41
+ hlsDebug?: boolean;
42
+ preferPlayback?: "mse" | "native";
43
+ children?: ReactNode;
44
+ };
45
+
46
+ const VideoJSPlayer = createPlayer({
47
+ features: videoFeatures,
48
+ displayName: "VideoJS",
49
+ });
50
+
51
+ const HLS_MIME_TYPES = new Set(["application/vnd.apple.mpegurl", "application/x-mpegurl"]);
52
+
53
+ const MP4_MIME_TYPES = new Set(["video/mp4", "application/mp4"]);
54
+
55
+ const getSourceList = ({ src, type, sources }: Pick<VideoJSProps, "src" | "type" | "sources">) => {
56
+ if (sources?.length) {
57
+ return sources;
58
+ }
59
+
60
+ return src ? [{ src, type }] : [];
61
+ };
62
+
63
+ const getUrlPath = (src: string) => src.split(/[?#]/)[0]?.toLowerCase() ?? "";
64
+
65
+ const inferSourceType = (source: VideoJSSource, fallback: VideoJSSourceType) => {
66
+ if (source.sourceType) {
67
+ return source.sourceType;
68
+ }
69
+
70
+ if (fallback !== VIDEO_JS_SOURCE_TYPES.AUTO) {
71
+ return fallback;
72
+ }
73
+
74
+ const mimeType = source.type?.toLowerCase();
75
+ const path = getUrlPath(source.src);
76
+
77
+ if (mimeType && HLS_MIME_TYPES.has(mimeType)) {
78
+ return VIDEO_JS_SOURCE_TYPES.HLS;
79
+ }
80
+
81
+ if (path.endsWith(".m3u8")) {
82
+ return VIDEO_JS_SOURCE_TYPES.HLS;
83
+ }
84
+
85
+ if (mimeType && MP4_MIME_TYPES.has(mimeType)) {
86
+ return VIDEO_JS_SOURCE_TYPES.MP4;
87
+ }
88
+
89
+ if (path.endsWith(".mp4")) {
90
+ return VIDEO_JS_SOURCE_TYPES.MP4;
91
+ }
92
+
93
+ return VIDEO_JS_SOURCE_TYPES.NATIVE;
94
+ };
95
+
96
+ const VideoJS = ({
97
+ src,
98
+ type,
99
+ sources,
100
+ sourceType = VIDEO_JS_SOURCE_TYPES.AUTO,
101
+ poster,
102
+ className,
103
+ videoClassName,
104
+ preload = "metadata",
105
+ playsInline = true,
106
+ hlsConfig,
107
+ hlsDebug = false,
108
+ preferPlayback = "mse",
109
+ children,
110
+ ...videoProps
111
+ }: VideoJSProps) => {
112
+ const sourceList = getSourceList({ src, type, sources });
113
+ const primarySource = sourceList[0];
114
+
115
+ if (!primarySource) {
116
+ return null;
117
+ }
118
+
119
+ const resolvedSourceType = inferSourceType(primarySource, sourceType);
120
+ const isHls = resolvedSourceType === VIDEO_JS_SOURCE_TYPES.HLS;
121
+
122
+ return (
123
+ <VideoJSPlayer.Provider>
124
+ <VideoSkin
125
+ poster={poster}
126
+ className={cn(
127
+ "aspect-video w-full overflow-hidden rounded-lg bg-black shadow-sm",
128
+ className,
129
+ )}
130
+ >
131
+ {isHls ? (
132
+ <HlsVideo
133
+ {...videoProps}
134
+ src={primarySource.src}
135
+ type={primarySource.type ?? "application/vnd.apple.mpegurl"}
136
+ preload={preload}
137
+ playsInline={playsInline}
138
+ config={hlsConfig}
139
+ debug={hlsDebug}
140
+ preferPlayback={preferPlayback}
141
+ className={cn("h-full w-full", videoClassName)}
142
+ >
143
+ {children}
144
+ </HlsVideo>
145
+ ) : (
146
+ <Video
147
+ {...videoProps}
148
+ preload={preload}
149
+ playsInline={playsInline}
150
+ className={cn("h-full w-full", videoClassName)}
151
+ >
152
+ {sourceList.map((source) => (
153
+ <source key={`${source.src}-${source.type}`} src={source.src} type={source.type} />
154
+ ))}
155
+ {children}
156
+ </Video>
157
+ )}
158
+ </VideoSkin>
159
+ </VideoJSPlayer.Provider>
160
+ );
161
+ };
162
+
163
+ export default VideoJS;