├── website ├── postcss.config.js ├── client │ ├── src │ │ ├── main.tsx │ │ ├── components │ │ │ ├── ui │ │ │ │ ├── aspect-ratio.tsx │ │ │ │ ├── skeleton.tsx │ │ │ │ ├── collapsible.tsx │ │ │ │ ├── textarea.tsx │ │ │ │ ├── label.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── progress.tsx │ │ │ │ ├── separator.tsx │ │ │ │ ├── toaster.tsx │ │ │ │ ├── checkbox.tsx │ │ │ │ ├── slider.tsx │ │ │ │ ├── switch.tsx │ │ │ │ ├── badge.tsx │ │ │ │ ├── tooltip.tsx │ │ │ │ ├── hover-card.tsx │ │ │ │ ├── popover.tsx │ │ │ │ ├── avatar.tsx │ │ │ │ ├── radio-group.tsx │ │ │ │ ├── toggle.tsx │ │ │ │ ├── alert.tsx │ │ │ │ ├── scroll-area.tsx │ │ │ │ ├── resizable.tsx │ │ │ │ ├── toggle-group.tsx │ │ │ │ ├── tabs.tsx │ │ │ │ ├── button.tsx │ │ │ │ ├── card.tsx │ │ │ │ ├── accordion.tsx │ │ │ │ ├── input-otp.tsx │ │ │ │ ├── calendar.tsx │ │ │ │ ├── breadcrumb.tsx │ │ │ │ ├── pagination.tsx │ │ │ │ ├── table.tsx │ │ │ │ ├── drawer.tsx │ │ │ │ ├── dialog.tsx │ │ │ │ ├── sheet.tsx │ │ │ │ ├── form.tsx │ │ │ │ ├── alert-dialog.tsx │ │ │ │ ├── toast.tsx │ │ │ │ ├── command.tsx │ │ │ │ ├── navigation-menu.tsx │ │ │ │ ├── select.tsx │ │ │ │ ├── carousel.tsx │ │ │ │ ├── context-menu.tsx │ │ │ │ └── dropdown-menu.tsx │ │ │ ├── tags-legend.tsx │ │ │ ├── language-switcher.tsx │ │ │ ├── usage-guide.tsx │ │ │ ├── hero-section.tsx │ │ │ ├── contribute-section.tsx │ │ │ ├── footer.tsx │ │ │ ├── header.tsx │ │ │ ├── recommended-apps.tsx │ │ │ └── provider-stats.tsx │ │ ├── lib │ │ │ ├── utils.ts │ │ │ ├── queryClient.ts │ │ │ └── api-providers-data.ts │ │ ├── hooks │ │ │ ├── use-mobile.tsx │ │ │ ├── use-language.tsx │ │ │ └── use-toast.ts │ │ ├── pages │ │ │ ├── not-found.tsx │ │ │ └── home.tsx │ │ ├── App.tsx │ │ └── index.css │ └── index.html ├── drizzle.config.ts ├── components.json ├── tsconfig.json ├── vite.config.ts ├── shared │ └── schema.ts ├── server │ ├── routes.ts │ ├── index.ts │ └── vite.ts ├── index.html ├── tailwind.config.ts ├── attached_assets │ └── Pasted--Logo-lionbridge-com-weglot-c-1750993147083_1750993147084.txt ├── package.json ├── replit.md └── README-HTML.md ├── .github ├── ISSUE_TEMPLATE │ ├── 反馈失效提供方.md │ └── 添加api提供方.md └── workflows │ └── clean.yml └── .gitignore /website/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /website/client/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from "react-dom/client"; 2 | import App from "./App"; 3 | import "./index.css"; 4 | 5 | createRoot(document.getElementById("root")!).render(); 6 | -------------------------------------------------------------------------------- /website/client/src/components/ui/aspect-ratio.tsx: -------------------------------------------------------------------------------- 1 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" 2 | 3 | const AspectRatio = AspectRatioPrimitive.Root 4 | 5 | export { AspectRatio } 6 | -------------------------------------------------------------------------------- /website/client/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /website/client/src/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /website/drizzle.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "drizzle-kit"; 2 | 3 | if (!process.env.DATABASE_URL) { 4 | throw new Error("DATABASE_URL, ensure the database is provisioned"); 5 | } 6 | 7 | export default defineConfig({ 8 | out: "./migrations", 9 | schema: "./shared/schema.ts", 10 | dialect: "postgresql", 11 | dbCredentials: { 12 | url: process.env.DATABASE_URL, 13 | }, 14 | }); 15 | -------------------------------------------------------------------------------- /website/client/src/components/ui/collapsible.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" 4 | 5 | const Collapsible = CollapsiblePrimitive.Root 6 | 7 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger 8 | 9 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent 10 | 11 | export { Collapsible, CollapsibleTrigger, CollapsibleContent } 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/反馈失效提供方.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 反馈失效提供方 3 | about: 反馈站点失效提供方 4 | title: 反馈站点失效提供方 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | --- 11 | name: 反馈失效提供方 12 | about: 反馈失效提供方模板 13 | title: 反馈失效提供方 14 | labels: '' 15 | assignees: TechnologyStar 16 | 17 | --- 18 | 19 | ### 网址 20 | 21 | ### 原因 22 | 23 | 24 | - [ ] 🚫网站无法正常打开 25 | - [ ] ❌api功能异常 26 | - [ ] 🛑api地址遭到中国国家防火墙拦截 27 | - [ ] 🤔其他: 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Common Node/Vite artifacts 2 | node_modules/ 3 | dist/ 4 | build/ 5 | .tmp/ 6 | .temp/ 7 | 8 | # Logs 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | pnpm-debug.log* 13 | 14 | # Environment files 15 | .env 16 | .env.* 17 | 18 | # Editor directories and files 19 | .vscode/ 20 | .idea/ 21 | *.swp 22 | .DS_Store 23 | Thumbs.db 24 | 25 | # Coverage / test output 26 | coverage/ 27 | .junit/ 28 | 29 | # Misc 30 | *.local 31 | -------------------------------------------------------------------------------- /website/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "client/src/index.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /website/client/src/hooks/use-mobile.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | const MOBILE_BREAKPOINT = 768 4 | 5 | export function useIsMobile() { 6 | const [isMobile, setIsMobile] = React.useState(undefined) 7 | 8 | React.useEffect(() => { 9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) 10 | const onChange = () => { 11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 12 | } 13 | mql.addEventListener("change", onChange) 14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 15 | return () => mql.removeEventListener("change", onChange) 16 | }, []) 17 | 18 | return !!isMobile 19 | } 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/添加api提供方.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 添加api提供方 3 | about: 添加api提供方 4 | title: 添加api提供方 5 | labels: '' 6 | assignees: TechnologyStar 7 | 8 | --- 9 | 10 | --- 11 | name: 添加api提供方 12 | about: 添加api提供方模板 13 | title: 添加api提供方 14 | labels: '' 15 | assignees: TechnologyStar 16 | 17 | --- 18 | 19 | ### 网址 20 | 21 | 22 | ### 属性 23 | 24 | 25 | 26 | #### 基本属性(单选) 27 | - [ ] 🆓完全免费 28 | - [ ] 🔓有免费额度(注册赠送额度>0.15美元) 29 | - [ ] 💰只能充值领额度 30 | #### 扩展属性(多选) 31 | - [ ] 💪支持 Claude最新模型 32 | - [ ] ✌支持openai最新模型 33 | - [ ] 🎉支持其他模型或其他功能 34 | - [ ] 🌎需要国际网络 35 | - [ ] 🎁充值有较大优惠(<50%) 36 | - [ ] 🚀支持高并发 37 | - [ ] 😆签到领余额 38 | - [ ] 🚩网站通过中国备案 39 | 40 | ### 附加信息 41 | -------------------------------------------------------------------------------- /website/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["client/src/**/*", "shared/**/*", "server/**/*"], 3 | "exclude": ["node_modules", "build", "dist", "**/*.test.ts"], 4 | "compilerOptions": { 5 | "incremental": true, 6 | "tsBuildInfoFile": "./node_modules/typescript/tsbuildinfo", 7 | "noEmit": true, 8 | "module": "ESNext", 9 | "strict": true, 10 | "lib": ["esnext", "dom", "dom.iterable"], 11 | "jsx": "preserve", 12 | "esModuleInterop": true, 13 | "skipLibCheck": true, 14 | "allowImportingTsExtensions": true, 15 | "moduleResolution": "bundler", 16 | "baseUrl": ".", 17 | "types": ["node", "vite/client"], 18 | "paths": { 19 | "@/*": ["./client/src/*"], 20 | "@shared/*": ["./shared/*"] 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /website/client/src/components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Textarea = React.forwardRef< 6 | HTMLTextAreaElement, 7 | React.ComponentProps<"textarea"> 8 | >(({ className, ...props }, ref) => { 9 | return ( 10 |