16 lines
14 KiB
JSON
16 lines
14 KiB
JSON
{
|
|
"id": "web-static",
|
|
"name": "Web App (static only)",
|
|
"description": "A pure frontend static website with React and Vite, no backend server.",
|
|
"capabilities": [
|
|
"static"
|
|
],
|
|
"files": {
|
|
"package.json": "{\n \"name\": \"chk-admin-intranet\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"dev\": \"vite --host\",\n \"build\": \"vite build && esbuild server/index.ts --platform=node --packages=external --bundle --format=esm --outdir=dist\",\n \"start\": \"NODE_ENV=production node dist/index.js\",\n \"preview\": \"vite preview --host\",\n \"check\": \"tsc --noEmit\",\n \"format\": \"prettier --write .\"\n },\n \"dependencies\": {\n \"@hookform/resolvers\": \"^5.2.2\",\n \"@radix-ui/react-accordion\": \"^1.2.12\",\n \"@radix-ui/react-alert-dialog\": \"^1.1.15\",\n \"@radix-ui/react-aspect-ratio\": \"^1.1.7\",\n \"@radix-ui/react-avatar\": \"^1.1.10\",\n \"@radix-ui/react-checkbox\": \"^1.3.3\",\n \"@radix-ui/react-collapsible\": \"^1.1.12\",\n \"@radix-ui/react-context-menu\": \"^2.2.16\",\n \"@radix-ui/react-dialog\": \"^1.1.15\",\n \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n \"@radix-ui/react-hover-card\": \"^1.1.15\",\n \"@radix-ui/react-label\": \"^2.1.7\",\n \"@radix-ui/react-menubar\": \"^1.1.16\",\n \"@radix-ui/react-navigation-menu\": \"^1.2.14\",\n \"@radix-ui/react-popover\": \"^1.1.15\",\n \"@radix-ui/react-progress\": \"^1.1.7\",\n \"@radix-ui/react-radio-group\": \"^1.3.8\",\n \"@radix-ui/react-scroll-area\": \"^1.2.10\",\n \"@radix-ui/react-select\": \"^2.2.6\",\n \"@radix-ui/react-separator\": \"^1.1.7\",\n \"@radix-ui/react-slider\": \"^1.3.6\",\n \"@radix-ui/react-slot\": \"^1.2.3\",\n \"@radix-ui/react-switch\": \"^1.2.6\",\n \"@radix-ui/react-tabs\": \"^1.1.13\",\n \"@radix-ui/react-toggle\": \"^1.1.10\",\n \"@radix-ui/react-toggle-group\": \"^1.1.11\",\n \"@radix-ui/react-tooltip\": \"^1.2.8\",\n \"axios\": \"^1.12.0\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"cmdk\": \"^1.1.1\",\n \"embla-carousel-react\": \"^8.6.0\",\n \"express\": \"^4.21.2\",\n \"framer-motion\": \"^12.23.22\",\n \"input-otp\": \"^1.4.2\",\n \"lucide-react\": \"^0.453.0\",\n \"nanoid\": \"^5.1.5\",\n \"next-themes\": \"^0.4.6\",\n \"react\": \"^19.2.1\",\n \"react-day-picker\": \"^9.11.1\",\n \"react-dom\": \"^19.2.1\",\n \"react-hook-form\": \"^7.64.0\",\n \"react-resizable-panels\": \"^3.0.6\",\n \"recharts\": \"^2.15.2\",\n \"sonner\": \"^2.0.7\",\n \"streamdown\": \"^1.4.0\",\n \"tailwind-merge\": \"^3.3.1\",\n \"tailwindcss-animate\": \"^1.0.7\",\n \"vaul\": \"^1.1.2\",\n \"wouter\": \"^3.3.5\",\n \"zod\": \"^4.1.12\"\n },\n \"devDependencies\": {\n \"@builder.io/vite-plugin-jsx-loc\": \"^0.1.1\",\n \"@tailwindcss/typography\": \"^0.5.15\",\n \"@tailwindcss/vite\": \"^4.1.3\",\n \"@types/express\": \"4.17.21\",\n \"@types/google.maps\": \"^3.58.1\",\n \"@types/node\": \"^24.7.0\",\n \"@types/react\": \"^19.2.1\",\n \"@types/react-dom\": \"^19.2.1\",\n \"@vitejs/plugin-react\": \"^5.0.4\",\n \"add\": \"^2.0.6\",\n \"autoprefixer\": \"^10.4.20\",\n \"esbuild\": \"^0.25.0\",\n \"pnpm\": \"^10.15.1\",\n \"postcss\": \"^8.4.47\",\n \"prettier\": \"^3.6.2\",\n \"tailwindcss\": \"^4.1.14\",\n \"tsx\": \"^4.19.1\",\n \"tw-animate-css\": \"^1.4.0\",\n \"typescript\": \"5.6.3\",\n \"vite\": \"^7.1.7\",\n \"vite-plugin-manus-runtime\": \"^0.0.57\",\n \"vitest\": \"^2.1.4\"\n },\n \"packageManager\": \"pnpm@10.4.1+sha512.c753b6c3ad7afa13af388fa6d808035a008e30ea9993f58c6663e2bc5ff21679aa834db094987129aa4d488b86df57f7b634981b2f827cdcacc698cc0cfb88af\",\n \"pnpm\": {\n \"patchedDependencies\": {\n \"wouter@3.7.1\": \"patches/wouter@3.7.1.patch\"\n },\n \"overrides\": {\n \"tailwindcss>nanoid\": \"3.3.7\"\n }\n }\n}",
|
|
"client/src/App.tsx": "import { Toaster } from \"@/components/ui/sonner\";\nimport { TooltipProvider } from \"@/components/ui/tooltip\";\nimport NotFound from \"@/pages/NotFound\";\nimport { Route, Switch } from \"wouter\";\nimport ErrorBoundary from \"./components/ErrorBoundary\";\nimport { ThemeProvider } from \"./contexts/ThemeContext\";\nimport Home from \"./pages/Home\";\n\n\nfunction Router() {\n return (\n <Switch>\n <Route path={\"/\"} component={Home} />\n <Route path={\"/404\"} component={NotFound} />\n {/* Final fallback route */}\n <Route component={NotFound} />\n </Switch>\n );\n}\n\n// NOTE: About Theme\n// - First choose a default theme according to your design style (dark or light bg), than change color palette in index.css\n// to keep consistent foreground/background color across components\n// - If you want to make theme switchable, pass `switchable` ThemeProvider and use `useTheme` hook\n\nfunction App() {\n return (\n <ErrorBoundary>\n <ThemeProvider\n defaultTheme=\"light\"\n // switchable\n >\n <TooltipProvider>\n <Toaster />\n <Router />\n </TooltipProvider>\n </ThemeProvider>\n </ErrorBoundary>\n );\n}\n\nexport default App;",
|
|
"client/src/pages/Home.tsx": "import { Button } from \"@/components/ui/button\";\nimport { Loader2 } from \"lucide-react\";\nimport { Streamdown } from 'streamdown';\n\n/**\n * All content in this page are only for example, replace with your own feature implementation\n * When building pages, remember your instructions in Frontend Best Practices, Design Guide and Common Pitfalls\n */\nexport default function Home() {\n // If theme is switchable in App.tsx, we can implement theme toggling like this:\n // const { theme, toggleTheme } = useTheme();\n\n return (\n <div className=\"min-h-screen flex flex-col\">\n <main>\n {/* Example: lucide-react for icons */}\n <Loader2 className=\"animate-spin\" />\n Example Page\n {/* Example: Streamdown for markdown rendering */}\n <Streamdown>Any **markdown** content</Streamdown>\n <Button variant=\"default\">Example Button</Button>\n </main>\n </div>\n );\n}",
|
|
"client/src/index.css": "@import \"tailwindcss\";\n@import \"tw-animate-css\";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n --color-sidebar: var(--sidebar);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-ring: var(--sidebar-ring);\n}\n\n:root {\n --primary: var(--color-blue-700);\n --primary-foreground: var(--color-blue-50);\n --sidebar-primary: var(--color-blue-600);\n --sidebar-primary-foreground: var(--color-blue-50);\n --chart-1: var(--color-blue-300);\n --chart-2: var(--color-blue-500);\n --chart-3: var(--color-blue-600);\n --chart-4: var(--color-blue-700);\n --chart-5: var(--color-blue-800);\n --radius: 0.65rem;\n --background: oklch(1 0 0);\n --foreground: oklch(0.235 0.015 65);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.235 0.015 65);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.235 0.015 65);\n --secondary: oklch(0.98 0.001 286.375);\n --secondary-foreground: oklch(0.4 0.015 65);\n --muted: oklch(0.967 0.001 286.375);\n --muted-foreground: oklch(0.552 0.016 285.938);\n --accent: oklch(0.967 0.001 286.375);\n --accent-foreground: oklch(0.141 0.005 285.823);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.985 0 0);\n --border: oklch(0.92 0.004 286.32);\n --input: oklch(0.92 0.004 286.32);\n --ring: oklch(0.623 0.214 259.815);\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.235 0.015 65);\n --sidebar-accent: oklch(0.967 0.001 286.375);\n --sidebar-accent-foreground: oklch(0.141 0.005 285.823);\n --sidebar-border: oklch(0.92 0.004 286.32);\n --sidebar-ring: oklch(0.623 0.214 259.815);\n}\n\n.dark {\n --primary: var(--color-blue-700);\n --primary-foreground: var(--color-blue-50);\n --sidebar-primary: var(--color-blue-500);\n --sidebar-primary-foreground: var(--color-blue-50);\n --background: oklch(0.141 0.005 285.823);\n --foreground: oklch(0.85 0.005 65);\n --card: oklch(0.21 0.006 285.885);\n --card-foreground: oklch(0.85 0.005 65);\n --popover: oklch(0.21 0.006 285.885);\n --popover-foreground: oklch(0.85 0.005 65);\n --secondary: oklch(0.24 0.006 286.033);\n --secondary-foreground: oklch(0.7 0.005 65);\n --muted: oklch(0.274 0.006 286.033);\n --muted-foreground: oklch(0.705 0.015 286.067);\n --accent: oklch(0.274 0.006 286.033);\n --accent-foreground: oklch(0.92 0.005 65);\n --destructive: oklch(0.704 0.191 22.216);\n --destructive-foreground: oklch(0.985 0 0);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.488 0.243 264.376);\n --chart-1: var(--color-blue-300);\n --chart-2: var(--color-blue-500);\n --chart-3: var(--color-blue-600);\n --chart-4: var(--color-blue-700);\n --chart-5: var(--color-blue-800);\n --sidebar: oklch(0.21 0.006 285.885);\n --sidebar-foreground: oklch(0.85 0.005 65);\n --sidebar-accent: oklch(0.274 0.006 286.033);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(1 0 0 / 10%);\n --sidebar-ring: oklch(0.488 0.243 264.376);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground;\n }\n button:not(:disabled),\n [role=\"button\"]:not([aria-disabled=\"true\"]),\n [type=\"button\"]:not(:disabled),\n [type=\"submit\"]:not(:disabled),\n [type=\"reset\"]:not(:disabled),\n a[href],\n select:not(:disabled),\n input[type=\"checkbox\"]:not(:disabled),\n input[type=\"radio\"]:not(:disabled) {\n @apply cursor-pointer;\n }\n}\n\n@layer components {\n /**\n * Custom container utility that centers content and adds responsive padding.\n *\n * This overrides Tailwind's default container behavior to:\n * - Auto-center content (mx-auto)\n * - Add responsive horizontal padding\n * - Set max-width for large screens\n *\n * Usage: <div className=\"container\">...</div>\n *\n * For custom widths, use max-w-* utilities directly:\n * <div className=\"max-w-6xl mx-auto px-4\">...</div>\n */\n .container {\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n padding-left: 1rem; /* 16px - mobile padding */\n padding-right: 1rem;\n }\n\n .flex {\n min-height: 0;\n min-width: 0;\n }\n\n @media (min-width: 640px) {\n .container {\n padding-left: 1.5rem; /* 24px - tablet padding */\n padding-right: 1.5rem;\n }\n }\n\n @media (min-width: 1024px) {\n .container {\n padding-left: 2rem; /* 32px - desktop padding */\n padding-right: 2rem;\n max-width: 1280px; /* Standard content width */\n }\n }\n}",
|
|
"client/index.html": "<!doctype html>\n<html lang=\"en\">\n\n <head>\n <meta charset=\"UTF-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0, maximum-scale=1\" />\n <title>{{project_title}}</title> \n <!-- THIS IS THE START OF A COMMENT BLOCK, BLOCK TO BE DELETED: Google Fonts here, example:\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\" />\n THIS IS THE END OF A COMMENT BLOCK, BLOCK TO BE DELETED -->\n </head>\n\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n <script\n defer\n src=\"%VITE_ANALYTICS_ENDPOINT%/umami\"\n data-website-id=\"%VITE_ANALYTICS_WEBSITE_ID%\"></script>\n </body>\n\n</html>",
|
|
"server/index.ts": "import express from \"express\";\nimport { createServer } from \"http\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nasync function startServer() {\n const app = express();\n const server = createServer(app);\n\n // Serve static files from dist/public in production\n const staticPath =\n process.env.NODE_ENV === \"production\"\n ? path.resolve(__dirname, \"public\")\n : path.resolve(__dirname, \"..\", \"dist\", \"public\");\n\n app.use(express.static(staticPath));\n\n // Handle client-side routing - serve index.html for all routes\n app.get(\"*\", (_req, res) => {\n res.sendFile(path.join(staticPath, \"index.html\"));\n });\n\n const port = process.env.PORT || 3000;\n\n server.listen(port, () => {\n console.log(`Server running on http://localhost:${port}/`);\n });\n}\n\nstartServer().catch(console.error);"
|
|
}
|
|
}
|