tvi-cli 0.1.4
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.
- package/README.md +147 -0
- package/dist/index.js +4315 -0
- package/package.json +75 -0
- package/templates/addons/biome/biome.json.hbs +83 -0
- package/templates/addons/husky/.husky/pre-commit +1 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/apple-touch-icon.png +0 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/favicon-96x96.png +0 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/favicon.svg +6 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/site.webmanifest.hbs +21 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/web-app-manifest-192x192.png +0 -0
- package/templates/addons/pwa/apps/web/next/public/favicon/web-app-manifest-512x512.png +0 -0
- package/templates/addons/pwa/apps/web/next/src/app/manifest.ts.hbs +26 -0
- package/templates/addons/pwa/apps/web/vite/public/logo.png +0 -0
- package/templates/addons/pwa/apps/web/vite/pwa-assets.config.ts.hbs +12 -0
- package/templates/addons/turborepo/turbo.json.hbs +43 -0
- package/templates/api/orpc/native/utils/orpc.ts.hbs +35 -0
- package/templates/api/orpc/server/base/src/lib/context.ts.hbs +125 -0
- package/templates/api/orpc/server/base/src/lib/orpc.ts.hbs +21 -0
- package/templates/api/orpc/server/next/src/app/rpc/[...all]/route.ts.hbs +23 -0
- package/templates/api/orpc/web/nuxt/app/plugins/orpc.ts.hbs +35 -0
- package/templates/api/orpc/web/react/base/src/utils/orpc.ts.hbs +42 -0
- package/templates/api/orpc/web/solid/src/utils/orpc.ts.hbs +30 -0
- package/templates/api/orpc/web/svelte/src/lib/orpc.ts.hbs +31 -0
- package/templates/api/trpc/native/utils/trpc.ts.hbs +32 -0
- package/templates/api/trpc/server/base/src/lib/context.ts.hbs +127 -0
- package/templates/api/trpc/server/base/src/lib/trpc.ts.hbs +26 -0
- package/templates/api/trpc/server/next/src/app/trpc/[trpc]/route.ts +14 -0
- package/templates/api/trpc/web/react/base/src/utils/trpc.ts.hbs +97 -0
- package/templates/auth/native/native-base/lib/auth-client.ts.hbs +13 -0
- package/templates/auth/native/nativewind/app/(drawer)/index.tsx.hbs +95 -0
- package/templates/auth/native/nativewind/components/sign-in.tsx.hbs +93 -0
- package/templates/auth/native/nativewind/components/sign-up.tsx.hbs +104 -0
- package/templates/auth/native/unistyles/app/(drawer)/index.tsx.hbs +179 -0
- package/templates/auth/native/unistyles/components/sign-in.tsx.hbs +134 -0
- package/templates/auth/native/unistyles/components/sign-up.tsx.hbs +152 -0
- package/templates/auth/server/base/src/lib/auth.ts.hbs +141 -0
- package/templates/auth/server/db/drizzle/mysql/src/db/schema/auth.ts +58 -0
- package/templates/auth/server/db/drizzle/postgres/src/db/schema/auth.ts +47 -0
- package/templates/auth/server/db/drizzle/sqlite/src/db/schema/auth.ts +55 -0
- package/templates/auth/server/db/mongoose/mongodb/src/db/models/auth.model.ts +68 -0
- package/templates/auth/server/db/prisma/mongodb/prisma/schema/auth.prisma +59 -0
- package/templates/auth/server/db/prisma/mysql/prisma/schema/auth.prisma +59 -0
- package/templates/auth/server/db/prisma/postgres/prisma/schema/auth.prisma +59 -0
- package/templates/auth/server/db/prisma/sqlite/prisma/schema/auth.prisma +59 -0
- package/templates/auth/server/next/src/app/api/auth/[...all]/route.ts +4 -0
- package/templates/auth/web/nuxt/app/components/SignInForm.vue +77 -0
- package/templates/auth/web/nuxt/app/components/SignUpForm.vue +84 -0
- package/templates/auth/web/nuxt/app/components/UserMenu.vue +42 -0
- package/templates/auth/web/nuxt/app/middleware/auth.ts +12 -0
- package/templates/auth/web/nuxt/app/pages/dashboard.vue +27 -0
- package/templates/auth/web/nuxt/app/pages/login.vue +24 -0
- package/templates/auth/web/nuxt/app/plugins/auth-client.ts +16 -0
- package/templates/auth/web/react/base/src/lib/auth-client.ts.hbs +10 -0
- package/templates/auth/web/react/next/src/app/dashboard/page.tsx.hbs +47 -0
- package/templates/auth/web/react/next/src/app/login/page.tsx +16 -0
- package/templates/auth/web/react/next/src/components/sign-in-form.tsx +135 -0
- package/templates/auth/web/react/next/src/components/sign-up-form.tsx +160 -0
- package/templates/auth/web/react/next/src/components/theme-provider.tsx +11 -0
- package/templates/auth/web/react/next/src/components/user-menu.tsx +60 -0
- package/templates/auth/web/react/react-router/src/components/sign-in-form.tsx +135 -0
- package/templates/auth/web/react/react-router/src/components/sign-up-form.tsx +160 -0
- package/templates/auth/web/react/react-router/src/components/user-menu.tsx +60 -0
- package/templates/auth/web/react/react-router/src/routes/dashboard.tsx.hbs +40 -0
- package/templates/auth/web/react/react-router/src/routes/login.tsx +13 -0
- package/templates/auth/web/react/tanstack-router/src/components/sign-in-form.tsx +139 -0
- package/templates/auth/web/react/tanstack-router/src/components/sign-up-form.tsx +164 -0
- package/templates/auth/web/react/tanstack-router/src/components/user-menu.tsx +62 -0
- package/templates/auth/web/react/tanstack-router/src/routes/dashboard.tsx.hbs +47 -0
- package/templates/auth/web/react/tanstack-router/src/routes/login.tsx +18 -0
- package/templates/auth/web/react/tanstack-start/src/components/sign-in-form.tsx +139 -0
- package/templates/auth/web/react/tanstack-start/src/components/sign-up-form.tsx +164 -0
- package/templates/auth/web/react/tanstack-start/src/components/user-menu.tsx +62 -0
- package/templates/auth/web/react/tanstack-start/src/routes/dashboard.tsx.hbs +51 -0
- package/templates/auth/web/react/tanstack-start/src/routes/login.tsx +18 -0
- package/templates/auth/web/solid/src/components/sign-in-form.tsx +132 -0
- package/templates/auth/web/solid/src/components/sign-up-form.tsx +158 -0
- package/templates/auth/web/solid/src/components/user-menu.tsx.hbs +55 -0
- package/templates/auth/web/solid/src/lib/auth-client.ts +5 -0
- package/templates/auth/web/solid/src/routes/dashboard.tsx +38 -0
- package/templates/auth/web/solid/src/routes/login.tsx +23 -0
- package/templates/auth/web/svelte/src/components/SignInForm.svelte +108 -0
- package/templates/auth/web/svelte/src/components/SignUpForm.svelte +142 -0
- package/templates/auth/web/svelte/src/components/UserMenu.svelte +54 -0
- package/templates/auth/web/svelte/src/lib/auth-client.ts +6 -0
- package/templates/auth/web/svelte/src/routes/dashboard/+page.svelte +31 -0
- package/templates/auth/web/svelte/src/routes/login/+page.svelte +12 -0
- package/templates/backend/convex/packages/backend/_gitignore +2 -0
- package/templates/backend/convex/packages/backend/convex/README.md +90 -0
- package/templates/backend/convex/packages/backend/convex/healthCheck.ts +7 -0
- package/templates/backend/convex/packages/backend/convex/schema.ts +9 -0
- package/templates/backend/convex/packages/backend/convex/todos.ts +42 -0
- package/templates/backend/convex/packages/backend/convex/tsconfig.json +25 -0
- package/templates/backend/convex/packages/backend/package.json.hbs +17 -0
- package/templates/backend/server/elysia/src/index.ts.hbs +72 -0
- package/templates/backend/server/express/src/index.ts.hbs +88 -0
- package/templates/backend/server/fastify/src/index.ts.hbs +155 -0
- package/templates/backend/server/hono/src/index.ts.hbs +133 -0
- package/templates/backend/server/next/next-env.d.ts +5 -0
- package/templates/backend/server/next/next.config.ts +7 -0
- package/templates/backend/server/next/package.json.hbs +24 -0
- package/templates/backend/server/next/src/app/route.ts +5 -0
- package/templates/backend/server/next/src/middleware.ts +19 -0
- package/templates/backend/server/next/tsconfig.json.hbs +33 -0
- package/templates/backend/server/server-base/_gitignore +52 -0
- package/templates/backend/server/server-base/package.json.hbs +28 -0
- package/templates/backend/server/server-base/src/routers/index.ts.hbs +53 -0
- package/templates/backend/server/server-base/tsconfig.json.hbs +39 -0
- package/templates/base/_gitignore +2 -0
- package/templates/base/package.json.hbs +11 -0
- package/templates/db/drizzle/mysql/drizzle.config.ts.hbs +10 -0
- package/templates/db/drizzle/mysql/src/db/index.ts.hbs +20 -0
- package/templates/db/drizzle/postgres/drizzle.config.ts.hbs +10 -0
- package/templates/db/drizzle/postgres/src/db/index.ts.hbs +12 -0
- package/templates/db/drizzle/sqlite/drizzle.config.ts.hbs +24 -0
- package/templates/db/drizzle/sqlite/src/db/index.ts.hbs +35 -0
- package/templates/db/mongoose/mongodb/src/db/index.ts.hbs +9 -0
- package/templates/db/prisma/mongodb/prisma/index.ts.hbs +5 -0
- package/templates/db/prisma/mongodb/prisma/schema/schema.prisma +10 -0
- package/templates/db/prisma/mongodb/prisma.config.ts.hbs +8 -0
- package/templates/db/prisma/mysql/prisma/index.ts +5 -0
- package/templates/db/prisma/mysql/prisma/schema/schema.prisma +10 -0
- package/templates/db/prisma/mysql/prisma.config.ts +8 -0
- package/templates/db/prisma/postgres/prisma/index.ts +5 -0
- package/templates/db/prisma/postgres/prisma/schema/schema.prisma.hbs +13 -0
- package/templates/db/prisma/postgres/prisma.config.ts.hbs +12 -0
- package/templates/db/prisma/sqlite/prisma/index.ts +5 -0
- package/templates/db/prisma/sqlite/prisma/schema/schema.prisma +10 -0
- package/templates/db/prisma/sqlite/prisma.config.ts +8 -0
- package/templates/examples/ai/native/nativewind/app/(drawer)/ai.tsx.hbs +155 -0
- package/templates/examples/ai/native/nativewind/polyfills.js +25 -0
- package/templates/examples/ai/native/unistyles/app/(drawer)/ai.tsx.hbs +279 -0
- package/templates/examples/ai/native/unistyles/polyfills.js +25 -0
- package/templates/examples/ai/server/next/src/app/ai/route.ts +15 -0
- package/templates/examples/ai/web/nuxt/app/pages/ai.vue +63 -0
- package/templates/examples/ai/web/react/next/src/app/ai/page.tsx +67 -0
- package/templates/examples/ai/web/react/react-router/src/routes/ai.tsx +64 -0
- package/templates/examples/ai/web/react/tanstack-router/src/routes/ai.tsx +69 -0
- package/templates/examples/ai/web/react/tanstack-start/src/routes/ai.tsx +69 -0
- package/templates/examples/ai/web/svelte/src/routes/ai/+page.svelte +98 -0
- package/templates/examples/todo/native/nativewind/app/(drawer)/todos.tsx.hbs +295 -0
- package/templates/examples/todo/native/unistyles/app/(drawer)/todos.tsx.hbs +340 -0
- package/templates/examples/todo/server/drizzle/base/src/routers/todo.ts.hbs +79 -0
- package/templates/examples/todo/server/drizzle/mysql/src/db/schema/todo.ts +7 -0
- package/templates/examples/todo/server/drizzle/postgres/src/db/schema/todo.ts +7 -0
- package/templates/examples/todo/server/drizzle/sqlite/src/db/schema/todo.ts +7 -0
- package/templates/examples/todo/server/mongoose/base/src/routers/todo.ts.hbs +66 -0
- package/templates/examples/todo/server/mongoose/mongodb/src/db/models/todo.model.ts +24 -0
- package/templates/examples/todo/server/prisma/base/src/routers/todo.ts.hbs +118 -0
- package/templates/examples/todo/server/prisma/mongodb/prisma/schema/todo.prisma +7 -0
- package/templates/examples/todo/server/prisma/mysql/prisma/schema/todo.prisma +7 -0
- package/templates/examples/todo/server/prisma/postgres/prisma/schema/todo.prisma +7 -0
- package/templates/examples/todo/server/prisma/sqlite/prisma/schema/todo.prisma +7 -0
- package/templates/examples/todo/web/nuxt/app/pages/todos.vue +108 -0
- package/templates/examples/todo/web/react/next/src/app/todos/page.tsx.hbs +245 -0
- package/templates/examples/todo/web/react/react-router/src/routes/todos.tsx.hbs +242 -0
- package/templates/examples/todo/web/react/tanstack-router/src/routes/todos.tsx.hbs +247 -0
- package/templates/examples/todo/web/react/tanstack-start/src/routes/todos.tsx.hbs +268 -0
- package/templates/examples/todo/web/solid/src/routes/todos.tsx.hbs +132 -0
- package/templates/examples/todo/web/svelte/src/routes/todos/+page.svelte.hbs +317 -0
- package/templates/extras/_npmrc.hbs +5 -0
- package/templates/extras/pnpm-workspace.yaml +3 -0
- package/templates/frontend/native/native-base/assets/adaptive-icon.png +0 -0
- package/templates/frontend/native/native-base/assets/favicon.png +0 -0
- package/templates/frontend/native/native-base/assets/icon.png +0 -0
- package/templates/frontend/native/native-base/assets/splash.png +0 -0
- package/templates/frontend/native/nativewind/_gitignore +25 -0
- package/templates/frontend/native/nativewind/app/(drawer)/(tabs)/_layout.tsx +46 -0
- package/templates/frontend/native/nativewind/app/(drawer)/(tabs)/index.tsx +19 -0
- package/templates/frontend/native/nativewind/app/(drawer)/(tabs)/two.tsx +19 -0
- package/templates/frontend/native/nativewind/app/(drawer)/_layout.tsx.hbs +67 -0
- package/templates/frontend/native/nativewind/app/(drawer)/index.tsx.hbs +95 -0
- package/templates/frontend/native/nativewind/app/+html.tsx +47 -0
- package/templates/frontend/native/nativewind/app/+not-found.tsx +29 -0
- package/templates/frontend/native/nativewind/app/_layout.tsx.hbs +126 -0
- package/templates/frontend/native/nativewind/app/modal.tsx +14 -0
- package/templates/frontend/native/nativewind/app-env.d.ts +2 -0
- package/templates/frontend/native/nativewind/app.json +46 -0
- package/templates/frontend/native/nativewind/babel.config.js +11 -0
- package/templates/frontend/native/nativewind/components/container.tsx +8 -0
- package/templates/frontend/native/nativewind/components/header-button.tsx +26 -0
- package/templates/frontend/native/nativewind/components/tabbar-icon.tsx +8 -0
- package/templates/frontend/native/nativewind/global.css +50 -0
- package/templates/frontend/native/nativewind/lib/android-navigation-bar.tsx +11 -0
- package/templates/frontend/native/nativewind/lib/constants.ts +18 -0
- package/templates/frontend/native/nativewind/lib/use-color-scheme.ts +12 -0
- package/templates/frontend/native/nativewind/metro.config.js +59 -0
- package/templates/frontend/native/nativewind/package.json.hbs +49 -0
- package/templates/frontend/native/nativewind/tailwind.config.js +59 -0
- package/templates/frontend/native/nativewind/tsconfig.json.hbs +23 -0
- package/templates/frontend/native/unistyles/_gitignore +24 -0
- package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/_layout.tsx +39 -0
- package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/index.tsx +37 -0
- package/templates/frontend/native/unistyles/app/(drawer)/(tabs)/two.tsx +37 -0
- package/templates/frontend/native/unistyles/app/(drawer)/_layout.tsx.hbs +87 -0
- package/templates/frontend/native/unistyles/app/(drawer)/index.tsx.hbs +194 -0
- package/templates/frontend/native/unistyles/app/+html.tsx +48 -0
- package/templates/frontend/native/unistyles/app/+not-found.tsx +65 -0
- package/templates/frontend/native/unistyles/app/_layout.tsx.hbs +104 -0
- package/templates/frontend/native/unistyles/app/modal.tsx +33 -0
- package/templates/frontend/native/unistyles/app.json +44 -0
- package/templates/frontend/native/unistyles/babel.config.js +20 -0
- package/templates/frontend/native/unistyles/breakpoints.ts +9 -0
- package/templates/frontend/native/unistyles/components/container.tsx +15 -0
- package/templates/frontend/native/unistyles/components/header-button.tsx +36 -0
- package/templates/frontend/native/unistyles/components/tabbar-icon.tsx +8 -0
- package/templates/frontend/native/unistyles/expo-env.d.ts +3 -0
- package/templates/frontend/native/unistyles/index.js +2 -0
- package/templates/frontend/native/unistyles/metro.config.js +20 -0
- package/templates/frontend/native/unistyles/package.json.hbs +50 -0
- package/templates/frontend/native/unistyles/theme.ts +98 -0
- package/templates/frontend/native/unistyles/tsconfig.json.hbs +17 -0
- package/templates/frontend/native/unistyles/unistyles.ts +27 -0
- package/templates/frontend/nuxt/_gitignore +24 -0
- package/templates/frontend/nuxt/app/app.config.ts +15 -0
- package/templates/frontend/nuxt/app/app.vue +13 -0
- package/templates/frontend/nuxt/app/assets/css/main.css +2 -0
- package/templates/frontend/nuxt/app/components/Header.vue.hbs +45 -0
- package/templates/frontend/nuxt/app/components/Loader.vue +5 -0
- package/templates/frontend/nuxt/app/components/ModeToggle.vue +23 -0
- package/templates/frontend/nuxt/app/layouts/default.vue.hbs +11 -0
- package/templates/frontend/nuxt/app/pages/index.vue.hbs +57 -0
- package/templates/frontend/nuxt/app/plugins/vue-query.ts.hbs +44 -0
- package/templates/frontend/nuxt/nuxt.config.ts.hbs +19 -0
- package/templates/frontend/nuxt/package.json.hbs +25 -0
- package/templates/frontend/nuxt/public/favicon.ico +0 -0
- package/templates/frontend/nuxt/public/robots.txt +2 -0
- package/templates/frontend/nuxt/server/tsconfig.json +3 -0
- package/templates/frontend/nuxt/tsconfig.json.hbs +9 -0
- package/templates/frontend/react/next/next-env.d.ts.hbs +5 -0
- package/templates/frontend/react/next/next.config.ts.hbs +5 -0
- package/templates/frontend/react/next/package.json.hbs +34 -0
- package/templates/frontend/react/next/postcss.config.mjs.hbs +5 -0
- package/templates/frontend/react/next/src/app/favicon.ico +0 -0
- package/templates/frontend/react/next/src/app/layout.tsx.hbs +41 -0
- package/templates/frontend/react/next/src/app/page.tsx.hbs +68 -0
- package/templates/frontend/react/next/src/components/mode-toggle.tsx.hbs +39 -0
- package/templates/frontend/react/next/src/components/providers.tsx.hbs +56 -0
- package/templates/frontend/react/next/src/components/theme-provider.tsx.hbs +11 -0
- package/templates/frontend/react/next/tsconfig.json.hbs +33 -0
- package/templates/frontend/react/react-router/package.json.hbs +42 -0
- package/templates/frontend/react/react-router/public/favicon.ico +0 -0
- package/templates/frontend/react/react-router/react-router.config.ts +6 -0
- package/templates/frontend/react/react-router/src/components/mode-toggle.tsx +37 -0
- package/templates/frontend/react/react-router/src/components/theme-provider.tsx +73 -0
- package/templates/frontend/react/react-router/src/root.tsx.hbs +152 -0
- package/templates/frontend/react/react-router/src/routes/_index.tsx.hbs +74 -0
- package/templates/frontend/react/react-router/src/routes.ts +4 -0
- package/templates/frontend/react/react-router/tsconfig.json.hbs +32 -0
- package/templates/frontend/react/react-router/vite.config.ts.hbs +33 -0
- package/templates/frontend/react/tanstack-router/index.html +12 -0
- package/templates/frontend/react/tanstack-router/package.json.hbs +41 -0
- package/templates/frontend/react/tanstack-router/src/components/mode-toggle.tsx +37 -0
- package/templates/frontend/react/tanstack-router/src/components/theme-provider.tsx +73 -0
- package/templates/frontend/react/tanstack-router/src/main.tsx.hbs +66 -0
- package/templates/frontend/react/tanstack-router/src/routes/__root.tsx.hbs +100 -0
- package/templates/frontend/react/tanstack-router/src/routes/index.tsx.hbs +74 -0
- package/templates/frontend/react/tanstack-router/tsconfig.json.hbs +23 -0
- package/templates/frontend/react/tanstack-router/vite.config.ts.hbs +39 -0
- package/templates/frontend/react/tanstack-start/package.json.hbs +44 -0
- package/templates/frontend/react/tanstack-start/public/robots.txt +3 -0
- package/templates/frontend/react/tanstack-start/src/router.tsx.hbs +144 -0
- package/templates/frontend/react/tanstack-start/src/routes/__root.tsx.hbs +97 -0
- package/templates/frontend/react/tanstack-start/src/routes/index.tsx.hbs +74 -0
- package/templates/frontend/react/tanstack-start/tsconfig.json.hbs +33 -0
- package/templates/frontend/react/tanstack-start/vite.config.ts +8 -0
- package/templates/frontend/react/web-base/_gitignore +52 -0
- package/templates/frontend/react/web-base/components.json +21 -0
- package/templates/frontend/react/web-base/src/components/header.tsx.hbs +79 -0
- package/templates/frontend/react/web-base/src/components/loader.tsx +9 -0
- package/templates/frontend/react/web-base/src/components/ui/button.tsx +59 -0
- package/templates/frontend/react/web-base/src/components/ui/card.tsx +92 -0
- package/templates/frontend/react/web-base/src/components/ui/checkbox.tsx +30 -0
- package/templates/frontend/react/web-base/src/components/ui/dropdown-menu.tsx +257 -0
- package/templates/frontend/react/web-base/src/components/ui/input.tsx +21 -0
- package/templates/frontend/react/web-base/src/components/ui/label.tsx +22 -0
- package/templates/frontend/react/web-base/src/components/ui/skeleton.tsx +13 -0
- package/templates/frontend/react/web-base/src/components/ui/sonner.tsx +25 -0
- package/templates/frontend/react/web-base/src/index.css +134 -0
- package/templates/frontend/react/web-base/src/lib/utils.ts +6 -0
- package/templates/frontend/solid/_gitignore +7 -0
- package/templates/frontend/solid/index.html +13 -0
- package/templates/frontend/solid/package.json.hbs +27 -0
- package/templates/frontend/solid/public/robots.txt +3 -0
- package/templates/frontend/solid/src/components/header.tsx.hbs +38 -0
- package/templates/frontend/solid/src/components/loader.tsx +9 -0
- package/templates/frontend/solid/src/main.tsx.hbs +38 -0
- package/templates/frontend/solid/src/routes/__root.tsx.hbs +34 -0
- package/templates/frontend/solid/src/routes/index.tsx.hbs +61 -0
- package/templates/frontend/solid/src/styles.css +5 -0
- package/templates/frontend/solid/tsconfig.json.hbs +34 -0
- package/templates/frontend/solid/vite.config.js.hbs +39 -0
- package/templates/frontend/svelte/_gitignore +23 -0
- package/templates/frontend/svelte/_npmrc +1 -0
- package/templates/frontend/svelte/package.json.hbs +31 -0
- package/templates/frontend/svelte/src/app.css +5 -0
- package/templates/frontend/svelte/src/app.d.ts +13 -0
- package/templates/frontend/svelte/src/app.html +12 -0
- package/templates/frontend/svelte/src/components/Header.svelte.hbs +40 -0
- package/templates/frontend/svelte/src/lib/index.ts +1 -0
- package/templates/frontend/svelte/src/routes/+layout.svelte.hbs +54 -0
- package/templates/frontend/svelte/src/routes/+page.svelte.hbs +72 -0
- package/templates/frontend/svelte/static/favicon.png +0 -0
- package/templates/frontend/svelte/svelte.config.js +18 -0
- package/templates/frontend/svelte/tsconfig.json.hbs +24 -0
- package/templates/frontend/svelte/vite.config.ts +7 -0
- package/templates/runtime/workers/apps/server/wrangler.jsonc.hbs +34 -0
@@ -0,0 +1,257 @@
|
|
1
|
+
"use client"
|
2
|
+
|
3
|
+
import * as React from "react"
|
4
|
+
import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"
|
5
|
+
import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
|
6
|
+
|
7
|
+
import { cn } from "@/lib/utils"
|
8
|
+
|
9
|
+
function DropdownMenu({
|
10
|
+
...props
|
11
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
|
12
|
+
return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />
|
13
|
+
}
|
14
|
+
|
15
|
+
function DropdownMenuPortal({
|
16
|
+
...props
|
17
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
|
18
|
+
return (
|
19
|
+
<DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
|
20
|
+
)
|
21
|
+
}
|
22
|
+
|
23
|
+
function DropdownMenuTrigger({
|
24
|
+
...props
|
25
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
|
26
|
+
return (
|
27
|
+
<DropdownMenuPrimitive.Trigger
|
28
|
+
data-slot="dropdown-menu-trigger"
|
29
|
+
{...props}
|
30
|
+
/>
|
31
|
+
)
|
32
|
+
}
|
33
|
+
|
34
|
+
function DropdownMenuContent({
|
35
|
+
className,
|
36
|
+
sideOffset = 4,
|
37
|
+
...props
|
38
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
|
39
|
+
return (
|
40
|
+
<DropdownMenuPrimitive.Portal>
|
41
|
+
<DropdownMenuPrimitive.Content
|
42
|
+
data-slot="dropdown-menu-content"
|
43
|
+
sideOffset={sideOffset}
|
44
|
+
className={cn(
|
45
|
+
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
|
46
|
+
className
|
47
|
+
)}
|
48
|
+
{...props}
|
49
|
+
/>
|
50
|
+
</DropdownMenuPrimitive.Portal>
|
51
|
+
)
|
52
|
+
}
|
53
|
+
|
54
|
+
function DropdownMenuGroup({
|
55
|
+
...props
|
56
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
|
57
|
+
return (
|
58
|
+
<DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
|
59
|
+
)
|
60
|
+
}
|
61
|
+
|
62
|
+
function DropdownMenuItem({
|
63
|
+
className,
|
64
|
+
inset,
|
65
|
+
variant = "default",
|
66
|
+
...props
|
67
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
|
68
|
+
inset?: boolean
|
69
|
+
variant?: "default" | "destructive"
|
70
|
+
}) {
|
71
|
+
return (
|
72
|
+
<DropdownMenuPrimitive.Item
|
73
|
+
data-slot="dropdown-menu-item"
|
74
|
+
data-inset={inset}
|
75
|
+
data-variant={variant}
|
76
|
+
className={cn(
|
77
|
+
"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
78
|
+
className
|
79
|
+
)}
|
80
|
+
{...props}
|
81
|
+
/>
|
82
|
+
)
|
83
|
+
}
|
84
|
+
|
85
|
+
function DropdownMenuCheckboxItem({
|
86
|
+
className,
|
87
|
+
children,
|
88
|
+
checked,
|
89
|
+
...props
|
90
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
|
91
|
+
return (
|
92
|
+
<DropdownMenuPrimitive.CheckboxItem
|
93
|
+
data-slot="dropdown-menu-checkbox-item"
|
94
|
+
className={cn(
|
95
|
+
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
96
|
+
className
|
97
|
+
)}
|
98
|
+
checked={checked}
|
99
|
+
{...props}
|
100
|
+
>
|
101
|
+
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
|
102
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
103
|
+
<CheckIcon className="size-4" />
|
104
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
105
|
+
</span>
|
106
|
+
{children}
|
107
|
+
</DropdownMenuPrimitive.CheckboxItem>
|
108
|
+
)
|
109
|
+
}
|
110
|
+
|
111
|
+
function DropdownMenuRadioGroup({
|
112
|
+
...props
|
113
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
|
114
|
+
return (
|
115
|
+
<DropdownMenuPrimitive.RadioGroup
|
116
|
+
data-slot="dropdown-menu-radio-group"
|
117
|
+
{...props}
|
118
|
+
/>
|
119
|
+
)
|
120
|
+
}
|
121
|
+
|
122
|
+
function DropdownMenuRadioItem({
|
123
|
+
className,
|
124
|
+
children,
|
125
|
+
...props
|
126
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
|
127
|
+
return (
|
128
|
+
<DropdownMenuPrimitive.RadioItem
|
129
|
+
data-slot="dropdown-menu-radio-item"
|
130
|
+
className={cn(
|
131
|
+
"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
132
|
+
className
|
133
|
+
)}
|
134
|
+
{...props}
|
135
|
+
>
|
136
|
+
<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
|
137
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
138
|
+
<CircleIcon className="size-2 fill-current" />
|
139
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
140
|
+
</span>
|
141
|
+
{children}
|
142
|
+
</DropdownMenuPrimitive.RadioItem>
|
143
|
+
)
|
144
|
+
}
|
145
|
+
|
146
|
+
function DropdownMenuLabel({
|
147
|
+
className,
|
148
|
+
inset,
|
149
|
+
...props
|
150
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
|
151
|
+
inset?: boolean
|
152
|
+
}) {
|
153
|
+
return (
|
154
|
+
<DropdownMenuPrimitive.Label
|
155
|
+
data-slot="dropdown-menu-label"
|
156
|
+
data-inset={inset}
|
157
|
+
className={cn(
|
158
|
+
"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
|
159
|
+
className
|
160
|
+
)}
|
161
|
+
{...props}
|
162
|
+
/>
|
163
|
+
)
|
164
|
+
}
|
165
|
+
|
166
|
+
function DropdownMenuSeparator({
|
167
|
+
className,
|
168
|
+
...props
|
169
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
|
170
|
+
return (
|
171
|
+
<DropdownMenuPrimitive.Separator
|
172
|
+
data-slot="dropdown-menu-separator"
|
173
|
+
className={cn("bg-border -mx-1 my-1 h-px", className)}
|
174
|
+
{...props}
|
175
|
+
/>
|
176
|
+
)
|
177
|
+
}
|
178
|
+
|
179
|
+
function DropdownMenuShortcut({
|
180
|
+
className,
|
181
|
+
...props
|
182
|
+
}: React.ComponentProps<"span">) {
|
183
|
+
return (
|
184
|
+
<span
|
185
|
+
data-slot="dropdown-menu-shortcut"
|
186
|
+
className={cn(
|
187
|
+
"text-muted-foreground ml-auto text-xs tracking-widest",
|
188
|
+
className
|
189
|
+
)}
|
190
|
+
{...props}
|
191
|
+
/>
|
192
|
+
)
|
193
|
+
}
|
194
|
+
|
195
|
+
function DropdownMenuSub({
|
196
|
+
...props
|
197
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
|
198
|
+
return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
|
199
|
+
}
|
200
|
+
|
201
|
+
function DropdownMenuSubTrigger({
|
202
|
+
className,
|
203
|
+
inset,
|
204
|
+
children,
|
205
|
+
...props
|
206
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
|
207
|
+
inset?: boolean
|
208
|
+
}) {
|
209
|
+
return (
|
210
|
+
<DropdownMenuPrimitive.SubTrigger
|
211
|
+
data-slot="dropdown-menu-sub-trigger"
|
212
|
+
data-inset={inset}
|
213
|
+
className={cn(
|
214
|
+
"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8",
|
215
|
+
className
|
216
|
+
)}
|
217
|
+
{...props}
|
218
|
+
>
|
219
|
+
{children}
|
220
|
+
<ChevronRightIcon className="ml-auto size-4" />
|
221
|
+
</DropdownMenuPrimitive.SubTrigger>
|
222
|
+
)
|
223
|
+
}
|
224
|
+
|
225
|
+
function DropdownMenuSubContent({
|
226
|
+
className,
|
227
|
+
...props
|
228
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
|
229
|
+
return (
|
230
|
+
<DropdownMenuPrimitive.SubContent
|
231
|
+
data-slot="dropdown-menu-sub-content"
|
232
|
+
className={cn(
|
233
|
+
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
|
234
|
+
className
|
235
|
+
)}
|
236
|
+
{...props}
|
237
|
+
/>
|
238
|
+
)
|
239
|
+
}
|
240
|
+
|
241
|
+
export {
|
242
|
+
DropdownMenu,
|
243
|
+
DropdownMenuPortal,
|
244
|
+
DropdownMenuTrigger,
|
245
|
+
DropdownMenuContent,
|
246
|
+
DropdownMenuGroup,
|
247
|
+
DropdownMenuLabel,
|
248
|
+
DropdownMenuItem,
|
249
|
+
DropdownMenuCheckboxItem,
|
250
|
+
DropdownMenuRadioGroup,
|
251
|
+
DropdownMenuRadioItem,
|
252
|
+
DropdownMenuSeparator,
|
253
|
+
DropdownMenuShortcut,
|
254
|
+
DropdownMenuSub,
|
255
|
+
DropdownMenuSubTrigger,
|
256
|
+
DropdownMenuSubContent,
|
257
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import * as React from "react"
|
2
|
+
|
3
|
+
import { cn } from "@/lib/utils"
|
4
|
+
|
5
|
+
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
6
|
+
return (
|
7
|
+
<input
|
8
|
+
type={type}
|
9
|
+
data-slot="input"
|
10
|
+
className={cn(
|
11
|
+
"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
12
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
13
|
+
"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
|
14
|
+
className
|
15
|
+
)}
|
16
|
+
{...props}
|
17
|
+
/>
|
18
|
+
)
|
19
|
+
}
|
20
|
+
|
21
|
+
export { Input }
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import * as React from "react"
|
2
|
+
import { Label as LabelPrimitive } from "radix-ui"
|
3
|
+
|
4
|
+
import { cn } from "@/lib/utils"
|
5
|
+
|
6
|
+
function Label({
|
7
|
+
className,
|
8
|
+
...props
|
9
|
+
}: React.ComponentProps<typeof LabelPrimitive.Root>) {
|
10
|
+
return (
|
11
|
+
<LabelPrimitive.Root
|
12
|
+
data-slot="label"
|
13
|
+
className={cn(
|
14
|
+
"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
|
15
|
+
className
|
16
|
+
)}
|
17
|
+
{...props}
|
18
|
+
/>
|
19
|
+
)
|
20
|
+
}
|
21
|
+
|
22
|
+
export { Label }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { cn } from "@/lib/utils"
|
2
|
+
|
3
|
+
function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
|
4
|
+
return (
|
5
|
+
<div
|
6
|
+
data-slot="skeleton"
|
7
|
+
className={cn("bg-accent animate-pulse rounded-md", className)}
|
8
|
+
{...props}
|
9
|
+
/>
|
10
|
+
)
|
11
|
+
}
|
12
|
+
|
13
|
+
export { Skeleton }
|
@@ -0,0 +1,25 @@
|
|
1
|
+
"use client";
|
2
|
+
|
3
|
+
import { useTheme } from "next-themes";
|
4
|
+
import { Toaster as Sonner, type ToasterProps } from "sonner";
|
5
|
+
|
6
|
+
const Toaster = ({ ...props }: ToasterProps) => {
|
7
|
+
const { theme = "system" } = useTheme();
|
8
|
+
|
9
|
+
return (
|
10
|
+
<Sonner
|
11
|
+
theme={theme as ToasterProps["theme"]}
|
12
|
+
className="toaster group"
|
13
|
+
style={
|
14
|
+
{
|
15
|
+
"--normal-bg": "var(--popover)",
|
16
|
+
"--normal-text": "var(--popover-foreground)",
|
17
|
+
"--normal-border": "var(--border)",
|
18
|
+
} as React.CSSProperties
|
19
|
+
}
|
20
|
+
{...props}
|
21
|
+
/>
|
22
|
+
);
|
23
|
+
};
|
24
|
+
|
25
|
+
export { Toaster };
|
@@ -0,0 +1,134 @@
|
|
1
|
+
@import "tailwindcss";
|
2
|
+
@import "tw-animate-css";
|
3
|
+
|
4
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
5
|
+
|
6
|
+
@theme {
|
7
|
+
--font-sans: "Inter", "Geist", ui-sans-serif, system-ui, sans-serif,
|
8
|
+
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
9
|
+
}
|
10
|
+
|
11
|
+
html,
|
12
|
+
body {
|
13
|
+
@apply bg-white dark:bg-gray-950;
|
14
|
+
|
15
|
+
@media (prefers-color-scheme: dark) {
|
16
|
+
color-scheme: dark;
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
:root {
|
21
|
+
--radius: 0.625rem;
|
22
|
+
--background: oklch(1 0 0);
|
23
|
+
--foreground: oklch(0.145 0 0);
|
24
|
+
--card: oklch(1 0 0);
|
25
|
+
--card-foreground: oklch(0.145 0 0);
|
26
|
+
--popover: oklch(1 0 0);
|
27
|
+
--popover-foreground: oklch(0.145 0 0);
|
28
|
+
--primary: oklch(0.205 0 0);
|
29
|
+
--primary-foreground: oklch(0.985 0 0);
|
30
|
+
--secondary: oklch(0.97 0 0);
|
31
|
+
--secondary-foreground: oklch(0.205 0 0);
|
32
|
+
--muted: oklch(0.97 0 0);
|
33
|
+
--muted-foreground: oklch(0.556 0 0);
|
34
|
+
--accent: oklch(0.97 0 0);
|
35
|
+
--accent-foreground: oklch(0.205 0 0);
|
36
|
+
--destructive: oklch(0.577 0.245 27.325);
|
37
|
+
--border: oklch(0.922 0 0);
|
38
|
+
--input: oklch(0.922 0 0);
|
39
|
+
--ring: oklch(0.708 0 0);
|
40
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
41
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
42
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
43
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
44
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
45
|
+
--sidebar: oklch(0.985 0 0);
|
46
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
47
|
+
--sidebar-primary: oklch(0.205 0 0);
|
48
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
49
|
+
--sidebar-accent: oklch(0.97 0 0);
|
50
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
51
|
+
--sidebar-border: oklch(0.922 0 0);
|
52
|
+
--sidebar-ring: oklch(0.708 0 0);
|
53
|
+
}
|
54
|
+
|
55
|
+
.dark {
|
56
|
+
--background: oklch(0.145 0 0);
|
57
|
+
--foreground: oklch(0.985 0 0);
|
58
|
+
--card: oklch(0.205 0 0);
|
59
|
+
--card-foreground: oklch(0.985 0 0);
|
60
|
+
--popover: oklch(0.205 0 0);
|
61
|
+
--popover-foreground: oklch(0.985 0 0);
|
62
|
+
--primary: oklch(0.922 0 0);
|
63
|
+
--primary-foreground: oklch(0.205 0 0);
|
64
|
+
--secondary: oklch(0.269 0 0);
|
65
|
+
--secondary-foreground: oklch(0.985 0 0);
|
66
|
+
--muted: oklch(0.269 0 0);
|
67
|
+
--muted-foreground: oklch(0.708 0 0);
|
68
|
+
--accent: oklch(0.269 0 0);
|
69
|
+
--accent-foreground: oklch(0.985 0 0);
|
70
|
+
--destructive: oklch(0.704 0.191 22.216);
|
71
|
+
--border: oklch(1 0 0 / 10%);
|
72
|
+
--input: oklch(1 0 0 / 15%);
|
73
|
+
--ring: oklch(0.556 0 0);
|
74
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
75
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
76
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
77
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
78
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
79
|
+
--sidebar: oklch(0.205 0 0);
|
80
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
81
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
82
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
83
|
+
--sidebar-accent: oklch(0.269 0 0);
|
84
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
85
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
86
|
+
--sidebar-ring: oklch(0.556 0 0);
|
87
|
+
}
|
88
|
+
|
89
|
+
@theme inline {
|
90
|
+
--radius-sm: calc(var(--radius) - 4px);
|
91
|
+
--radius-md: calc(var(--radius) - 2px);
|
92
|
+
--radius-lg: var(--radius);
|
93
|
+
--radius-xl: calc(var(--radius) + 4px);
|
94
|
+
--color-background: var(--background);
|
95
|
+
--color-foreground: var(--foreground);
|
96
|
+
--color-card: var(--card);
|
97
|
+
--color-card-foreground: var(--card-foreground);
|
98
|
+
--color-popover: var(--popover);
|
99
|
+
--color-popover-foreground: var(--popover-foreground);
|
100
|
+
--color-primary: var(--primary);
|
101
|
+
--color-primary-foreground: var(--primary-foreground);
|
102
|
+
--color-secondary: var(--secondary);
|
103
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
104
|
+
--color-muted: var(--muted);
|
105
|
+
--color-muted-foreground: var(--muted-foreground);
|
106
|
+
--color-accent: var(--accent);
|
107
|
+
--color-accent-foreground: var(--accent-foreground);
|
108
|
+
--color-destructive: var(--destructive);
|
109
|
+
--color-border: var(--border);
|
110
|
+
--color-input: var(--input);
|
111
|
+
--color-ring: var(--ring);
|
112
|
+
--color-chart-1: var(--chart-1);
|
113
|
+
--color-chart-2: var(--chart-2);
|
114
|
+
--color-chart-3: var(--chart-3);
|
115
|
+
--color-chart-4: var(--chart-4);
|
116
|
+
--color-chart-5: var(--chart-5);
|
117
|
+
--color-sidebar: var(--sidebar);
|
118
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
119
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
120
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
121
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
122
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
123
|
+
--color-sidebar-border: var(--sidebar-border);
|
124
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
125
|
+
}
|
126
|
+
|
127
|
+
@layer base {
|
128
|
+
* {
|
129
|
+
@apply border-border outline-ring/50;
|
130
|
+
}
|
131
|
+
body {
|
132
|
+
@apply bg-background text-foreground;
|
133
|
+
}
|
134
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
6
|
+
<link rel="icon" href="/favicon.ico" />
|
7
|
+
<meta name="theme-color" content="#000000" />
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<div id="app"></div>
|
11
|
+
<script type="module" src="/src/main.tsx"></script>
|
12
|
+
</body>
|
13
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
{
|
2
|
+
"name": "web",
|
3
|
+
"private": true,
|
4
|
+
"type": "module",
|
5
|
+
"scripts": {
|
6
|
+
"dev": "vite --port 3001",
|
7
|
+
"build": "vite build && tsc",
|
8
|
+
"serve": "vite preview",
|
9
|
+
"test": "vitest run"
|
10
|
+
},
|
11
|
+
"dependencies": {
|
12
|
+
"@tailwindcss/vite": "^4.0.6",
|
13
|
+
"@tanstack/router-plugin": "^1.109.2",
|
14
|
+
"@tanstack/solid-form": "^1.9.0",
|
15
|
+
"@tanstack/solid-router": "^1.110.0",
|
16
|
+
"@tanstack/solid-router-devtools": "^1.109.2",
|
17
|
+
"lucide-solid": "^0.507.0",
|
18
|
+
"solid-js": "^1.9.4",
|
19
|
+
"tailwindcss": "^4.0.6",
|
20
|
+
"zod": "^3.25.16"
|
21
|
+
},
|
22
|
+
"devDependencies": {
|
23
|
+
"typescript": "^5.7.2",
|
24
|
+
"vite": "^6.0.11",
|
25
|
+
"vite-plugin-solid": "^2.11.2"
|
26
|
+
}
|
27
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import { Link } from "@tanstack/solid-router";
|
2
|
+
{{#if auth}}
|
3
|
+
import UserMenu from "./user-menu";
|
4
|
+
{{/if}}
|
5
|
+
import { For } from "solid-js";
|
6
|
+
|
7
|
+
export default function Header() {
|
8
|
+
const links = [
|
9
|
+
{ to: "/", label: "Home" },
|
10
|
+
{{#if auth}}
|
11
|
+
{ to: "/dashboard", label: "Dashboard" },
|
12
|
+
{{/if}}
|
13
|
+
{{#if (includes examples "todo")}}
|
14
|
+
{ to: "/todos", label: "Todos" },
|
15
|
+
{{/if}}
|
16
|
+
{{#if (includes examples "ai")}}
|
17
|
+
{ to: "/ai", label: "AI Chat" },
|
18
|
+
{{/if}}
|
19
|
+
];
|
20
|
+
|
21
|
+
return (
|
22
|
+
<div>
|
23
|
+
<div class="flex flex-row items-center justify-between px-2 py-1">
|
24
|
+
<nav class="flex gap-4 text-lg">
|
25
|
+
<For each={links}>
|
26
|
+
{(link) => <Link to={link.to}>{link.label}</Link>}
|
27
|
+
</For>
|
28
|
+
</nav>
|
29
|
+
<div class="flex items-center gap-2">
|
30
|
+
{{#if auth}}
|
31
|
+
<UserMenu />
|
32
|
+
{{/if}}
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
<hr />
|
36
|
+
</div>
|
37
|
+
);
|
38
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import { RouterProvider, createRouter } from "@tanstack/solid-router";
|
2
|
+
import { render } from "solid-js/web";
|
3
|
+
import { routeTree } from "./routeTree.gen";
|
4
|
+
import "./styles.css";
|
5
|
+
{{#if (eq api "orpc")}}
|
6
|
+
import { QueryClientProvider } from "@tanstack/solid-query";
|
7
|
+
import { queryClient } from "./utils/orpc";
|
8
|
+
{{/if}}
|
9
|
+
|
10
|
+
const router = createRouter({
|
11
|
+
routeTree,
|
12
|
+
defaultPreload: "intent",
|
13
|
+
scrollRestoration: true,
|
14
|
+
defaultPreloadStaleTime: 0,
|
15
|
+
});
|
16
|
+
|
17
|
+
declare module "@tanstack/solid-router" {
|
18
|
+
interface Register {
|
19
|
+
router: typeof router;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
function App() {
|
24
|
+
return (
|
25
|
+
{{#if (eq api "orpc")}}
|
26
|
+
<QueryClientProvider client={queryClient}>
|
27
|
+
{{/if}}
|
28
|
+
<RouterProvider router={router} />
|
29
|
+
{{#if (eq api "orpc")}}
|
30
|
+
</QueryClientProvider>
|
31
|
+
{{/if}}
|
32
|
+
);
|
33
|
+
}
|
34
|
+
|
35
|
+
const rootElement = document.getElementById("app");
|
36
|
+
if (rootElement) {
|
37
|
+
render(() => <App />, rootElement);
|
38
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import Header from "@/components/header";
|
2
|
+
import { Outlet, createRootRouteWithContext } from "@tanstack/solid-router";
|
3
|
+
import { TanStackRouterDevtools } from "@tanstack/solid-router-devtools";
|
4
|
+
{{#if (eq api "orpc")}}
|
5
|
+
import { SolidQueryDevtools } from "@tanstack/solid-query-devtools";
|
6
|
+
import type { QueryClient } from "@tanstack/solid-query";
|
7
|
+
import type { orpc } from "../utils/orpc";
|
8
|
+
|
9
|
+
export interface RouterContext {
|
10
|
+
orpc: typeof orpc;
|
11
|
+
queryClient: QueryClient;
|
12
|
+
}
|
13
|
+
{{else}}
|
14
|
+
export interface RouterContext {}
|
15
|
+
{{/if}}
|
16
|
+
|
17
|
+
export const Route = createRootRouteWithContext<RouterContext>()({
|
18
|
+
component: RootComponent,
|
19
|
+
});
|
20
|
+
|
21
|
+
function RootComponent() {
|
22
|
+
return (
|
23
|
+
<>
|
24
|
+
<div class="grid grid-rows-[auto_1fr] h-svh">
|
25
|
+
<Header />
|
26
|
+
<Outlet />
|
27
|
+
</div>
|
28
|
+
{{#if (eq api "orpc")}}
|
29
|
+
<SolidQueryDevtools />
|
30
|
+
{{/if}}
|
31
|
+
<TanStackRouterDevtools />
|
32
|
+
</>
|
33
|
+
);
|
34
|
+
}
|