create-newt-app 0.33.2 → 0.34.0

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["root","packageJson","gitignore","dockerignore","npmrc","turboJson","pnpmWorkspace","readme","env","envExample","agentsMd","claudeMd","web","packageJson","gitignore","readme","nextConfig","postcssConfig","tsconfig","layout","page","providers","authForm","authRoute","authClient","manifest","api","packageJson","nestCli","tsconfig","tsconfigBuild","appModule","appService","appServiceSpec","readme","packageJson","srcIndex","tsconfig","tsconfig","srcSchema","srcMigrate","scriptsNewMigration","migrationsReadme","packageJsonSqlite","srcIndexSqlite","packageJsonPostgres","srcIndexPostgres","ui","packageJson","button","link","logo","utils","globalsCss","postcssConfig","tsconfig","packageJson","utils","useMobile","globalsCss","postcssConfig","tsconfig","link","logo","layout","page","providers","authForm","accordion","alertDialog","alert","aspectRatio","avatar","badge","breadcrumb","button","calendar","card","carousel","chart","checkbox","collapsible","command","combobox","contextMenu","dialog","direction","drawer","dropdownMenu","empty","field","hoverCard","buttonGroup","inputGroup","item","kbd","nativeSelect","spinner","inputOtp","input","label","menubar","navigationMenu","pagination","popover","progress","radioGroup","resizable","scrollArea","select","separator","sheet","sidebar","skeleton","slider","sonner","switchComp","table","tabs","textarea","toggleGroup","toggle","tooltip","modeToggle","attachment","bubble","marker","message","messageScroller","componentsJson","webComponentsJson","packageJson","tokens","button","link","logo","globalsCss","tsconfig","webPackageJson","webPackageJsonDi","babelConfig","postcssConfig","layout","page","authForm","root","packageJson","base","next","reactInternal","webConfig","apiConfig","uiConfig","prettierrc","oxlintrc","oxfmtrc","pluginPackageJson","pluginReadme","packageJson","base","nextjs","reactLibrary","jestConfig","jestE2eConfig","e2eSpec","nestjsBetterAuthMock","vitestConfig","vitestConfigE2e","e2eSpec","dockerfile","dockerCompose","nextConfig","turboJson","apiPackageJson","webNextConfig","apiPackageJson","apiTsconfig","apiIndex","webNestContext","webHelloRoute","webPackageJson","webNextConfig","webTsconfig","webNextConfig","webHelloRoute","dockerfile","dockerCompose","nextConfig","appController","appControllerSpec","appModule","main","todosModule","todosService","todosServiceSpec","dbSchema","dbMigrationTodos","todosController","todosModuleControllers","appModuleControllers","webTodosRoute","webTodosIdRoute","webTodosToggleRoute","appModuleDi","apiIndex","webTodoList","webPage","shadcnTodoList","shadcnPage","stylexTodoList","stylexPage","deploymentSpa","web","nestDiOnlyModule","root","api","ui","pkg.version","pkg.version"],"sources":["../package.json","../src/templates/root/templates/package-json.ts","../src/templates/root/templates/gitignore.ts","../src/templates/root/templates/dockerignore.ts","../src/templates/root/templates/npmrc.ts","../src/templates/root/templates/turbo-json.ts","../src/templates/root/templates/pnpm-workspace.ts","../src/templates/root/templates/readme.ts","../src/templates/root/templates/env.ts","../src/templates/root/templates/env-example.ts","../src/templates/root/templates/agents-md.ts","../src/templates/root/templates/claude-md.ts","../src/templates/root/index.ts","../src/templates/web/templates/package-json.ts","../src/templates/web/templates/gitignore.ts","../src/templates/web/templates/readme.ts","../src/templates/web/templates/next-config.ts","../src/templates/web/templates/postcss-config.ts","../src/templates/web/templates/tsconfig.ts","../src/templates/web/templates/layout.ts","../src/templates/web/templates/page.ts","../src/templates/web/templates/providers.ts","../src/templates/web/templates/auth-form.ts","../src/templates/web/templates/auth-route.ts","../src/templates/web/templates/auth-client.ts","../src/templates/web/templates/manifest.ts","../src/templates/web/index.ts","../src/templates/api/templates/package-json.ts","../src/templates/api/templates/nest-cli.ts","../src/templates/api/templates/tsconfig.ts","../src/templates/api/templates/tsconfig-build.ts","../src/templates/api/templates/app-module.ts","../src/templates/api/templates/app-service.ts","../src/templates/api/templates/app-service-spec.ts","../src/templates/api/templates/readme.ts","../src/templates/api/index.ts","../src/templates/auth/templates/package-json.ts","../src/templates/auth/templates/src-index.ts","../src/templates/auth/templates/tsconfig.ts","../src/templates/auth/index.ts","../src/templates/db/templates/tsconfig.ts","../src/templates/db/templates/src-schema.ts","../src/templates/db/templates/src-migrate.ts","../src/templates/db/templates/scripts-new-migration.ts","../src/templates/db/templates/migrations-readme.ts","../src/templates/db/templates/package-json-sqlite.ts","../src/templates/db/templates/package-json-postgres.ts","../src/templates/db/templates/src-index-sqlite.ts","../src/templates/db/templates/src-index-postgres.ts","../src/templates/db/index.ts","../src/templates/ui/templates/package-json.ts","../src/templates/ui/templates/button.ts","../src/templates/ui/templates/link.ts","../src/templates/ui/templates/logo.ts","../src/templates/ui/templates/utils.ts","../src/templates/ui/templates/globals-css.ts","../src/templates/ui/templates/postcss-config.ts","../src/templates/ui/templates/tsconfig.ts","../src/templates/ui/index.ts","../src/templates/versions.ts","../src/templates/shadcn-ui/templates/components-json.ts","../src/templates/shadcn-ui/templates/web-components-json.ts","../src/templates/shadcn-ui/templates/package-json.ts","../src/templates/shadcn-ui/templates/utils.ts","../src/templates/shadcn-ui/templates/use-mobile.ts","../src/templates/shadcn-ui/templates/globals-css.ts","../src/templates/shadcn-ui/templates/postcss-config.ts","../src/templates/shadcn-ui/templates/tsconfig.ts","../src/templates/shadcn-ui/templates/link.ts","../src/templates/shadcn-ui/templates/logo.ts","../src/templates/shadcn-ui/templates/layout.ts","../src/templates/shadcn-ui/templates/page.ts","../src/templates/shadcn-ui/templates/providers.ts","../src/templates/shadcn-ui/templates/auth-form.ts","../src/templates/shadcn-ui/templates/accordion.ts","../src/templates/shadcn-ui/templates/alert-dialog.ts","../src/templates/shadcn-ui/templates/alert.ts","../src/templates/shadcn-ui/templates/aspect-ratio.ts","../src/templates/shadcn-ui/templates/avatar.ts","../src/templates/shadcn-ui/templates/badge.ts","../src/templates/shadcn-ui/templates/breadcrumb.ts","../src/templates/shadcn-ui/templates/button.ts","../src/templates/shadcn-ui/templates/calendar.ts","../src/templates/shadcn-ui/templates/card.ts","../src/templates/shadcn-ui/templates/carousel.ts","../src/templates/shadcn-ui/templates/chart.ts","../src/templates/shadcn-ui/templates/checkbox.ts","../src/templates/shadcn-ui/templates/collapsible.ts","../src/templates/shadcn-ui/templates/command.ts","../src/templates/shadcn-ui/templates/combobox.ts","../src/templates/shadcn-ui/templates/context-menu.ts","../src/templates/shadcn-ui/templates/dialog.ts","../src/templates/shadcn-ui/templates/direction.ts","../src/templates/shadcn-ui/templates/drawer.ts","../src/templates/shadcn-ui/templates/dropdown-menu.ts","../src/templates/shadcn-ui/templates/empty.ts","../src/templates/shadcn-ui/templates/field.ts","../src/templates/shadcn-ui/templates/hover-card.ts","../src/templates/shadcn-ui/templates/button-group.ts","../src/templates/shadcn-ui/templates/input-group.ts","../src/templates/shadcn-ui/templates/item.ts","../src/templates/shadcn-ui/templates/kbd.ts","../src/templates/shadcn-ui/templates/native-select.ts","../src/templates/shadcn-ui/templates/spinner.ts","../src/templates/shadcn-ui/templates/input-otp.ts","../src/templates/shadcn-ui/templates/input.ts","../src/templates/shadcn-ui/templates/label.ts","../src/templates/shadcn-ui/templates/menubar.ts","../src/templates/shadcn-ui/templates/navigation-menu.ts","../src/templates/shadcn-ui/templates/pagination.ts","../src/templates/shadcn-ui/templates/popover.ts","../src/templates/shadcn-ui/templates/progress.ts","../src/templates/shadcn-ui/templates/radio-group.ts","../src/templates/shadcn-ui/templates/resizable.ts","../src/templates/shadcn-ui/templates/scroll-area.ts","../src/templates/shadcn-ui/templates/select.ts","../src/templates/shadcn-ui/templates/separator.ts","../src/templates/shadcn-ui/templates/sheet.ts","../src/templates/shadcn-ui/templates/sidebar.ts","../src/templates/shadcn-ui/templates/skeleton.ts","../src/templates/shadcn-ui/templates/slider.ts","../src/templates/shadcn-ui/templates/sonner.ts","../src/templates/shadcn-ui/templates/switch.ts","../src/templates/shadcn-ui/templates/table.ts","../src/templates/shadcn-ui/templates/tabs.ts","../src/templates/shadcn-ui/templates/textarea.ts","../src/templates/shadcn-ui/templates/toggle-group.ts","../src/templates/shadcn-ui/templates/toggle.ts","../src/templates/shadcn-ui/templates/tooltip.ts","../src/templates/shadcn-ui/templates/mode-toggle.ts","../src/templates/shadcn-ui/templates/attachment.ts","../src/templates/shadcn-ui/templates/bubble.ts","../src/templates/shadcn-ui/templates/marker.ts","../src/templates/shadcn-ui/templates/message.ts","../src/templates/shadcn-ui/templates/message-scroller.ts","../src/templates/shadcn-ui/index.ts","../src/templates/stylex-ui/templates/package-json.ts","../src/templates/stylex-ui/templates/tokens.ts","../src/templates/stylex-ui/templates/button.ts","../src/templates/stylex-ui/templates/link.ts","../src/templates/stylex-ui/templates/logo.ts","../src/templates/stylex-ui/templates/globals-css.ts","../src/templates/stylex-ui/templates/web-package-json.ts","../src/templates/stylex-ui/templates/web-package-json-di.ts","../src/templates/stylex-ui/templates/babel-config.ts","../src/templates/stylex-ui/templates/postcss-config.ts","../src/templates/stylex-ui/templates/layout.ts","../src/templates/stylex-ui/templates/page.ts","../src/templates/stylex-ui/templates/auth-form.ts","../src/templates/stylex-ui/index.ts","../src/templates/eslint-config/templates/package-json.ts","../src/templates/eslint-config/templates/base.ts","../src/templates/eslint-config/templates/next.ts","../src/templates/eslint-config/templates/react-internal.ts","../src/templates/web/templates/eslint-config.ts","../src/templates/api/templates/eslint-config.ts","../src/templates/ui/templates/eslint-config.ts","../src/templates/root/templates/prettierrc.ts","../src/templates/eslint-config/index.ts","../src/templates/oxc/templates/oxlintrc.ts","../src/templates/oxc/templates/oxfmtrc.ts","../src/templates/oxc/index.ts","../src/templates/anti-slop/templates/plugin-package-json.ts","../src/templates/anti-slop/templates/plugin-readme.ts","../src/templates/anti-slop/index.ts","../src/templates/typescript-config/templates/package-json.ts","../src/templates/typescript-config/templates/base.ts","../src/templates/typescript-config/templates/nextjs.ts","../src/templates/typescript-config/templates/react-library.ts","../src/templates/typescript-config/index.ts","../src/templates/testing-jest/templates/jest-config.ts","../src/templates/testing-jest/templates/jest-e2e-config.ts","../src/templates/testing-jest/templates/e2e-spec.ts","../src/templates/testing-jest/templates/nestjs-better-auth-mock.ts","../src/templates/testing-jest/index.ts","../src/templates/testing-vitest/templates/vitest-config.ts","../src/templates/testing-vitest/templates/vitest-config-e2e.ts","../src/templates/testing-vitest/templates/e2e-spec.ts","../src/templates/testing-vitest/index.ts","../src/templates/deployment-standalone/templates/dockerfile.ts","../src/templates/deployment-standalone/templates/docker-compose.ts","../src/templates/deployment-standalone/templates/next-config.ts","../src/templates/deployment-standalone/templates/turbo-json.ts","../src/templates/deployment-standalone/index.ts","../src/templates/single-process-static-export/templates/api-package-json.ts","../src/templates/single-process-static-export/templates/web-next-config.ts","../src/templates/single-process-static-export/index.ts","../src/templates/nest-di-only/templates/api-package-json.ts","../src/templates/nest-di-only/templates/api-tsconfig.ts","../src/templates/nest-di-only/templates/api-index.ts","../src/templates/nest-di-only/templates/web-nest-context.ts","../src/templates/nest-di-only/templates/web-package-json.ts","../src/templates/nest-di-only/templates/web-next-config.ts","../src/templates/nest-di-only/templates/web-tsconfig.ts","../src/templates/nest-di-only/templates/web-hello-route.ts","../src/templates/nest-di-only/index.ts","../src/templates/nest-off/templates/web-next-config.ts","../src/templates/nest-off/templates/web-hello-route.ts","../src/templates/nest-off/index.ts","../src/templates/deployment-standalone-web/templates/dockerfile.ts","../src/templates/deployment-standalone-web/templates/docker-compose.ts","../src/templates/deployment-standalone-web/templates/next-config.ts","../src/templates/deployment-standalone-web/index.ts","../src/templates/api-controllers/templates/app-controller.ts","../src/templates/api-controllers/templates/app-controller-spec.ts","../src/templates/api-controllers/templates/app-module.ts","../src/templates/api/templates/main.ts","../src/templates/api-controllers/index.ts","../src/templates/todo-example/templates/todos-module.ts","../src/templates/todo-example/templates/todos-service.ts","../src/templates/todo-example/templates/todos-service-spec.ts","../src/templates/todo-example/templates/db-schema.ts","../src/templates/todo-example/templates/db-migration-todos.ts","../src/templates/todo-example/templates/todos-controller.ts","../src/templates/todo-example/templates/todos-module-controllers.ts","../src/templates/todo-example/templates/app-module-controllers.ts","../src/templates/todo-example/templates/app-module-di.ts","../src/templates/todo-example/templates/api-index.ts","../src/templates/todo-example/templates/web-todos-route.ts","../src/templates/todo-example/templates/web-todos-id-route.ts","../src/templates/todo-example/templates/web-todos-toggle-route.ts","../src/templates/todo-example/templates/web-todo-list.ts","../src/templates/todo-example/templates/web-page.ts","../src/templates/todo-example/templates/shadcn-todo-list.ts","../src/templates/todo-example/templates/shadcn-page.ts","../src/templates/todo-example/templates/stylex-todo-list.ts","../src/templates/todo-example/templates/stylex-page.ts","../src/templates/todo-example/index.ts","../src/templates/index.ts","../src/utils.ts","../src/tasks.ts","../src/telemetry.ts","../src/index.ts"],"sourcesContent":["","export default {\n filename: \"package.json\",\n template: `{\n \"name\": \"<%= projectName %>\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"turbo run build\",\n \"dev\": \"turbo run dev\",\n \"lint\": \"turbo run lint\",\n \"test\": \"turbo run test\",\n \"typecheck\": \"turbo run typecheck\",\n \"db:make\": \"pnpm --filter @<%= projectName %>/db run make\",\n \"db:migrate\": \"turbo run migrate\",\n \"db:generate\": \"turbo run generate\"\n },\n \"devDependencies\": {\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"turbo\": \"<%= versions.turbo %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n },\n \"packageManager\": \"pnpm@11.25.0\",\n \"engines\": {\n \"node\": \">=24.0.0\"\n }\n}`,\n};\n","export default {\n filename: \".gitignore\",\n template: `# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# Dependencies\nnode_modules\n.pnp\n.pnp.js\n\n# Local env files\n.env\ndev.db*\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# Testing\ncoverage\n\n# Turbo\n.turbo\n\n# Vercel\n.vercel\n\n# Build Outputs\n.next/\nout/\nbuild\ndist\n\n\n# Debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Misc\n.DS_Store\n*.pem`,\n};\n","export default {\n filename: \".dockerignore\",\n template: `node_modules\n.next\ndist\n.turbo\n*.log\n.env\n.env.*\n!.env.example\ndev.db*\n.git\ncoverage`,\n};\n","export default {\n filename: \".npmrc\",\n template: ``,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment !== \"standalone\",\n filename: \"turbo.json\",\n template: `{\n \"$schema\": \"https://turborepo.dev/schema.json\",\n \"ui\": \"tui\",\n \"tasks\": {\n \"build\": {\n \"env\": [\"DATABASE_URL\"],\n \"dependsOn\": [\"^build\"],\n \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n \"outputs\": [\".next/**\", \"!.next/cache/**\", \"dist/**\"]\n },\n \"typecheck\": {\n \"dependsOn\": [\"^build\"]\n },<% if (linter !== \"oxc\") { %>\n \"lint\": {\n \"dependsOn\": [\"^lint\"],\n \"env\": [\"NODE_ENV\"]\n },\n \"lint:check\": {\n \"dependsOn\": [\"^lint:check\"],\n \"env\": [\"NODE_ENV\"]\n },<% } %>\n \"test\": {\n \"dependsOn\": [\"^build\"]\n },\n \"dev\": {\n \"dependsOn\": [\"^migrate\"],\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false,\n \"persistent\": true\n },\n \"migrate\": {\n \"dependsOn\": [\"^migrate\"],\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false\n },\n \"generate\": {\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false\n }\n }\n}`,\n};\n","export default {\n filename: \"pnpm-workspace.yaml\",\n template: `packages:\n - \"apps/*\"\n - \"packages/*\"\n\nallowBuilds:\n \"@parcel/watcher\": true\n \"@swc/core\": true\n better-sqlite3: true\n esbuild: true\n sharp: true\n unrs-resolver: true`,\n};\n","export default {\n filename: \"README.md\",\n template: `# <%= projectName %>\n\nFull-stack monorepo: Next.js 16<% if (nest !== 'off') { %> + NestJS 11<% } %> + better-auth + <%= database === 'postgres' ? 'Postgres' : 'SQLite' %>.\n\n## Quick start\n\n\\`\\`\\`sh\n<% if (database === 'postgres') { %># set DATABASE_URL in .env to your Postgres database\n<% } %>pnpm install\npnpm dev\n\\`\\`\\`\n\nOpen [http://localhost:3000](http://localhost:3000).\n\n## Apps\n\n- **web**: Next.js frontend (port 3000)\n<% if (nest === 'on') { -%>\n- **api**: NestJS backend (port 3001)\n<% } else if (nest === 'di-only') { -%>\n- **api**: NestJS providers, resolved from the web process (no HTTP server)\n<% } -%>\n\n## Packages\n\n- **\\`@<%= projectName %>/auth\\`**: better-auth config\n- **\\`@<%= projectName %>/db\\`**: Kysely client and migrations\n- **\\`@<%= projectName %>/ui\\`**: shared React components\n<% if (linter === 'eslint') { -%>\n- **\\`@<%= projectName %>/eslint-config\\`**: shared ESLint config\n<% } -%>\n- **\\`@<%= projectName %>/typescript-config\\`**: shared tsconfig\n`,\n};\n","export default {\n filename: \".env\",\n template: `<% if (database === 'postgres') { %>DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres\n<% } else { %># Local SQLite database, written to dev.db at the repo root\n<% } %>BETTER_AUTH_URL=http://localhost:3000\nBETTER_AUTH_SECRET=<%= authSecret %>\n`,\n};\n","export default {\n filename: \".env.example\",\n template: `<% if (database === 'postgres') { %>DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres\n<% } else { %># Local SQLite database, written to dev.db at the repo root\n<% } %>BETTER_AUTH_URL=http://localhost:3000\nBETTER_AUTH_SECRET=generate-with-openssl-rand-base64-32\n`,\n};\n","export default {\n filename: \"AGENTS.md\",\n template: `<!-- BEGIN:nextjs-agent-rules -->\n# This is NOT the Next.js you know\n\nThis version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in \\`node_modules/next/dist/docs/\\` before writing any code. Heed deprecation notices.\n<!-- END:nextjs-agent-rules -->`,\n};\n","export default {\n filename: \"CLAUDE.md\",\n template: `@AGENTS.md`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport gitignore from \"./templates/gitignore\";\nimport dockerignore from \"./templates/dockerignore\";\nimport npmrc from \"./templates/npmrc\";\nimport turboJson from \"./templates/turbo-json\";\nimport pnpmWorkspace from \"./templates/pnpm-workspace\";\nimport readme from \"./templates/readme\";\nimport env from \"./templates/env\";\nimport envExample from \"./templates/env-example\";\nimport agentsMd from \"./templates/agents-md\";\nimport claudeMd from \"./templates/claude-md\";\n\nconst root: Module = {\n templates: [\n packageJson,\n gitignore,\n dockerignore,\n npmrc,\n turboJson,\n pnpmWorkspace,\n readme,\n env,\n envExample,\n agentsMd,\n claudeMd,\n ],\n};\n\nexport default root;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"di-only\" && !s.stylex,\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\",\n \"typecheck\": \"next typegen && tsc --noEmit\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/web/.gitignore\",\n template: `# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n.yarn/install-state.gz\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# env files (can opt-in for commiting if needed)\n.env*\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts`,\n};\n","export default {\n filename: \"apps/web/README.md\",\n template: `This is a [Next.js](https://nextjs.org) project bootstrapped with [\\`create-next-app\\`](https://nextjs.org/docs/app/api-reference/create-next-app).\n\n## Getting Started\n\nFirst, run the development server:\n\n\\`\\`\\`bash\nnpm run dev\n# or\nyarn dev\n# or\npnpm dev\n# or\nbun dev\n\\`\\`\\`\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying \\`app/page.tsx\\`. The page auto-updates as you edit the file.\n\nThis project uses [\\`next/font\\`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load Inter, a custom Google Font.\n\n## Learn More\n\nTo learn more about Next.js, take a look at the following resources:\n\n- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.\n- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.\n\nYou can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!\n\n## Deploy on Vercel\n\nThe easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.\n\nCheck out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment === \"none\" && s.nest === \"on\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n async rewrites() {\n return [\n {\n source: '/api/:path*',\n destination: 'http://localhost:3001/api/:path*',\n },\n ];\n },\n};\n\nexport default nextConfig;`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.stylex,\n filename: \"apps/web/postcss.config.mjs\",\n template: `export { default } from \"@<%= projectName %>/ui/postcss.config\";`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"di-only\",\n filename: \"apps/web/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/nextjs.json\",\n \"compilerOptions\": {\n \"plugins\": [\n {\n \"name\": \"next\"\n }\n ],\n \"strictNullChecks\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\n \"**/*.ts\",\n \"**/*.tsx\",\n \"next-env.d.ts\",\n \"next.config.js\",\n \".next/types/**/*.ts\"\n ],\n \"exclude\": [\"node_modules\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.shadcn && !s.stylex,\n filename: \"apps/web/app/layout.tsx\",\n template: `import type { Metadata } from \"next\";\nimport localFont from \"next/font/local\";\nimport Providers from \"@/app/providers\";\nimport \"@<%= projectName %>/ui/globals.css\";\n\nconst geistSans = localFont({\n src: \"./fonts/GeistVF.woff\",\n variable: \"--font-geist-sans\",\n});\nconst geistMono = localFont({\n src: \"./fonts/GeistMonoVF.woff\",\n variable: \"--font-geist-mono\",\n});\n\nexport const metadata: Metadata = {\n title: \"<%= projectName %>\",\n description: \"Next + Nest = Newt\",\n icons: {\n icon: [\n { url: \"/icon0.svg\", type: \"image/svg+xml\" },\n { url: \"/icon1.png\", type: \"image/png\" },\n ],\n apple: \"/apple-icon.png\",\n },\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\">\n <body className={\\`\\${geistSans.variable} \\${geistMono.variable} h-full\\`}>\n <Providers>{children}</Providers>\n </body>\n </html>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample && !s.shadcn && !s.stylex,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello'],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b\">\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto text-foreground\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">next.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">nest.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 border rounded-md p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"rounded-xl border p-6\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground mb-4\">better-auth</p>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <div className=\"space-y-3\">\n <p className=\"text-sm\">Signed in as {session.user.name}</p>\n <Button onClick={() => void authClient.signOut()}>\n Sign out\n </Button>\n </div>\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.shadcn,\n filename: \"apps/web/app/providers.tsx\",\n template: `'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useState } from 'react';\n\nexport default function Providers({ children }: { children: React.ReactNode }) {\n const [client] = useState(() => new QueryClient());\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>;\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.shadcn && !s.stylex,\n filename: \"apps/web/app/auth-form.tsx\",\n template: `'use client';\n\nimport { useForm } from '@tanstack/react-form';\nimport { useState } from 'react';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\n\nexport function AuthForm() {\n const [tab, setTab] = useState<'signin' | 'signup'>('signup');\n const [error, setError] = useState('');\n\n const form = useForm({\n defaultValues: { name: '', email: '', password: '' },\n onSubmit: async ({ value }) => {\n setError('');\n if (tab === 'signin') {\n const { error } = await authClient.signIn.email(value);\n if (error) setError(error.message ?? 'Sign in failed');\n } else {\n const { error } = await authClient.signUp.email(value);\n if (error) setError(error.message ?? 'Sign up failed');\n }\n },\n });\n\n return (\n <>\n <div className=\"flex gap-2 mb-6 text-sm\">\n <button\n onClick={() => setTab('signup')}\n className={\n tab === 'signup'\n ? 'font-semibold'\n : 'text-muted-foreground hover:text-gray-200'\n }\n >\n Sign up\n </button>\n <span className=\"text-gray-600\">|</span>\n <button\n onClick={() => setTab('signin')}\n className={\n tab === 'signin'\n ? 'font-semibold'\n : 'text-muted-foreground hover:text-gray-200'\n }\n >\n Sign in\n </button>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n {tab === 'signup' && (\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium\">Name</label>\n <input\n type=\"text\"\n autoComplete=\"name\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n className=\"flex h-9 w-full rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n </div>\n )}\n </form.Field>\n )}\n\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium\">Email</label>\n <input\n type=\"email\"\n autoComplete=\"email\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n className=\"flex h-9 w-full rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n </div>\n )}\n </form.Field>\n\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium\">Password</label>\n <input\n type=\"password\"\n autoComplete={\n tab === 'signin' ? 'current-password' : 'new-password'\n }\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n minLength={8}\n className=\"flex h-9 w-full rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n </div>\n )}\n </form.Field>\n\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting} className=\"w-full\">\n {isSubmitting\n ? 'Loading…'\n : tab === 'signin'\n ? 'Sign in'\n : 'Create account'}\n </Button>\n )}\n </form.Subscribe>\n </form>\n </>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/auth/[...all]/route.ts\",\n template: `import { auth } from \"@<%= projectName %>/auth\";\nimport { toNextJsHandler } from \"better-auth/next-js\";\n\nexport const { GET, POST } = toNextJsHandler(auth);`,\n};\n","export default {\n filename: \"apps/web/lib/auth-client.ts\",\n template: `import { createAuthClient } from \"better-auth/react\";\n\nexport const authClient: ReturnType<typeof createAuthClient> = createAuthClient();`,\n};\n","export default {\n filename: \"apps/web/app/manifest.json\",\n template: `{\n \"name\": \"<%= projectName %>\",\n \"short_name\": \"<%= projectName %>\",\n \"icons\": [\n {\n \"src\": \"/web-app-manifest-192x192.png\",\n \"sizes\": \"192x192\",\n \"type\": \"image/png\",\n \"purpose\": \"maskable\"\n },\n {\n \"src\": \"/web-app-manifest-512x512.png\",\n \"sizes\": \"512x512\",\n \"type\": \"image/png\",\n \"purpose\": \"maskable\"\n }\n ],\n \"theme_color\": \"#ffffff\",\n \"background_color\": \"#ffffff\",\n \"display\": \"standalone\"\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport gitignore from \"./templates/gitignore\";\nimport readme from \"./templates/readme\";\nimport nextConfig from \"./templates/next-config\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport tsconfig from \"./templates/tsconfig\";\nimport layout from \"./templates/layout\";\nimport page from \"./templates/page\";\nimport providers from \"./templates/providers\";\nimport authForm from \"./templates/auth-form\";\nimport authRoute from \"./templates/auth-route\";\nimport authClient from \"./templates/auth-client\";\nimport manifest from \"./templates/manifest\";\nconst web: Module = {\n templates: [\n packageJson,\n gitignore,\n readme,\n nextConfig,\n postcssConfig,\n tsconfig,\n layout,\n page,\n providers,\n authForm,\n authRoute,\n authClient,\n manifest,\n ],\n staticFiles: [\n {\n src: \"web/static/fonts/GeistVF.woff\",\n filename: \"apps/web/app/fonts/GeistVF.woff\",\n },\n {\n src: \"web/static/fonts/GeistMonoVF.woff\",\n filename: \"apps/web/app/fonts/GeistMonoVF.woff\",\n },\n { src: \"web/static/favicon.ico\", filename: \"apps/web/app/favicon.ico\" },\n { src: \"web/static/icon0.svg\", filename: \"apps/web/app/icon0.svg\" },\n { src: \"web/static/icon1.png\", filename: \"apps/web/app/icon1.png\" },\n {\n src: \"web/static/apple-icon.png\",\n filename: \"apps/web/app/apple-icon.png\",\n },\n {\n src: \"web/static/public/web-app-manifest-192x192.png\",\n filename: \"apps/web/public/web-app-manifest-192x192.png\",\n },\n {\n src: \"web/static/public/web-app-manifest-512x512.png\",\n filename: \"apps/web/public/web-app-manifest-512x512.png\",\n },\n ],\n};\n\nexport default web;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\" && s.deployment !== \"spa\",\n filename: \"apps/api/package.json\",\n template: `{\n \"name\": \"api\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"nest build\",\n \"typecheck\": \"tsc -p tsconfig.build.json --noEmit\",\n \"start\": \"nest start\",\n \"dev\": \"nest start --watch\",\n \"start:debug\": \"nest start --debug --watch\",\n \"start:prod\": \"node dist/main\"\n },\n \"dependencies\": {\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"@nestjs/platform-express\": \"<%= versions[\"@nestjs/platform-express\"] %>\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@thallesp/nestjs-better-auth\": \"<%= versions[\"@thallesp/nestjs-better-auth\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"rxjs\": \"<%= versions.rxjs %>\"\n },\n \"devDependencies\": {\n \"@nestjs/cli\": \"<%= versions[\"@nestjs/cli\"] %>\",\n \"@nestjs/schematics\": \"<%= versions[\"@nestjs/schematics\"] %>\",\n \"@nestjs/testing\": \"<%= versions[\"@nestjs/testing\"] %>\",\n \"@types/express\": \"<%= versions[\"@types/express\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/supertest\": \"<%= versions[\"@types/supertest\"] %>\",\n \"supertest\": \"<%= versions.supertest %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/api/nest-cli.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/nest-cli\",\n \"collection\": \"@nestjs/schematics\",\n \"sourceRoot\": \"src\",\n \"compilerOptions\": {\n \"deleteOutDir\": true\n }\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"apps/api/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"module\": \"nodenext\",\n \"moduleResolution\": \"nodenext\",\n \"resolvePackageJsonExports\": true,\n \"esModuleInterop\": true,\n \"isolatedModules\": true,\n \"declaration\": true,\n \"removeComments\": true,\n \"emitDecoratorMetadata\": true,\n \"experimentalDecorators\": true,\n \"allowSyntheticDefaultImports\": true,\n \"target\": \"ES2023\",\n \"sourceMap\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"skipLibCheck\": true,\n \"strictNullChecks\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noImplicitAny\": false,\n \"strictBindCallApply\": false,\n \"noFallthroughCasesInSwitch\": false,\n \"types\": [<% if (testing === 'jest') { %>\"jest\", <% } %><% if (testing === 'vitest') { %>\"vitest/globals\", <% } %>\"node\"]\n },\n \"exclude\": [\"vitest.config.mts\", \"vitest.config.e2e.mts\", \"node_modules\", \"dist\"]\n}`,\n};\n","export default {\n filename: \"apps/api/tsconfig.build.json\",\n template: `{\n \"extends\": \"./tsconfig.json\",\n \"exclude\": [\"node_modules\", \"test\", \"dist\", \"**/*spec.ts\", \"vitest.config.mts\", \"vitest.config.e2e.mts\", \"jest.config.ts\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\" && !s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Module({\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","export default {\n filename: \"apps/api/src/app.service.ts\",\n template: `import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello from Nest';\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/app.service.spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { AppService } from './app.service';\n\ndescribe('AppService', () => {\n let service: AppService;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [AppService],\n }).compile();\n\n service = module.get<AppService>(AppService);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n});`,\n};\n","export default {\n filename: \"apps/api/README.md\",\n template: `# API\n\nNestJS backend for the monorepo.\n\n## Scripts\n\n\\`\\`\\`sh\npnpm dev # watch mode\npnpm build # production build\npnpm test # unit tests<% if (nest === 'on') { %>\npnpm test:e2e # e2e tests<% } %>\n\\`\\`\\``,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport nestCli from \"./templates/nest-cli\";\nimport tsconfig from \"./templates/tsconfig\";\nimport tsconfigBuild from \"./templates/tsconfig-build\";\nimport appModule from \"./templates/app-module\";\nimport appService from \"./templates/app-service\";\nimport appServiceSpec from \"./templates/app-service-spec\";\nimport readme from \"./templates/readme\";\n\nconst api: Module = {\n templates: [\n packageJson,\n nestCli,\n tsconfig,\n tsconfigBuild,\n appModule,\n appService,\n appServiceSpec,\n readme,\n ],\n};\n\nexport default api;\n","export default {\n filename: \"packages/auth/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/auth\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"migrate\": \"dotenv -e ../../.env -- auth migrate -y --config src/index.ts\",\n \"generate\": \"dotenv -e ../../.env -- auth generate --config src/index.ts\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"auth\": \"<%= versions.auth %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"dotenv-cli\": \"<%= versions[\"dotenv-cli\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/auth/src/index.ts\",\n template: `import { betterAuth } from \"better-auth\";\nimport { driver } from \"@<%= projectName %>/db\";\n\nexport const auth = betterAuth({\n database: driver,\n emailAndPassword: { enabled: true },\n trustedOrigins: [process.env.BETTER_AUTH_URL ?? \"http://localhost:3000\"],\n});\n\nexport type Auth = typeof auth;`,\n};\n","export default {\n filename: \"packages/auth/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"erasableSyntaxOnly\": true,\n \"esModuleInterop\": true,\n \"lib\": [\"es2022\"],\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"noEmit\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\"\n },\n \"include\": [\"src\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport srcIndex from \"./templates/src-index\";\nimport tsconfig from \"./templates/tsconfig\";\n\nconst auth: Module = {\n templates: [packageJson, srcIndex, tsconfig],\n};\n\nexport default auth;\n","export default {\n filename: \"packages/db/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"erasableSyntaxOnly\": true,\n \"esModuleInterop\": true,\n \"lib\": [\"es2022\"],\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"noEmit\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\"\n },\n \"include\": [\"src\", \"scripts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"packages/db/src/schema.ts\",\n template: `<% const date = database === 'postgres' ? 'Date' : 'string'; const bool = database === 'postgres' ? 'boolean' : 'number'; -%>\nexport interface UserTable {\n id: string;\n name: string;\n email: string;\n emailVerified: <%= bool %>;\n image: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface SessionTable {\n id: string;\n expiresAt: <%= date %>;\n token: string;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n ipAddress: string | null;\n userAgent: string | null;\n userId: string;\n}\n\nexport interface AccountTable {\n id: string;\n issuer: string;\n accountId: string;\n providerId: string;\n userId: string;\n accessToken: string | null;\n refreshToken: string | null;\n idToken: string | null;\n accessTokenExpiresAt: <%= date %> | null;\n refreshTokenExpiresAt: <%= date %> | null;\n scope: string | null;\n password: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface VerificationTable {\n id: string;\n identifier: string;\n value: string;\n expiresAt: <%= date %>;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface DB {\n account: AccountTable;\n session: SessionTable;\n user: UserTable;\n verification: VerificationTable;\n}`,\n};\n","export default {\n filename: \"packages/db/src/migrate.ts\",\n template: `import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { FileMigrationProvider, Migrator } from \"kysely\";\nimport { db } from \"./index.js\";\n\nasync function main() {\n const migrator = new Migrator({\n db,\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(process.cwd(), \"src/migrations\"),\n }),\n });\n\n const { error, results } = await migrator.migrateToLatest();\n\n for (const it of results ?? []) {\n if (it.status === \"Success\") {\n console.log(\"applied \" + it.migrationName);\n } else if (it.status === \"Error\") {\n console.error(\"failed \" + it.migrationName);\n }\n }\n\n if (error) {\n console.error(\"migration failed\");\n console.error(error);\n process.exit(1);\n }\n\n await db.destroy();\n}\n\nmain();`,\n};\n","export default {\n filename: \"packages/db/scripts/new-migration.ts\",\n template: `import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nasync function main() {\n const name = process.argv[2];\n if (!name) {\n console.error(\"Usage: pnpm db:make <name>\");\n process.exit(1);\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[-:T]/g, \"\")\n .slice(0, 14);\n const slug = name.replace(/[^a-zA-Z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n const filename = timestamp + \"_\" + slug + \".ts\";\n const dir = path.join(process.cwd(), \"src/migrations\");\n const stub = [\n 'import { Kysely, sql } from \"kysely\";',\n \"\",\n \"export async function up(db: Kysely<any>): Promise<void> {\",\n \" // await db.schema.createTable(...).execute();\",\n \"}\",\n \"\",\n \"export async function down(db: Kysely<any>): Promise<void> {\",\n \" // await db.schema.dropTable(...).execute();\",\n \"}\",\n \"\",\n ].join(\"\\\\n\");\n\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(path.join(dir, filename), stub);\n console.log(\"created src/migrations/\" + filename);\n}\n\nmain();`,\n};\n","export default {\n filename: \"packages/db/src/migrations/README.md\",\n template: `# Migrations\n\nKysely migrations run in filename order. Each file exports \\`up\\` and \\`down\\`.\n\n\\`\\`\\`bash\npnpm db:make add_widgets # scaffold a new migration\npnpm db:migrate # apply pending migrations\n\\`\\`\\`\n\nMigrations are written with Kysely's schema builder, so one file compiles to\nboth SQLite (dev) and Postgres (prod). Prefer dialect-agnostic column types\n(\\`text\\`, \\`integer\\`) and app-generated string ids over auto-increment.`,\n};\n","export default {\n filename: \"packages/db/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/db\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"migrate\": \"dotenv -e ../../.env -- tsx src/migrate.ts\",\n \"make\": \"tsx scripts/new-migration.ts\"\n },\n \"dependencies\": {\n \"better-sqlite3\": \"<%= versions[\"better-sqlite3\"] %>\",\n \"kysely\": \"<%= versions.kysely %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/better-sqlite3\": \"<%= versions[\"@types/better-sqlite3\"] %>\",\n \"dotenv-cli\": \"<%= versions[\"dotenv-cli\"] %>\",\n \"tsx\": \"<%= versions.tsx %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/db/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/db\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"migrate\": \"dotenv -e ../../.env -- tsx src/migrate.ts\",\n \"make\": \"tsx scripts/new-migration.ts\"\n },\n \"dependencies\": {\n \"kysely\": \"<%= versions.kysely %>\",\n \"pg\": \"<%= versions.pg %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/pg\": \"<%= versions[\"@types/pg\"] %>\",\n \"dotenv-cli\": \"<%= versions[\"dotenv-cli\"] %>\",\n \"tsx\": \"<%= versions.tsx %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/db/src/index.ts\",\n template: `import BetterSqlite3 from \"better-sqlite3\";\nimport { Kysely, SqliteDialect } from \"kysely\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { DB } from \"./schema.js\";\n\nfunction projectRoot(from: string) {\n for (let dir = from; ; ) {\n if (fs.existsSync(path.join(dir, \"pnpm-workspace.yaml\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return from;\n dir = parent;\n }\n}\n\nexport const databaseFile =\n process.env.DATABASE_URL ?? path.join(projectRoot(process.cwd()), \"dev.db\");\n\nexport const driver = new BetterSqlite3(databaseFile);\n\nexport const db = new Kysely<DB>({\n dialect: new SqliteDialect({ database: driver }),\n});\n\nexport type Database = Kysely<DB>;`,\n};\n","export default {\n filename: \"packages/db/src/index.ts\",\n template: `import { Kysely, PostgresDialect } from \"kysely\";\nimport { Pool } from \"pg\";\nimport type { DB } from \"./schema.js\";\n\nexport const driver = new Pool({ connectionString: process.env.DATABASE_URL });\n\nexport const db = new Kysely<DB>({\n dialect: new PostgresDialect({ pool: driver }),\n});\n\nexport type Database = Kysely<DB>;`,\n};\n","import type { Module } from \"../types\";\nimport tsconfig from \"./templates/tsconfig\";\nimport srcSchema from \"./templates/src-schema\";\nimport srcMigrate from \"./templates/src-migrate\";\nimport scriptsNewMigration from \"./templates/scripts-new-migration\";\nimport migrationsReadme from \"./templates/migrations-readme\";\nimport packageJsonSqlite from \"./templates/package-json-sqlite\";\nimport packageJsonPostgres from \"./templates/package-json-postgres\";\nimport srcIndexSqlite from \"./templates/src-index-sqlite\";\nimport srcIndexPostgres from \"./templates/src-index-postgres\";\n\nconst shared = [tsconfig, srcSchema, srcMigrate, scriptsNewMigration, migrationsReadme];\n\nexport const dbSqlite: Module = {\n templates: [...shared, packageJsonSqlite, srcIndexSqlite],\n};\n\nexport const dbPostgres: Module = {\n templates: [...shared, packageJsonPostgres, srcIndexPostgres],\n};\n","export default {\n filename: \"packages/ui/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/ui\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"exports\": {\n \"./globals.css\": \"./src/globals.css\",\n \"./postcss.config\": \"./postcss.config.mjs\",\n \"./utils\": \"./src/utils.ts\",\n \"./*\": \"./src/*.tsx\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.0.0\",\n \"react\": \">=19.0.0\",\n \"react-dom\": \">=19.0.0\"\n },\n \"dependencies\": {\n \"clsx\": \"<%= versions.clsx %>\",\n \"tailwind-merge\": \"<%= versions[\"tailwind-merge\"] %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/src/button.tsx\",\n template: `\"use client\";\n\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ninterface ButtonProps {\n children: ReactNode;\n onClick?: () => void;\n type?: \"button\" | \"submit\" | \"reset\";\n disabled?: boolean;\n className?: string;\n}\n\nexport const Button = ({ children, onClick, type = \"button\", disabled, className }: ButtonProps) => {\n return (\n <button\n type={type}\n onClick={onClick}\n disabled={disabled}\n className={cn(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all\",\n \"h-9 px-4 py-2\",\n \"bg-white text-gray-900 shadow-xs hover:bg-gray-100\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-white/50\",\n className\n )}\n >\n {children}\n </button>\n );\n};`,\n};\n","export default {\n filename: \"packages/ui/src/link.tsx\",\n template: `import NextLink, { type LinkProps } from \"next/link\";\nimport { type PropsWithChildren } from \"react\";\nimport { cn } from \"./utils\";\n\nexport function Link({\n href,\n children,\n className,\n ...rest\n}: PropsWithChildren<LinkProps & { className?: string }>) {\n return (\n <NextLink\n href={href}\n {...rest}\n className={cn(\n \"underline decoration-muted-foreground hover:decoration-foreground transition-colors\",\n className\n )}\n >\n {children}\n </NextLink>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/logo.tsx\",\n template: `import { cn } from \"./utils\";\n\ninterface LogoProps {\n className?: string;\n}\n\nexport function Logo({ className }: LogoProps) {\n return (\n <svg\n width=\"196\"\n height=\"138\"\n viewBox=\"0 0 196 138\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"text-foreground\", className)}\n >\n <path\n d=\"M98 35C102.665 35 107.243 35.2232 111.707 35.6514C111.243 38.1972 111 40.8202 111 43.5C111 67.5244 130.476 87 154.5 87C165.156 87 174.914 83.1658 182.478 76.8057C183.476 79.9455 184 83.186 184 86.5C184 114.943 145.496 138 98 138C50.5035 138 12 114.943 12 86.5C12 83.1861 12.5228 79.9454 13.5215 76.8057C21.0851 83.1661 30.8441 87 41.5 87C65.5244 87 85 67.5244 85 43.5C85 40.8202 84.7559 38.1973 84.292 35.6514C88.7559 35.2232 93.3345 35 98 35ZM38.5 0C59.763 0 77 17.237 77 38.5C77 59.763 59.763 77 38.5 77C17.237 77 0 59.763 0 38.5C0 17.237 17.237 0 38.5 0ZM157.5 0C178.763 0 196 17.237 196 38.5C196 59.763 178.763 77 157.5 77C136.237 77 119 59.763 119 38.5C119 17.237 136.237 0 157.5 0Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/utils.ts\",\n template: `import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}`,\n};\n","export default {\n filename: \"packages/ui/src/globals.css\",\n template: `@import 'tailwindcss';\n@source \"../../../apps/**/*.{ts,tsx}\";\n@source \"../**/*.{ts,tsx}\";\n\n:root {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --border: oklch(0.469 0 0);\n}\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-border: var(--border);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n}\n\n@layer base {\n html,\n body {\n height: 100%;\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n font-family: var(--font-geist-sans);\n -webkit-font-smoothing: antialiased;\n }\n * {\n border-color: var(--border);\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/postcss.config.mjs\",\n template: `const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"packages/ui/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/react-library.json\",\n \"compilerOptions\": {\n \"outDir\": \"dist\",\n \"strictNullChecks\": true\n },\n \"include\": [\"src\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport button from \"./templates/button\";\nimport link from \"./templates/link\";\nimport logo from \"./templates/logo\";\nimport utils from \"./templates/utils\";\nimport globalsCss from \"./templates/globals-css\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport tsconfig from \"./templates/tsconfig\";\n\nconst ui: Module = {\n templates: [packageJson, button, link, logo, utils, globalsCss, postcssConfig, tsconfig],\n};\n\nexport default ui;\n","// Single source of truth for every third-party dependency version a scaffolded\n// app gets. Templates read it as `<%= versions[\"pkg\"] %>`; module `packages`\n// entries read it directly. versions.test.ts fails if a package ever ends up\n// with two versions across the rendered output.\nexport const versions = {\n \"@babel/plugin-proposal-decorators\": \"^8.0.2\",\n \"@babel/plugin-transform-class-properties\": \"^8.0.1\",\n \"@base-ui/react\": \"^1.6.0\",\n \"@eslint/js\": \"^9.39.1\",\n \"@nestjs/cli\": \"^11.0.0\",\n \"@nestjs/common\": \"^11.0.1\",\n \"@nestjs/core\": \"^11.0.1\",\n \"@nestjs/platform-express\": \"^11.0.1\",\n \"@nestjs/schematics\": \"^11.0.0\",\n \"@nestjs/serve-static\": \"^5.0.0\",\n \"@nestjs/testing\": \"^11.0.1\",\n \"@next/eslint-plugin-next\": \"^16.3.4\",\n \"@oxlint/plugins\": \"^1.74.0\",\n \"@shadcn/react\": \"^0.2.1\",\n \"@stylexjs/babel-plugin\": \"0.19.0\",\n \"@stylexjs/postcss-plugin\": \"0.19.0\",\n \"@stylexjs/stylex\": \"0.19.0\",\n \"@swc/core\": \"^1.10.0\",\n \"@tailwindcss/postcss\": \"^4.2.1\",\n \"@tanstack/react-form\": \"^1.28.5\",\n \"@tanstack/react-query\": \"^5.90.21\",\n \"@thallesp/nestjs-better-auth\": \"^2.5.1\",\n \"@types/better-sqlite3\": \"^7.6.13\",\n \"@types/express\": \"^5.0.0\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^24.13.3\",\n \"@types/pg\": \"^8.11.13\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/supertest\": \"^6.0.2\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n auth: \"^1.5.5\",\n \"babel-plugin-transform-typescript-metadata\": \"^0.4.0\",\n \"better-auth\": \"^1.2.8\",\n \"better-sqlite3\": \"^12.11.1\",\n \"class-variance-authority\": \"^0.7.1\",\n clsx: \"^2.1.1\",\n cmdk: \"^1.1.1\",\n \"date-fns\": \"^4.2.1\",\n dotenv: \"^17.3.1\",\n \"dotenv-cli\": \"^11.0.0\",\n \"embla-carousel-react\": \"^8.6.0\",\n eslint: \"^9.39.1\",\n \"eslint-config-prettier\": \"^10.1.1\",\n \"eslint-plugin-only-warn\": \"^1.1.0\",\n \"eslint-plugin-react\": \"^7.37.5\",\n \"eslint-plugin-react-hooks\": \"^5.2.0\",\n \"eslint-plugin-turbo\": \"^2.7.1\",\n globals: \"^16.5.0\",\n \"input-otp\": \"^1.4.2\",\n jest: \"^30.0.0\",\n kysely: \"^0.28.2\",\n \"lucide-react\": \"^1.16.0\",\n next: \"16.3.4\",\n \"next-themes\": \"^0.4.6\",\n oxfmt: \"^0.59.0\",\n oxlint: \"^1.74.0\",\n pg: \"^8.14.1\",\n prettier: \"^3.7.4\",\n react: \"^19.2.4\",\n \"react-day-picker\": \"^10.0.1\",\n \"react-dom\": \"^19.2.4\",\n \"react-resizable-panels\": \"^4.11.1\",\n recharts: \"^3.8.0\",\n \"reflect-metadata\": \"^0.2.2\",\n rxjs: \"^7.8.1\",\n shadcn: \"^4.7.0\",\n sonner: \"^2.0.7\",\n supertest: \"^7.0.0\",\n \"tailwind-merge\": \"^3.6.0\",\n tailwindcss: \"^4.2.1\",\n \"ts-jest\": \"^29.2.5\",\n tsx: \"^4.19.4\",\n turbo: \"^2.8.16\",\n \"tw-animate-css\": \"^1.4.0\",\n typescript: \"6.0.2\",\n \"typescript-eslint\": \"^8.50.0\",\n \"unplugin-swc\": \"^1.5.9\",\n vitest: \"^4.1.10\",\n} as const;\n\nexport type Versions = typeof versions;\n","export default {\n filename: \"packages/ui/components.json\",\n template: `{\n \"$schema\": \"https://ui.shadcn.com/schema.json\",\n \"style\": \"base-nova\",\n \"rsc\": true,\n \"tsx\": true,\n \"tailwind\": {\n \"config\": \"\",\n \"css\": \"src/styles/globals.css\",\n \"baseColor\": \"neutral\",\n \"cssVariables\": true\n },\n \"iconLibrary\": \"lucide\",\n \"aliases\": {\n \"components\": \"@<%= projectName %>/ui/components\",\n \"utils\": \"@<%= projectName %>/ui/lib/utils\",\n \"hooks\": \"@<%= projectName %>/ui/hooks\",\n \"lib\": \"@<%= projectName %>/ui/lib\",\n \"ui\": \"@<%= projectName %>/ui/components\"\n },\n \"rtl\": false,\n \"menuColor\": \"default\",\n \"menuAccent\": \"subtle\"\n}`,\n};\n","export default {\n filename: \"apps/web/components.json\",\n template: `{\n \"$schema\": \"https://ui.shadcn.com/schema.json\",\n \"style\": \"base-nova\",\n \"rsc\": true,\n \"tsx\": true,\n \"tailwind\": {\n \"config\": \"\",\n \"css\": \"../../packages/ui/src/styles/globals.css\",\n \"baseColor\": \"neutral\",\n \"cssVariables\": true\n },\n \"iconLibrary\": \"lucide\",\n \"aliases\": {\n \"components\": \"@/components\",\n \"hooks\": \"@/hooks\",\n \"lib\": \"@/lib\",\n \"utils\": \"@<%= projectName %>/ui/lib/utils\",\n \"ui\": \"@<%= projectName %>/ui/components\"\n },\n \"rtl\": false,\n \"menuColor\": \"default\",\n \"menuAccent\": \"subtle\"\n}`,\n};\n","export default {\n filename: \"packages/ui/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/ui\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"exports\": {\n \"./globals.css\": \"./src/styles/globals.css\",\n \"./postcss.config\": \"./postcss.config.mjs\",\n \"./lib/*\": \"./src/lib/*.ts\",\n \"./components/*\": \"./src/components/*.tsx\",\n \"./hooks/*\": \"./src/hooks/*.ts\",\n \"./*\": \"./src/components/*.tsx\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@base-ui/react\": \"<%= versions[\"@base-ui/react\"] %>\",\n \"@shadcn/react\": \"<%= versions[\"@shadcn/react\"] %>\",\n \"shadcn\": \"<%= versions.shadcn %>\",\n \"class-variance-authority\": \"<%= versions[\"class-variance-authority\"] %>\",\n \"clsx\": \"<%= versions.clsx %>\",\n \"cmdk\": \"<%= versions.cmdk %>\",\n \"date-fns\": \"<%= versions[\"date-fns\"] %>\",\n \"embla-carousel-react\": \"<%= versions[\"embla-carousel-react\"] %>\",\n \"input-otp\": \"<%= versions[\"input-otp\"] %>\",\n \"lucide-react\": \"<%= versions[\"lucide-react\"] %>\",\n \"next-themes\": \"<%= versions[\"next-themes\"] %>\",\n \"react-day-picker\": \"<%= versions[\"react-day-picker\"] %>\",\n \"react-resizable-panels\": \"<%= versions[\"react-resizable-panels\"] %>\",\n \"recharts\": \"<%= versions.recharts %>\",\n \"sonner\": \"<%= versions.sonner %>\",\n \"tailwind-merge\": \"<%= versions[\"tailwind-merge\"] %>\",\n \"tw-animate-css\": \"<%= versions[\"tw-animate-css\"] %>\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.0.0\",\n \"react\": \">=19.0.0\",\n \"react-dom\": \">=19.0.0\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/src/lib/utils.ts\",\n template: `import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/hooks/use-mobile.ts\",\n template: `import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(\\`(max-width: \\${MOBILE_BREAKPOINT - 1}px)\\`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/styles/globals.css\",\n template: `@import \"tailwindcss\";\n@source \"../../../../apps/**/*.{ts,tsx}\";\n@source \"../../../../components/**/*.{ts,tsx}\";\n@source \"../**/*.{ts,tsx}\";\n\n@import \"tw-animate-css\";\n@import \"shadcn/tailwind.css\";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\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-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 --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --radius-sm: calc(var(--radius) * 0.6);\n --radius-md: calc(var(--radius) * 0.8);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) * 1.4);\n --radius-2xl: calc(var(--radius) * 1.8);\n --radius-3xl: calc(var(--radius) * 2.2);\n --radius-4xl: calc(var(--radius) * 2.6);\n}\n\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.87 0 0);\n --chart-2: oklch(0.556 0 0);\n --chart-3: oklch(0.439 0 0);\n --chart-4: oklch(0.371 0 0);\n --chart-5: oklch(0.269 0 0);\n --radius: 0.625rem;\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.87 0 0);\n --chart-2: oklch(0.556 0 0);\n --chart-3: oklch(0.439 0 0);\n --chart-4: oklch(0.371 0 0);\n --chart-5: oklch(0.269 0 0);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(1 0 0 / 10%);\n --sidebar-ring: oklch(0.556 0 0);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground font-sans;\n }\n}\n\n::-webkit-scrollbar {\n width: 8px;\n}\n\n::-webkit-scrollbar-track {\n @apply bg-muted;\n}\n\n::-webkit-scrollbar-thumb {\n @apply bg-border rounded-full;\n}\n\n::-webkit-scrollbar-thumb:hover {\n @apply bg-muted-foreground/50;\n}\n`,\n};\n","export default {\n filename: \"packages/ui/postcss.config.mjs\",\n template: `const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"packages/ui/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/react-library.json\",\n \"compilerOptions\": {\n \"outDir\": \"dist\",\n \"strictNullChecks\": true\n },\n \"include\": [\"src\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","export default {\n filename: \"packages/ui/src/components/link.tsx\",\n template: `import NextLink, { type LinkProps } from \"next/link\";\nimport { type PropsWithChildren } from \"react\";\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\";\n\nexport function Link({\n href,\n children,\n className,\n ...rest\n}: PropsWithChildren<LinkProps & { className?: string }>) {\n return (\n <NextLink\n href={href}\n {...rest}\n className={cn(\n \"underline decoration-muted-foreground hover:decoration-foreground transition-colors\",\n className\n )}\n >\n {children}\n </NextLink>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/components/logo.tsx\",\n template: `import { cn } from \"@<%= projectName %>/ui/lib/utils\";\n\ninterface LogoProps {\n className?: string;\n}\n\nexport function Logo({ className }: LogoProps) {\n return (\n <svg\n width=\"196\"\n height=\"138\"\n viewBox=\"0 0 196 138\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"text-foreground\", className)}\n >\n <path\n d=\"M98 35C102.665 35 107.243 35.2232 111.707 35.6514C111.243 38.1972 111 40.8202 111 43.5C111 67.5244 130.476 87 154.5 87C165.156 87 174.914 83.1658 182.478 76.8057C183.476 79.9455 184 83.186 184 86.5C184 114.943 145.496 138 98 138C50.5035 138 12 114.943 12 86.5C12 83.1861 12.5228 79.9454 13.5215 76.8057C21.0851 83.1661 30.8441 87 41.5 87C65.5244 87 85 67.5244 85 43.5C85 40.8202 84.7559 38.1973 84.292 35.6514C88.7559 35.2232 93.3345 35 98 35ZM38.5 0C59.763 0 77 17.237 77 38.5C77 59.763 59.763 77 38.5 77C17.237 77 0 59.763 0 38.5C0 17.237 17.237 0 38.5 0ZM157.5 0C178.763 0 196 17.237 196 38.5C196 59.763 178.763 77 157.5 77C136.237 77 119 59.763 119 38.5C119 17.237 136.237 0 157.5 0Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/layout.tsx\",\n template: `import type { Metadata } from \"next\";\nimport localFont from \"next/font/local\";\nimport Providers from \"@/app/providers\";\nimport { Toaster } from \"@<%= projectName %>/ui/sonner\";\nimport \"@<%= projectName %>/ui/globals.css\";\n\nconst geistSans = localFont({\n src: \"./fonts/GeistVF.woff\",\n variable: \"--font-geist-sans\",\n});\nconst geistMono = localFont({\n src: \"./fonts/GeistMonoVF.woff\",\n variable: \"--font-geist-mono\",\n});\n\nexport const metadata: Metadata = {\n title: \"<%= projectName %>\",\n description: \"Next + Nest = Newt\",\n icons: {\n icon: [\n { url: \"/icon0.svg\", type: \"image/svg+xml\" },\n { url: \"/icon1.png\", type: \"image/png\" },\n ],\n apple: \"/apple-icon.png\",\n },\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body className={\\`\\${geistSans.variable} \\${geistMono.variable} h-full\\`}>\n <Providers>\n {children}\n <Toaster />\n </Providers>\n </body>\n </html>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { ModeToggle } from '@<%= projectName %>/ui/mode-toggle';\nimport { Card, CardContent, CardHeader, CardTitle } from '@<%= projectName %>/ui/card';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello'],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b flex items-start justify-between\">\n <div>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n <ModeToggle />\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto text-foreground\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n next.js\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n nest.js\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 rounded-md border p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n better-auth\n </CardTitle>\n </CardHeader>\n <CardContent>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <div className=\"space-y-3\">\n <p className=\"text-sm\">Signed in as {session.user.name}</p>\n <Button variant=\"outline\" onClick={() => authClient.signOut()}>\n Sign out\n </Button>\n </div>\n ) : (\n <AuthForm />\n )}\n </CardContent>\n </Card>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/providers.tsx\",\n template: `'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { ThemeProvider } from 'next-themes';\nimport { useState } from 'react';\n\nexport default function Providers({ children }: { children: React.ReactNode }) {\n const [client] = useState(() => new QueryClient());\n return (\n <QueryClientProvider client={client}>\n <ThemeProvider attribute=\"class\" defaultTheme=\"dark\" disableTransitionOnChange>\n {children}\n </ThemeProvider>\n </QueryClientProvider>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/auth-form.tsx\",\n template: `'use client';\n\nimport { useForm } from '@tanstack/react-form';\nimport { useState } from 'react';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Input } from '@<%= projectName %>/ui/input';\nimport { Label } from '@<%= projectName %>/ui/label';\n\nexport function AuthForm() {\n const [tab, setTab] = useState<'signin' | 'signup'>('signup');\n const [error, setError] = useState('');\n\n const form = useForm({\n defaultValues: { name: '', email: '', password: '' },\n onSubmit: async ({ value }) => {\n setError('');\n if (tab === 'signin') {\n const { error } = await authClient.signIn.email(value);\n if (error) setError(error.message ?? 'Sign in failed');\n } else {\n const { error } = await authClient.signUp.email(value);\n if (error) setError(error.message ?? 'Sign up failed');\n }\n },\n });\n\n return (\n <>\n <div className=\"flex gap-1 mb-6\">\n <Button\n type=\"button\"\n variant={tab === 'signup' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setTab('signup')}\n >\n Sign up\n </Button>\n <Button\n type=\"button\"\n variant={tab === 'signin' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setTab('signin')}\n >\n Sign in\n </Button>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n {tab === 'signup' && (\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"name\">Name</Label>\n <Input\n id=\"name\"\n type=\"text\"\n autoComplete=\"name\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n />\n </div>\n )}\n </form.Field>\n )}\n\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n />\n </div>\n )}\n </form.Field>\n\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"password\">Password</Label>\n <Input\n id=\"password\"\n type=\"password\"\n autoComplete={\n tab === 'signin' ? 'current-password' : 'new-password'\n }\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n minLength={8}\n />\n </div>\n )}\n </form.Field>\n\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting} className=\"w-full\">\n {isSubmitting\n ? 'Loading…'\n : tab === 'signin'\n ? 'Sign in'\n : 'Create account'}\n </Button>\n )}\n </form.Subscribe>\n </form>\n </>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/components/accordion.tsx\",\n template: `import { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nfunction Accordion({ className, ...props }: AccordionPrimitive.Root.Props) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"not-last:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: AccordionPrimitive.Trigger.Props) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden\" />\n <ChevronUpIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: AccordionPrimitive.Panel.Props) {\n return (\n <AccordionPrimitive.Panel\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up\"\n {...props}\n >\n <div\n className={cn(\n \"h-(--accordion-panel-height) pt-0 pb-2.5 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Panel>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/alert-dialog.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { AlertDialog as AlertDialogPrimitive } from \"@base-ui/react/alert-dialog\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\n\nfunction AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.Props) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: AlertDialogPrimitive.Backdrop.Props) {\n return (\n <AlertDialogPrimitive.Backdrop\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n size = \"default\",\n ...props\n}: AlertDialogPrimitive.Popup.Props & {\n size?: \"default\" | \"sm\"\n}) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Popup\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n \"group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n \"grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogMedia({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-media\"\n className={cn(\n \"mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n \"text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof Button>) {\n return (\n <Button\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n size = \"default\",\n ...props\n}: AlertDialogPrimitive.Close.Props &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <AlertDialogPrimitive.Close\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n render={<Button variant={variant} size={size} />}\n {...props}\n />\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/alert.tsx\",\n template: `import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nconst alertVariants = cva(\n \"group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"absolute top-2 right-2\", className)}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/aspect-ratio.tsx\",\n template: `import { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction AspectRatio({\n ratio,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & { ratio: number }) {\n return (\n <div\n data-slot=\"aspect-ratio\"\n style={\n {\n \"--ratio\": ratio,\n } as React.CSSProperties\n }\n className={cn(\"relative aspect-(--ratio)\", className)}\n {...props}\n />\n )\n}\n\nexport { AspectRatio }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/avatar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: AvatarPrimitive.Root.Props & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/badge.tsx\",\n template: `import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(badgeVariants({ variant }), className),\n },\n props\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/breadcrumb.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"a\">) {\n return useRender({\n defaultTagName: \"a\",\n props: mergeProps<\"a\">(\n {\n className: cn(\"transition-colors hover:text-foreground\", className),\n },\n props\n ),\n render,\n state: {\n slot: \"breadcrumb-link\",\n },\n })\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <ChevronRightIcon />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"flex size-5 items-center justify-center [&>svg]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon\n />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/button.tsx\",\n template: `import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/calendar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n type Locale,\n} from \"react-day-picker\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button, buttonVariants } from \"@<%= projectName %>/ui/components/button\"\nimport { ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon } from \"lucide-react\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n locale,\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"group/calendar bg-background p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent\",\n String.raw\\`rtl:**:[.rdp-button\\\\_next>svg]:rotate-180\\`,\n String.raw\\`rtl:**:[.rdp-button\\\\_previous>svg]:rotate-180\\`,\n className\n )}\n captionLayout={captionLayout}\n locale={locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(locale?.code, { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative rounded-(--cell-radius)\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute inset-0 bg-popover opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"font-medium select-none\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n defaultClassNames.caption_label\n ),\n month_grid: cn(\"w-full border-collapse\", defaultClassNames.month_grid),\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-(--cell-size) select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] text-muted-foreground select-none\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\n \"relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted\",\n defaultClassNames.range_end\n ),\n today: cn(\n \"rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: ({ ...props }) => (\n <CalendarDayButton locale={locale} {...props} />\n ),\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n locale,\n ...props\n}: React.ComponentProps<typeof DayButton> & { locale?: Partial<Locale> }) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString(locale?.code)}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-foreground [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/card.tsx\",\n template: `import * as React from \"react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-(--card-spacing)\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-(--card-spacing)\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/carousel.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: \"horizontal\" | \"vertical\"\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api || !setApi) return\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) return\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api?.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div\n ref={carouselRef}\n className=\"overflow-hidden\"\n data-slot=\"carousel-content\"\n >\n <div\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel()\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute touch-manipulation rounded-full\",\n orientation === \"horizontal\"\n ? \"inset-y-0 -left-12 my-auto\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute touch-manipulation rounded-full\",\n orientation === \"horizontal\"\n ? \"inset-y-0 -right-12 my-auto\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ChevronRightIcon />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n useCarousel,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/chart.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\nimport type { TooltipValueType } from \"recharts\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const\ntype TooltipNameType = number | string\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\")\n }\n\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n initialDimension?: {\n width: number\n height: number\n }\n}) {\n const uniqueId = React.useId()\n const chartId = \\`chart-\\${id ?? uniqueId.replace(/:/g, \"\")}\\`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer\n initialDimension={initialDimension}\n >\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme ?? config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => \\`\n\\${prefix} [data-chart=\\${id}] {\n\\${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ??\n itemConfig.color\n return color ? \\` --color-\\${key}: \\${color};\\` : null\n })\n .join(\"\\\\n\")}\n}\n\\`\n )\n .join(\"\\\\n\"),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: \"line\" | \"dot\" | \"dashed\"\n nameKey?: string\n labelKey?: string\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<\n TooltipValueType,\n TooltipNameType\n >,\n \"accessibilityLayer\"\n >) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = \\`\\${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}\\`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === \"string\"\n ? (config[label]?.label ?? label)\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = \\`\\${nameKey ?? item.name ?? item.dataKey ?? \"value\"}\\`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color ?? item.payload?.fill ?? item.color\n\n return (\n <div\n key={index}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === \"number\"\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> & {\n hideIcon?: boolean\n nameKey?: string\n} & RechartsPrimitive.DefaultLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = \\`\\${nameKey ?? item.dataKey ?? \"value\"}\\`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/checkbox.tsx\",\n template: `\"use client\"\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { CheckIcon } from \"lucide-react\"\n\nfunction Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none [&>svg]:size-3.5\"\n >\n <CheckIcon\n />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/collapsible.tsx\",\n template: `\"use client\"\n\nimport { Collapsible as CollapsiblePrimitive } from \"@base-ui/react/collapsible\"\n\nfunction Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {\n return (\n <CollapsiblePrimitive.Trigger data-slot=\"collapsible-trigger\" {...props} />\n )\n}\n\nfunction CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {\n return (\n <CollapsiblePrimitive.Panel data-slot=\"collapsible-content\" {...props} />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/command.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@<%= projectName %>/ui/components/dialog\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"@<%= projectName %>/ui/components/input-group\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = false,\n ...props\n}: Omit<React.ComponentProps<typeof Dialog>, \"children\"> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n children: React.ReactNode\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\n \"top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0\",\n className\n )}\n showCloseButton={showCloseButton}\n >\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1 pb-0\">\n <InputGroup className=\"h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/combobox.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"@<%= projectName %>/ui/components/input-group\"\nimport { ChevronDownIcon, XIcon, CheckIcon } from \"lucide-react\"\n\nconst Combobox = ComboboxPrimitive.Root\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <XIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean\n showClear?: boolean\n}) {\n return (\n <InputGroup className={cn(\"w-auto\", className)}>\n <ComboboxPrimitive.Input\n render={<InputGroupInput disabled={disabled} />}\n {...props}\n />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n render={<ComboboxTrigger />}\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n />\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n return (\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\"group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <CheckIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxLabel({\n className,\n ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return (\n <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n )\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({\n className,\n ...props\n}: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\n className\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <XIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({\n className,\n ...props\n}: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"min-w-16 flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxContent,\n ComboboxList,\n ComboboxItem,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/context-menu.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"@base-ui/react/context-menu\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\"\n\nfunction ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n )\n}\n\nfunction ContextMenuTrigger({\n className,\n ...props\n}: ContextMenuPrimitive.Trigger.Props) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n className={cn(\"select-none\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n align = \"start\",\n alignOffset = 4,\n side = \"right\",\n sideOffset = 0,\n ...props\n}: ContextMenuPrimitive.Popup.Props &\n Pick<\n ContextMenuPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <ContextMenuPrimitive.Popup\n data-slot=\"context-menu-content\"\n className={cn(\"z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ContextMenuPrimitive.Positioner>\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: ContextMenuPrimitive.GroupLabel.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.GroupLabel\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: ContextMenuPrimitive.Item.Props & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props) {\n return (\n <ContextMenuPrimitive.SubmenuRoot data-slot=\"context-menu-sub\" {...props} />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ContextMenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubmenuTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubmenuTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n ...props\n}: React.ComponentProps<typeof ContextMenuContent>) {\n return (\n <ContextMenuContent\n data-slot=\"context-menu-sub-content\"\n className=\"shadow-lg\"\n side=\"right\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: ContextMenuPrimitive.CheckboxItem.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.CheckboxItemIndicator>\n <CheckIcon\n />\n </ContextMenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: ContextMenuPrimitive.RadioGroup.Props) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: ContextMenuPrimitive.RadioItem.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.RadioItemIndicator>\n <CheckIcon\n />\n </ContextMenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: ContextMenuPrimitive.Separator.Props) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/dialog.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Dialog({ ...props }: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({ ...props }: DialogPrimitive.Close.Props) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: DialogPrimitive.Backdrop.Props) {\n return (\n <DialogPrimitive.Backdrop\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: DialogPrimitive.Popup.Props & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Popup\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n render={\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 right-2\"\n size=\"icon-sm\"\n />\n }\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close render={<Button variant=\"outline\" />}>\n Close\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/direction.tsx\",\n template: `\"use client\"\n\nexport {\n DirectionProvider,\n useDirection,\n} from \"@base-ui/react/direction-provider\"\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/drawer.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"@base-ui/react/drawer\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\ntype DrawerContextProps = {\n hasSnapPoints: boolean\n modal: DrawerPrimitive.Root.Props[\"modal\"]\n showSwipeHandle: boolean\n swipeDirection: NonNullable<DrawerPrimitive.Root.Props[\"swipeDirection\"]>\n}\n\nconst DrawerContext = React.createContext<DrawerContextProps | null>(null)\n\nfunction useDrawer() {\n const context = React.useContext(DrawerContext)\n\n if (!context) {\n throw new Error(\"useDrawer must be used within a Drawer.\")\n }\n\n return context\n}\n\nfunction Drawer({\n modal = true,\n showSwipeHandle = false,\n snapPoints,\n swipeDirection = \"down\",\n ...props\n}: DrawerPrimitive.Root.Props & {\n showSwipeHandle?: boolean\n}) {\n const hasSnapPoints = snapPoints != null && snapPoints.length > 0\n const contextValue = React.useMemo(\n () => ({ hasSnapPoints, modal, showSwipeHandle, swipeDirection }),\n [hasSnapPoints, modal, showSwipeHandle, swipeDirection]\n )\n\n return (\n <DrawerContext.Provider value={contextValue}>\n <DrawerPrimitive.Root\n data-slot=\"drawer\"\n modal={modal}\n snapPoints={snapPoints}\n swipeDirection={swipeDirection}\n {...props}\n />\n </DrawerContext.Provider>\n )\n}\n\nfunction DrawerTrigger({ ...props }: DrawerPrimitive.Trigger.Props) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\n}\n\nfunction DrawerPortal({ ...props }: DrawerPrimitive.Portal.Props) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\n}\n\nfunction DrawerClose({ ...props }: DrawerPrimitive.Close.Props) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: DrawerPrimitive.Backdrop.Props) {\n return (\n <DrawerPrimitive.Backdrop\n data-slot=\"drawer-overlay\"\n className={cn(\n \"fixed inset-0 z-50 min-h-dvh bg-black/10 opacity-[max(var(--drawer-overlay-min-opacity,0),calc(1-var(--drawer-swipe-progress)))] transition-opacity duration-450 ease-[cubic-bezier(0.32,0.72,0,1)] select-none data-ending-style:pointer-events-none data-ending-style:opacity-0 data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-snap-points:[--drawer-overlay-min-opacity:0.5] data-starting-style:opacity-0 data-swiping:duration-0 supports-backdrop-filter:backdrop-blur-xs supports-[-webkit-touch-callout:none]:absolute\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerSwipeHandle({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-swipe-handle\"\n aria-hidden=\"true\"\n className={cn(\n \"relative z-10 flex shrink-0 cursor-grab transition-opacity duration-200 group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-[swipe-axis=x]/drawer-popup:h-full group-data-[swipe-axis=x]/drawer-popup:w-3 group-data-[swipe-axis=x]/drawer-popup:items-center group-data-[swipe-axis=y]/drawer-popup:h-3 group-data-[swipe-axis=y]/drawer-popup:w-full group-data-[swipe-axis=y]/drawer-popup:justify-center group-data-[swipe-direction=down]/drawer-popup:items-end group-data-[swipe-direction=left]/drawer-popup:order-last group-data-[swipe-direction=left]/drawer-popup:justify-start group-data-[swipe-direction=right]/drawer-popup:justify-end group-data-[swipe-direction=up]/drawer-popup:order-last group-data-[swipe-direction=up]/drawer-popup:items-start after:block after:shrink-0 after:rounded-full after:bg-muted group-data-[swipe-axis=x]/drawer-popup:after:h-24 group-data-[swipe-axis=x]/drawer-popup:after:w-1 group-data-[swipe-axis=y]/drawer-popup:after:h-1 group-data-[swipe-axis=y]/drawer-popup:after:w-24 active:cursor-grabbing\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: DrawerPrimitive.Popup.Props) {\n const { hasSnapPoints, modal, showSwipeHandle, swipeDirection } = useDrawer()\n const swipeAxis =\n swipeDirection === \"down\" || swipeDirection === \"up\" ? \"y\" : \"x\"\n\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n {modal === true && (\n <DrawerOverlay data-snap-points={hasSnapPoints ? \"\" : undefined} />\n )}\n <DrawerPrimitive.Viewport\n data-slot=\"drawer-viewport\"\n data-modal={modal}\n className=\"pointer-events-none fixed inset-0 z-50 select-none data-[modal=true]:pointer-events-auto\"\n >\n <DrawerPrimitive.Popup\n data-slot=\"drawer-popup\"\n data-swipe-axis={swipeAxis}\n data-snap-points={hasSnapPoints ? \"\" : undefined}\n className={cn(\n // Base.\n \"group/drawer-popup pointer-events-auto fixed z-50 m-(--drawer-inset,0px) flex h-(--drawer-content-height) max-h-(--drawer-content-max-height,none) min-h-0 w-(--drawer-content-width,auto) transform-[translate3d(var(--translate-x,0px),var(--translate-y,0px),0)_scale(var(--stack-scale))] flex-col bg-popover text-sm text-popover-foreground transition-[transform,height,opacity,filter] duration-450 ease-[cubic-bezier(0.22,1,0.36,1)] will-change-transform outline-none select-none [interpolate-size:allow-keywords] data-[swipe-direction=down]:rounded-t-xl data-[swipe-direction=down]:border-t data-[swipe-direction=left]:rounded-r-xl data-[swipe-direction=left]:border-r data-[swipe-direction=right]:rounded-l-xl data-[swipe-direction=right]:border-l data-[swipe-direction=up]:rounded-b-xl data-[swipe-direction=up]:border-b\",\n // Nested.\n \"data-nested-drawer-open:overflow-hidden data-nested-drawer-open:brightness-95\",\n // Bleed.\n \"after:pointer-events-none after:absolute after:bg-(--drawer-bleed-background,var(--color-popover)) data-[swipe-axis=x]:after:inset-y-0 data-[swipe-axis=x]:after:w-(--bleed) data-[swipe-axis=y]:after:inset-x-0 data-[swipe-axis=y]:after:h-(--bleed) data-[swipe-direction=down]:after:top-full data-[swipe-direction=left]:after:right-full data-[swipe-direction=right]:after:left-full data-[swipe-direction=up]:after:bottom-full\",\n // Sizing.\n \"[--drawer-content-height:var(--drawer-height,auto)] data-[swipe-axis=x]:[--drawer-content-width:75%] data-[swipe-axis=y]:[--drawer-content-max-height:calc(100dvh-6rem)] data-[swipe-axis=y]:data-snap-points:[--drawer-content-height:100dvh] data-[swipe-axis=x]:sm:[--drawer-content-width:24rem]\",\n // Stack.\n \"[--bleed:3rem] [--peek:1rem] [--stack-height:var(--drawer-frontmost-height,var(--drawer-height,0px))] [--stack-peek-offset:max(0px,calc((var(--nested-drawers)-var(--stack-progress))*var(--peek)))] [--stack-progress:clamp(0,var(--drawer-swipe-progress),1)] [--stack-scale-base:max(0,calc(1-(var(--nested-drawers)*var(--stack-step))))] [--stack-scale:clamp(0,calc(var(--stack-scale-base)+(var(--stack-step)*var(--stack-progress))),1)] [--stack-shrink:calc(1-var(--stack-scale))] [--stack-step:0.05]\",\n // Transitions.\n \"data-ending-style:transform-(--closed-transform) data-ending-style:opacity-[0.9999] data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-nested-drawer-swiping:duration-0 data-ending-style:data-nested-drawer-swiping:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-starting-style:transform-(--closed-transform) data-swiping:duration-0 data-ending-style:data-swiping:duration-[calc(var(--drawer-swipe-strength)*400ms)]\",\n // Axis: y.\n \"data-[swipe-axis=y]:inset-x-0 data-[swipe-axis=y]:data-nested-drawer-open:h-(--stack-height)\",\n // Axis: x.\n \"data-[swipe-axis=x]:inset-y-0 data-[swipe-axis=x]:flex-row\",\n // Direction: down.\n \"data-[swipe-direction=down]:bottom-0 data-[swipe-direction=down]:origin-bottom data-[swipe-direction=down]:[--closed-transform:translate3d(0,calc(100%+var(--drawer-inset,0px)+2px),0)] data-[swipe-direction=down]:[--translate-y:calc(var(--drawer-snap-point-offset,0px)+var(--drawer-swipe-movement-y)-var(--stack-peek-offset)-(var(--stack-shrink)*var(--stack-height)))]\",\n // Direction: up.\n \"data-[swipe-direction=up]:top-0 data-[swipe-direction=up]:origin-top data-[swipe-direction=up]:[--closed-transform:translate3d(0,calc(-100%-var(--drawer-inset,0px)-2px),0)] data-[swipe-direction=up]:[--translate-y:calc(var(--drawer-snap-point-offset,0px)+var(--drawer-swipe-movement-y)+var(--stack-peek-offset)+(var(--stack-shrink)*var(--stack-height)))]\",\n // Direction: left.\n \"data-[swipe-direction=left]:left-0 data-[swipe-direction=left]:origin-left data-[swipe-direction=left]:[--closed-transform:translate3d(calc(-100%-var(--drawer-inset,0px)-2px),0,0)] data-[swipe-direction=left]:[--translate-x:calc(var(--drawer-swipe-movement-x)+var(--stack-peek-offset)+(var(--stack-shrink)*100%))]\",\n // Direction: right.\n \"data-[swipe-direction=right]:right-0 data-[swipe-direction=right]:origin-right data-[swipe-direction=right]:[--closed-transform:translate3d(calc(100%+var(--drawer-inset,0px)+2px),0,0)] data-[swipe-direction=right]:[--translate-x:calc(var(--drawer-swipe-movement-x)-var(--stack-peek-offset)-(var(--stack-shrink)*100%))]\",\n className\n )}\n {...props}\n >\n {showSwipeHandle && <DrawerSwipeHandle />}\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col overflow-hidden overscroll-contain rounded-[inherit] transition-opacity duration-300 ease-[cubic-bezier(0.45,1.005,0,1.005)] select-text group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-swiping/drawer-popup:select-none\"\n )}\n >\n {children}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Popup>\n </DrawerPrimitive.Viewport>\n </DrawerPortal>\n )\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n \"flex shrink-0 flex-col gap-0.5 p-4 pb-0 group-data-[swipe-axis=y]/drawer-popup:text-center md:gap-0.5 md:text-left\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex shrink-0 flex-col gap-2 p-4 pt-0\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerTitle({ className, ...props }: DrawerPrimitive.Title.Props) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: DrawerPrimitive.Description.Props) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-sm text-balance text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerSwipeHandle,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/dropdown-menu.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\"\n\nfunction DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {\n return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n}\n\nfunction DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />\n}\n\nfunction DropdownMenuContent({\n align = \"start\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n className,\n ...props\n}: MenuPrimitive.Popup.Props &\n Pick<\n MenuPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-content\"\n className={cn(\"z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.GroupLabel\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <MenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.SubmenuTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-popup-open:bg-accent data-popup-open:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </MenuPrimitive.SubmenuTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n align = \"start\",\n alignOffset = -3,\n side = \"right\",\n sideOffset = 0,\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n return (\n <DropdownMenuContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\"w-auto min-w-[96px] rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <MenuPrimitive.CheckboxItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {\n return (\n <MenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: MenuPrimitive.RadioItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/empty.tsx\",\n template: `import { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty\"\n className={cn(\n \"flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-header\"\n className={cn(\"flex max-w-sm flex-col items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nconst emptyMediaVariants = cva(\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction EmptyMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n return (\n <div\n data-slot=\"empty-icon\"\n data-variant={variant}\n className={cn(emptyMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-title\"\n className={cn(\n \"text-sm font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn(\n \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-content\"\n className={cn(\n \"flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Empty,\n EmptyHeader,\n EmptyTitle,\n EmptyDescription,\n EmptyContent,\n EmptyMedia,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/field.tsx\",\n template: `\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Label } from \"@<%= projectName %>/ui/components/label\"\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-2 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col *:w-full [&>.sr-only]:w-auto\",\n horizontal:\n \"flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n responsive:\n \"flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-0.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border has-[>[data-slot=field]]:not-has-[:disabled,[data-disabled]]:hover:bg-muted/50 has-[>[data-slot=field]]:has-[:focus-visible]:border-ring has-[>[data-slot=field]]:has-[:focus-visible]:ring-3 has-[>[data-slot=field]]:has-[:focus-visible]:ring-ring/50 *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5\",\n \"last:mt-0 nth-last-2:-mt-1\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/hover-card.tsx\",\n template: `\"use client\"\n\nimport { PreviewCard as PreviewCardPrimitive } from \"@base-ui/react/preview-card\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction HoverCard({ ...props }: PreviewCardPrimitive.Root.Props) {\n return <PreviewCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({ ...props }: PreviewCardPrimitive.Trigger.Props) {\n return (\n <PreviewCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 4,\n ...props\n}: PreviewCardPrimitive.Popup.Props &\n Pick<\n PreviewCardPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <PreviewCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <PreviewCardPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <PreviewCardPrimitive.Popup\n data-slot=\"hover-card-content\"\n className={cn(\n \"z-50 w-64 origin-(--transform-origin) rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PreviewCardPrimitive.Positioner>\n </PreviewCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/button-group.tsx\",\n template: `import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"*:data-slot:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-lg! [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0\",\n vertical:\n \"flex-col *:data-slot:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-lg! [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"button-group-text\",\n },\n })\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"relative self-stretch bg-input data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/input-group.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { Input } from \"@<%= projectName %>/ui/components/input\"\nimport { Textarea } from \"@<%= projectName %>/ui/components/textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\"\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/item.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-2\", className)}\n {...props}\n />\n )\n}\n\nconst itemVariants = cva(\n \"group/item flex w-full flex-wrap items-center rounded-lg border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"border-transparent bg-muted/50\",\n },\n size: {\n default: \"gap-2.5 px-3 py-2.5\",\n sm: \"gap-2.5 px-3 py-2.5\",\n xs: \"gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & VariantProps<typeof itemVariants>) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(itemVariants({ variant, size, className })),\n },\n props\n ),\n render,\n state: {\n slot: \"item\",\n variant,\n size,\n },\n })\n}\n\nconst itemMediaVariants = cva(\n \"flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-actions\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/kbd.tsx\",\n template: `import { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n \"pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <kbd\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/native-select.tsx\",\n template: `import * as React from \"react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\ntype NativeSelectProps = Omit<React.ComponentProps<\"select\">, \"size\"> & {\n size?: \"sm\" | \"default\"\n}\n\nfunction NativeSelect({\n className,\n size = \"default\",\n ...props\n}: NativeSelectProps) {\n return (\n <div\n className={cn(\n \"group/native-select relative w-fit has-[select:disabled]:opacity-50\",\n className\n )}\n data-slot=\"native-select-wrapper\"\n data-size={size}\n >\n <select\n data-slot=\"native-select\"\n data-size={size}\n className=\"h-8 w-full min-w-0 appearance-none rounded-lg border border-input bg-transparent py-1 pr-8 pl-2.5 text-sm transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-[size=sm]:py-0.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\"\n {...props}\n />\n <ChevronDownIcon className=\"pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none\" aria-hidden=\"true\" data-slot=\"native-select-icon\" />\n </div>\n )\n}\n\nfunction NativeSelectOption({\n className,\n ...props\n}: React.ComponentProps<\"option\">) {\n return (\n <option\n data-slot=\"native-select-option\"\n className={cn(\"bg-[Canvas] text-[CanvasText]\", className)}\n {...props}\n />\n )\n}\n\nfunction NativeSelectOptGroup({\n className,\n ...props\n}: React.ComponentProps<\"optgroup\">) {\n return (\n <optgroup\n data-slot=\"native-select-optgroup\"\n className={cn(\"bg-[Canvas] text-[CanvasText]\", className)}\n {...props}\n />\n )\n}\n\nexport { NativeSelect, NativeSelectOptGroup, NativeSelectOption }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/spinner.tsx\",\n template: `import { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon data-slot=\"spinner\" role=\"status\" aria-label=\"Loading\" className={cn(\"size-4 animate-spin\", className)} {...props} />\n )\n}\n\nexport { Spinner }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/input-otp.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { MinusIcon } from \"lucide-react\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"cn-input-otp flex items-center has-disabled:opacity-50\",\n containerClassName\n )}\n spellCheck={false}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\n \"flex items-center rounded-lg has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"relative flex size-8 items-center justify-center border-y border-r border-input text-sm transition-all outline-none first:rounded-l-lg first:border-l last:rounded-r-lg aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-3 data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-separator\"\n className=\"flex items-center [&_svg:not([class*='size-'])]:size-4\"\n role=\"separator\"\n {...props}\n >\n <MinusIcon\n />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/input.tsx\",\n template: `import * as React from \"react\"\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/label.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Label({ className, ...props }: React.ComponentProps<\"label\">) {\n return (\n <label\n data-slot=\"label\"\n className={cn(\n \"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\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/menubar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\"\nimport { Menubar as MenubarPrimitive } from \"@base-ui/react/menubar\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"@<%= projectName %>/ui/components/dropdown-menu\"\nimport { CheckIcon } from \"lucide-react\"\n\nfunction Menubar({ className, ...props }: MenubarPrimitive.Props) {\n return (\n <MenubarPrimitive\n data-slot=\"menubar\"\n className={cn(\n \"flex h-8 items-center gap-0.5 rounded-lg border p-[3px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarMenu({ ...props }: React.ComponentProps<typeof DropdownMenu>) {\n return <DropdownMenu data-slot=\"menubar-menu\" {...props} />\n}\n\nfunction MenubarGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuGroup>) {\n return <DropdownMenuGroup data-slot=\"menubar-group\" {...props} />\n}\n\nfunction MenubarPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPortal>) {\n return <DropdownMenuPortal data-slot=\"menubar-portal\" {...props} />\n}\n\nfunction MenubarTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuTrigger>) {\n return (\n <DropdownMenuTrigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n return (\n <DropdownMenuContent\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\"min-w-36 rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95\", className )}\n {...props}\n />\n )\n}\n\nfunction MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuItem>) {\n return (\n <DropdownMenuItem\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/menubar-item gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4\">\n <MenuPrimitive.CheckboxItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n )\n}\n\nfunction MenubarRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuRadioGroup>) {\n return <DropdownMenuRadioGroup data-slot=\"menubar-radio-group\" {...props} />\n}\n\nfunction MenubarRadioItem({\n className,\n children,\n inset,\n ...props\n}: MenuPrimitive.RadioItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4\">\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n )\n}\n\nfunction MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuLabel> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuLabel\n data-slot=\"menubar-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-sm font-medium data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuSeparator>) {\n return (\n <DropdownMenuSeparator\n data-slot=\"menubar-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction MenubarShortcut({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuShortcut>) {\n return (\n <DropdownMenuShortcut\n data-slot=\"menubar-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuSub>) {\n return <DropdownMenuSub data-slot=\"menubar-sub\" {...props} />\n}\n\nfunction MenubarSubTrigger({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuSubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuSubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuSubContent>) {\n return (\n <DropdownMenuSubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\"min-w-32 rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n )\n}\n\nexport {\n Menubar,\n MenubarPortal,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarSeparator,\n MenubarLabel,\n MenubarItem,\n MenubarShortcut,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/navigation-menu.tsx\",\n template: `import { NavigationMenu as NavigationMenuPrimitive } from \"@base-ui/react/navigation-menu\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nfunction NavigationMenu({\n align = \"start\",\n className,\n children,\n ...props\n}: NavigationMenuPrimitive.Root.Props &\n Pick<NavigationMenuPrimitive.Positioner.Props, \"align\">) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n {...props}\n >\n {children}\n <NavigationMenuPositioner align={align} />\n </NavigationMenuPrimitive.Root>\n )\n}\n\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\n \"group flex flex-1 list-none items-center justify-center gap-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n )\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted\"\n)\n\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: NavigationMenuPrimitive.Trigger.Props) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDownIcon className=\"relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180\" aria-hidden=\"true\" />\n </NavigationMenuPrimitive.Trigger>\n )\n}\n\nfunction NavigationMenuContent({\n className,\n ...props\n}: NavigationMenuPrimitive.Content.Props) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"data-ending-style:data-activation-direction=left:translate-x-[50%] data-ending-style:data-activation-direction=right:translate-x-[-50%] data-starting-style:data-activation-direction=left:translate-x-[-50%] data-starting-style:data-activation-direction=right:translate-x-[50%] h-full w-auto p-1 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:opacity-0 data-starting-style:opacity-0 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuPositioner({\n className,\n side = \"bottom\",\n sideOffset = 8,\n align = \"start\",\n alignOffset = 0,\n ...props\n}: NavigationMenuPrimitive.Positioner.Props) {\n return (\n <NavigationMenuPrimitive.Portal>\n <NavigationMenuPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n className={cn(\n \"isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0\",\n className\n )}\n {...props}\n >\n <NavigationMenuPrimitive.Popup className=\"data-[ending-style]:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0\">\n <NavigationMenuPrimitive.Viewport className=\"relative size-full overflow-hidden\" />\n </NavigationMenuPrimitive.Popup>\n </NavigationMenuPrimitive.Positioner>\n </NavigationMenuPrimitive.Portal>\n )\n}\n\nfunction NavigationMenuLink({\n className,\n ...props\n}: NavigationMenuPrimitive.Link.Props) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Icon>) {\n return (\n <NavigationMenuPrimitive.Icon\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in\",\n className\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Icon>\n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuIndicator,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n NavigationMenuPositioner,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/pagination.tsx\",\n template: `import * as React from \"react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\"\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex items-center gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <Button\n variant={isActive ? \"outline\" : \"ghost\"}\n size={size}\n className={cn(className)}\n nativeButton={false}\n render={\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n {...props}\n />\n }\n />\n )\n}\n\nfunction PaginationPrevious({\n className,\n text = \"Previous\",\n ...props\n}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"pl-1.5!\", className)}\n {...props}\n >\n <ChevronLeftIcon data-icon=\"inline-start\" />\n <span className=\"hidden sm:block\">{text}</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({\n className,\n text = \"Next\",\n ...props\n}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"pr-1.5!\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">{text}</span>\n <ChevronRightIcon data-icon=\"inline-end\" />\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\n \"flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon\n />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/popover.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n ...props\n}: PopoverPrimitive.Popup.Props &\n Pick<\n PopoverPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n \"z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-0.5 text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n data-slot=\"popover-title\"\n className={cn(\"font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Popover,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/progress.tsx\",\n template: `\"use client\"\n\nimport { Progress as ProgressPrimitive } from \"@base-ui/react/progress\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Progress({\n className,\n children,\n value,\n ...props\n}: ProgressPrimitive.Root.Props) {\n return (\n <ProgressPrimitive.Root\n value={value}\n data-slot=\"progress\"\n className={cn(\"flex flex-wrap gap-3\", className)}\n {...props}\n >\n {children}\n <ProgressTrack>\n <ProgressIndicator />\n </ProgressTrack>\n </ProgressPrimitive.Root>\n )\n}\n\nfunction ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props) {\n return (\n <ProgressPrimitive.Track\n className={cn(\n \"relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted\",\n className\n )}\n data-slot=\"progress-track\"\n {...props}\n />\n )\n}\n\nfunction ProgressIndicator({\n className,\n ...props\n}: ProgressPrimitive.Indicator.Props) {\n return (\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\"h-full bg-primary transition-all\", className)}\n {...props}\n />\n )\n}\n\nfunction ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props) {\n return (\n <ProgressPrimitive.Label\n className={cn(\"text-sm font-medium\", className)}\n data-slot=\"progress-label\"\n {...props}\n />\n )\n}\n\nfunction ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) {\n return (\n <ProgressPrimitive.Value\n className={cn(\n \"ml-auto text-sm text-muted-foreground tabular-nums\",\n className\n )}\n data-slot=\"progress-value\"\n {...props}\n />\n )\n}\n\nexport {\n Progress,\n ProgressTrack,\n ProgressIndicator,\n ProgressLabel,\n ProgressValue,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/radio-group.tsx\",\n template: `\"use client\"\n\nimport { Radio as RadioPrimitive } from \"@base-ui/react/radio\"\nimport { RadioGroup as RadioGroupPrimitive } from \"@base-ui/react/radio-group\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction RadioGroup({ className, ...props }: RadioGroupPrimitive.Props) {\n return (\n <RadioGroupPrimitive\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({ className, ...props }: RadioPrimitive.Root.Props) {\n return (\n <RadioPrimitive.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary\",\n className\n )}\n {...props}\n >\n <RadioPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"flex size-4 items-center justify-center\"\n >\n <span className=\"absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground\" />\n </RadioPrimitive.Indicator>\n </RadioPrimitive.Root>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/resizable.tsx\",\n template: `\"use client\"\n\nimport * as ResizablePrimitive from \"react-resizable-panels\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction ResizablePanelGroup({\n className,\n ...props\n}: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full aria-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90\",\n className\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border\" />\n )}\n </ResizablePrimitive.Separator>\n )\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/scroll-area.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: ScrollAreaPrimitive.Root.Props) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border\"\n />\n </ScrollAreaPrimitive.Scrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/select.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { ChevronDownIcon, CheckIcon, ChevronUpIcon } from \"lucide-react\"\n\nconst Select = SelectPrimitive.Root\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\"flex flex-1 text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n render={\n <ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n }\n />\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props &\n Pick<\n SelectPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\" | \"alignItemWithTrigger\"\n >) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n data-align-trigger={alignItemWithTrigger}\n className={cn(\"relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.List>{children}</SelectPrimitive.List>\n <SelectScrollDownButton />\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText className=\"flex flex-1 shrink-0 gap-2 whitespace-nowrap\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <CheckIcon className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {\n return (\n <SelectPrimitive.ScrollUpArrow\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon\n />\n </SelectPrimitive.ScrollUpArrow>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {\n return (\n <SelectPrimitive.ScrollDownArrow\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon\n />\n </SelectPrimitive.ScrollDownArrow>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/separator.tsx\",\n template: `\"use client\"\n\nimport { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/sheet.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Sheet({ ...props }: SheetPrimitive.Root.Props) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({ ...props }: SheetPrimitive.Close.Props) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n return (\n <SheetPrimitive.Backdrop\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: SheetPrimitive.Popup.Props & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Popup\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close\n data-slot=\"sheet-close\"\n render={\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 right-3\"\n size=\"icon-sm\"\n />\n }\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Popup>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: SheetPrimitive.Description.Props) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/sidebar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { useIsMobile } from \"@<%= projectName %>/ui/hooks/use-mobile\"\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { Input } from \"@<%= projectName %>/ui/components/input\"\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@<%= projectName %>/ui/components/sheet\"\nimport { Skeleton } from \"@<%= projectName %>/ui/components/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@<%= projectName %>/ui/components/tooltip\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = \\`\\${SIDEBAR_COOKIE_NAME}=\\${openState}; path=/; max-age=\\${SIDEBAR_COOKIE_MAX_AGE}\\`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & React.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-group-label\",\n sidebar: \"group-label\",\n },\n })\n}\n\nfunction SidebarGroupAction({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"button\"> & React.ComponentProps<\"button\">) {\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n className: cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-group-action\",\n sidebar: \"group-action\",\n },\n })\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n render,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: useRender.ComponentProps<\"button\"> &\n React.ComponentProps<\"button\"> & {\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n } & VariantProps<typeof sidebarMenuButtonVariants>) {\n const { isMobile, state } = useSidebar()\n const comp = useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n className: cn(sidebarMenuButtonVariants({ variant, size }), className),\n },\n props\n ),\n render: !tooltip ? render : <TooltipTrigger render={render} />,\n state: {\n slot: \"sidebar-menu-button\",\n sidebar: \"menu-button\",\n size,\n active: isActive,\n },\n })\n\n if (!tooltip) {\n return comp\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n {comp}\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n render,\n showOnHover = false,\n ...props\n}: useRender.ComponentProps<\"button\"> &\n React.ComponentProps<\"button\"> & {\n showOnHover?: boolean\n }) {\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n className: cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-menu-action\",\n sidebar: \"menu-action\",\n },\n })\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return \\`\\${Math.floor(Math.random() * 40) + 50}%\\`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n render,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: useRender.ComponentProps<\"a\"> &\n React.ComponentProps<\"a\"> & {\n size?: \"sm\" | \"md\"\n isActive?: boolean\n }) {\n return useRender({\n defaultTagName: \"a\",\n props: mergeProps<\"a\">(\n {\n className: cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-menu-sub-button\",\n sidebar: \"menu-sub-button\",\n size,\n active: isActive,\n },\n })\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/skeleton.tsx\",\n template: `import { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/slider.tsx\",\n template: `import { Slider as SliderPrimitive } from \"@base-ui/react/slider\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: SliderPrimitive.Root.Props) {\n const _values = Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max]\n\n return (\n <SliderPrimitive.Root\n className={cn(\"data-horizontal:w-full data-vertical:h-full\", className)}\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n thumbAlignment=\"edge\"\n {...props}\n >\n <SliderPrimitive.Control className=\"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col\">\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted select-none data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1\"\n >\n <SliderPrimitive.Indicator\n data-slot=\"slider-range\"\n className=\"bg-primary select-none data-horizontal:h-full data-vertical:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Control>\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/sonner.tsx\",\n template: `\"use client\"\n\nimport { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\nimport { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from \"lucide-react\"\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n icons={{\n success: (\n <CircleCheckIcon className=\"size-4\" />\n ),\n info: (\n <InfoIcon className=\"size-4\" />\n ),\n warning: (\n <TriangleAlertIcon className=\"size-4\" />\n ),\n error: (\n <OctagonXIcon className=\"size-4\" />\n ),\n loading: (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ),\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/switch.tsx\",\n template: `\"use client\"\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: SwitchPrimitive.Root.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none group-has-[:focus-visible]/field-label:border-transparent group-has-[:focus-visible]/field-label:ring-0 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/table.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/tabs.tsx\",\n template: `\"use client\"\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/textarea.tsx\",\n template: `import * as React from \"react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/toggle-group.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"@base-ui/react/toggle-group\"\nimport { type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { toggleVariants } from \"@<%= projectName %>/ui/components/toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 2,\n orientation: \"horizontal\",\n})\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 2,\n orientation = \"horizontal\",\n children,\n ...props\n}: ToggleGroupPrimitive.Props &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }) {\n return (\n <ToggleGroupPrimitive\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n data-orientation={orientation}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider\n value={{ variant, size, spacing, orientation }}\n >\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant = \"default\",\n size = \"default\",\n ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <TogglePrimitive\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n \"shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t\",\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </TogglePrimitive>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/toggle.tsx\",\n template: `\"use client\"\n\nimport { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nconst toggleVariants = cva(\n \"group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline: \"border border-input bg-transparent hover:bg-muted\",\n },\n size: {\n default:\n \"h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n sm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/tooltip.tsx\",\n template: `\"use client\"\n\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction TooltipProvider({\n delay = 0,\n ...props\n}: TooltipPrimitive.Provider.Props) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n )\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n children,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<\n TooltipPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5\" />\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/mode-toggle.tsx\",\n template: `'use client';\n\nimport { Moon, Sun } from 'lucide-react';\nimport { useTheme } from 'next-themes';\nimport { Button } from '@<%= projectName %>/ui/button';\n\nexport function ModeToggle() {\n const { resolvedTheme, setTheme } = useTheme();\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')}\n >\n <Sun className=\"hidden dark:block\" />\n <Moon className=\"block dark:hidden\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n );\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/attachment.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\n\nconst attachmentVariants = cva(\n \"group/attachment relative flex w-fit max-w-full min-w-0 shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:ring-1 focus-within:ring-ring/50 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed\",\n {\n variants: {\n size: {\n default:\n \"gap-2 text-sm has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2\",\n sm: \"gap-2.5 text-xs has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5\",\n xs: \"gap-1.5 rounded-lg text-xs has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1\",\n },\n orientation: {\n horizontal: \"min-w-40 items-center\",\n vertical: \"w-24 flex-col has-data-[slot=attachment-content]:w-30\",\n },\n },\n }\n)\n\nfunction Attachment({\n className,\n state = \"done\",\n size = \"default\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof attachmentVariants> & {\n state?: \"idle\" | \"uploading\" | \"processing\" | \"error\" | \"done\"\n }) {\n return (\n <div\n data-slot=\"attachment\"\n data-state={state}\n data-size={size}\n data-orientation={orientation}\n className={cn(attachmentVariants({ size, orientation }), className)}\n {...props}\n />\n )\n}\n\nconst attachmentMediaVariants = cva(\n \"relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5\",\n {\n variants: {\n variant: {\n icon: \"\",\n image:\n \"opacity-60 group-data-[state=done]/attachment:opacity-100 group-data-[state=idle]/attachment:opacity-100 *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"icon\",\n },\n }\n)\n\nfunction AttachmentMedia({\n className,\n variant = \"icon\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof attachmentMediaVariants>) {\n return (\n <div\n data-slot=\"attachment-media\"\n data-variant={variant}\n className={cn(attachmentMediaVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AttachmentContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-content\"\n className={cn(\n \"max-w-full min-w-0 flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentTitle({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-title\"\n className={cn(\n \"block max-w-full min-w-0 truncate font-medium group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentDescription({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-description\"\n className={cn(\n \"mt-0.5 block min-w-0 truncate text-xs text-muted-foreground group-data-[state=error]/attachment:text-destructive/80\",\n \"max-w-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentActions({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-actions\"\n className={cn(\n \"relative z-20 flex shrink-0 items-center group-data-[orientation=vertical]/attachment:absolute group-data-[orientation=vertical]/attachment:top-3 group-data-[orientation=vertical]/attachment:right-3 group-data-[orientation=vertical]/attachment:gap-1\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentAction({\n className,\n variant,\n size = \"icon-xs\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n return (\n <Button\n data-slot=\"attachment-action\"\n variant={variant ?? \"ghost\"}\n size={size}\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction AttachmentTrigger({\n className,\n render,\n type,\n ...props\n}: useRender.ComponentProps<\"button\">) {\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n type: render ? type : (type ?? \"button\"),\n className: cn(\"absolute inset-0 z-10 outline-none\", className),\n },\n props\n ),\n render,\n state: {\n slot: \"attachment-trigger\",\n },\n })\n}\n\nfunction AttachmentGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-group\"\n className={cn(\n \"flex min-w-0 scroll-fade-x snap-x snap-mandatory scroll-px-1 scrollbar-none gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Attachment,\n AttachmentGroup,\n AttachmentMedia,\n AttachmentContent,\n AttachmentTitle,\n AttachmentDescription,\n AttachmentActions,\n AttachmentAction,\n AttachmentTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/bubble.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction BubbleGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bubble-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nconst bubbleVariants = cva(\n \"group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full\",\n {\n variants: {\n variant: {\n default:\n \"*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80\",\n secondary:\n \"*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]\",\n muted:\n \"*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]\",\n tinted:\n \"*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)] *:data-[slot=bubble-content]:text-foreground dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)] [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)] dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]\",\n outline:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30\",\n ghost:\n \"border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50\",\n destructive:\n \"*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Bubble({\n variant = \"default\",\n align = \"start\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof bubbleVariants> & {\n align?: \"start\" | \"end\"\n }) {\n return (\n <div\n data-slot=\"bubble\"\n data-variant={variant}\n data-align={align}\n className={cn(bubbleVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction BubbleContent({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"w-fit max-w-full min-w-0 overflow-hidden rounded-xl border border-transparent px-3 py-2 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-ring [button,a]:focus-visible:ring-3 [button,a]:focus-visible:ring-ring/50\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"bubble-content\",\n },\n })\n}\n\nconst bubbleReactionsVariants = cva(\n \"absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0\",\n {\n variants: {\n side: {\n top: \"top-0 -translate-y-3/4\",\n bottom: \"bottom-0 translate-y-3/4\",\n },\n align: {\n start: \"left-3\",\n end: \"right-3\",\n },\n },\n defaultVariants: {\n side: \"bottom\",\n align: \"end\",\n },\n }\n)\n\nfunction BubbleReactions({\n side = \"bottom\",\n align = \"end\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\"\n side?: \"top\" | \"bottom\"\n}) {\n return (\n <div\n data-slot=\"bubble-reactions\"\n data-align={align}\n data-side={side}\n className={cn(bubbleReactionsVariants({ side, align }), className)}\n {...props}\n />\n )\n}\n\nexport { BubbleGroup, Bubble, BubbleContent, BubbleReactions }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/marker.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nconst markerVariants = cva(\n \"group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground\",\n {\n variants: {\n variant: {\n default: \"\",\n separator:\n \"before:mr-1 before:h-px before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-px after:min-w-0 after:flex-1 after:bg-border\",\n border: \"border-b border-border pb-2\",\n },\n },\n }\n)\n\nfunction Marker({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & VariantProps<typeof markerVariants>) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(markerVariants({ variant, className })),\n },\n props\n ),\n render,\n state: {\n slot: \"marker\",\n variant,\n },\n })\n}\n\nfunction MarkerIcon({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-icon\"\n aria-hidden=\"true\"\n className={cn(\n \"size-4 shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MarkerContent({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-content\"\n className={cn(\n \"min-w-0 wrap-break-word group-data-[variant=separator]/marker:flex-none group-data-[variant=separator]/marker:text-center *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Marker, MarkerIcon, MarkerContent, markerVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/message.tsx\",\n template: `import * as React from \"react\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\n\nfunction MessageGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction Message({\n className,\n align = \"start\",\n ...props\n}: React.ComponentProps<\"div\"> & { align?: \"start\" | \"end\" }) {\n return (\n <div\n data-slot=\"message\"\n data-align={align}\n className={cn(\n \"group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageAvatar({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-avatar\"\n className={cn(\n \"flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-content\"\n className={cn(\n \"flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-header\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-footer\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n MessageGroup,\n Message,\n MessageAvatar,\n MessageContent,\n MessageFooter,\n MessageHeader,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/message-scroller.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport {\n MessageScroller as MessageScrollerPrimitive,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\"\n\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { ArrowDownIcon } from \"lucide-react\"\n\nfunction MessageScrollerProvider(\n props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider>\n) {\n return <MessageScrollerPrimitive.Provider {...props} />\n}\n\nfunction MessageScroller({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Root>) {\n return (\n <MessageScrollerPrimitive.Root\n data-slot=\"message-scroller\"\n className={cn(\n \"group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerViewport({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Viewport>) {\n return (\n <MessageScrollerPrimitive.Viewport\n data-slot=\"message-scroller-viewport\"\n className={cn(\n \"size-full min-h-0 min-w-0 scroll-fade-b scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerContent({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Content>) {\n return (\n <MessageScrollerPrimitive.Content\n data-slot=\"message-scroller-content\"\n className={cn(\"flex h-max min-h-full flex-col gap-6\", className)}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerItem({\n className,\n scrollAnchor = false,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Item>) {\n return (\n <MessageScrollerPrimitive.Item\n data-slot=\"message-scroller-item\"\n scrollAnchor={scrollAnchor}\n className={cn(\n \"min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerButton({\n direction = \"end\",\n className,\n children,\n render,\n variant = \"secondary\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Button> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <MessageScrollerPrimitive.Button\n data-slot=\"message-scroller-button\"\n data-direction={direction}\n data-variant={variant}\n data-size={size}\n direction={direction}\n className={cn(\n \"absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180\",\n className\n )}\n render={render ?? <Button variant={variant} size={size} />}\n {...props}\n >\n {children ?? (\n <>\n <ArrowDownIcon\n />\n <span className=\"sr-only\">\n {direction === \"end\" ? \"Scroll to end\" : \"Scroll to start\"}\n </span>\n </>\n )}\n </MessageScrollerPrimitive.Button>\n )\n}\n\nexport {\n MessageScrollerProvider,\n MessageScroller,\n MessageScrollerViewport,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerButton,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n}\n`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport componentsJson from \"./templates/components-json\";\nimport webComponentsJson from \"./templates/web-components-json\";\nimport packageJson from \"./templates/package-json\";\nimport utils from \"./templates/utils\";\nimport useMobile from \"./templates/use-mobile\";\nimport globalsCss from \"./templates/globals-css\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport tsconfig from \"./templates/tsconfig\";\nimport link from \"./templates/link\";\nimport logo from \"./templates/logo\";\nimport layout from \"./templates/layout\";\nimport page from \"./templates/page\";\nimport providers from \"./templates/providers\";\nimport authForm from \"./templates/auth-form\";\nimport accordion from \"./templates/accordion\";\nimport alertDialog from \"./templates/alert-dialog\";\nimport alert from \"./templates/alert\";\nimport aspectRatio from \"./templates/aspect-ratio\";\nimport avatar from \"./templates/avatar\";\nimport badge from \"./templates/badge\";\nimport breadcrumb from \"./templates/breadcrumb\";\nimport button from \"./templates/button\";\nimport calendar from \"./templates/calendar\";\nimport card from \"./templates/card\";\nimport carousel from \"./templates/carousel\";\nimport chart from \"./templates/chart\";\nimport checkbox from \"./templates/checkbox\";\nimport collapsible from \"./templates/collapsible\";\nimport command from \"./templates/command\";\nimport combobox from \"./templates/combobox\";\nimport contextMenu from \"./templates/context-menu\";\nimport dialog from \"./templates/dialog\";\nimport direction from \"./templates/direction\";\nimport drawer from \"./templates/drawer\";\nimport dropdownMenu from \"./templates/dropdown-menu\";\nimport empty from \"./templates/empty\";\nimport field from \"./templates/field\";\nimport hoverCard from \"./templates/hover-card\";\nimport buttonGroup from \"./templates/button-group\";\nimport inputGroup from \"./templates/input-group\";\nimport item from \"./templates/item\";\nimport kbd from \"./templates/kbd\";\nimport nativeSelect from \"./templates/native-select\";\nimport spinner from \"./templates/spinner\";\nimport inputOtp from \"./templates/input-otp\";\nimport input from \"./templates/input\";\nimport label from \"./templates/label\";\nimport menubar from \"./templates/menubar\";\nimport navigationMenu from \"./templates/navigation-menu\";\nimport pagination from \"./templates/pagination\";\nimport popover from \"./templates/popover\";\nimport progress from \"./templates/progress\";\nimport radioGroup from \"./templates/radio-group\";\nimport resizable from \"./templates/resizable\";\nimport scrollArea from \"./templates/scroll-area\";\nimport select from \"./templates/select\";\nimport separator from \"./templates/separator\";\nimport sheet from \"./templates/sheet\";\nimport sidebar from \"./templates/sidebar\";\nimport skeleton from \"./templates/skeleton\";\nimport slider from \"./templates/slider\";\nimport sonner from \"./templates/sonner\";\nimport switchComp from \"./templates/switch\";\nimport table from \"./templates/table\";\nimport tabs from \"./templates/tabs\";\nimport textarea from \"./templates/textarea\";\nimport toggleGroup from \"./templates/toggle-group\";\nimport toggle from \"./templates/toggle\";\nimport tooltip from \"./templates/tooltip\";\nimport modeToggle from \"./templates/mode-toggle\";\nimport attachment from \"./templates/attachment\";\nimport bubble from \"./templates/bubble\";\nimport marker from \"./templates/marker\";\nimport message from \"./templates/message\";\nimport messageScroller from \"./templates/message-scroller\";\n\nconst shadcnUi: Module = {\n templates: [\n packageJson,\n utils,\n useMobile,\n globalsCss,\n postcssConfig,\n tsconfig,\n link,\n logo,\n layout,\n page,\n providers,\n authForm,\n accordion,\n alertDialog,\n alert,\n aspectRatio,\n avatar,\n badge,\n breadcrumb,\n button,\n calendar,\n card,\n carousel,\n chart,\n checkbox,\n collapsible,\n command,\n combobox,\n contextMenu,\n dialog,\n direction,\n drawer,\n dropdownMenu,\n empty,\n field,\n hoverCard,\n buttonGroup,\n inputGroup,\n item,\n kbd,\n nativeSelect,\n spinner,\n inputOtp,\n input,\n label,\n menubar,\n navigationMenu,\n pagination,\n popover,\n progress,\n radioGroup,\n resizable,\n scrollArea,\n select,\n separator,\n sheet,\n sidebar,\n skeleton,\n slider,\n sonner,\n switchComp,\n table,\n tabs,\n textarea,\n toggleGroup,\n toggle,\n tooltip,\n modeToggle,\n attachment,\n bubble,\n marker,\n message,\n messageScroller,\n componentsJson,\n webComponentsJson,\n ],\n packages: [\n {\n package: \"next-themes\",\n module: \"apps/web\",\n version: versions[\"next-themes\"],\n },\n { package: \"sonner\", module: \"apps/web\", version: versions.sonner },\n ],\n};\n\nexport default shadcnUi;\n","export default {\n filename: \"packages/ui/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/ui\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"exports\": {\n \"./globals.css\": \"./src/globals.css\",\n \"./tokens.stylex\": \"./src/tokens.stylex.ts\",\n \"./*\": \"./src/*.tsx\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.0.0\",\n \"react\": \">=19.0.0\",\n \"react-dom\": \">=19.0.0\"\n },\n \"dependencies\": {\n \"@stylexjs/stylex\": \"<%= versions[\"@stylexjs/stylex\"] %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/src/tokens.stylex.ts\",\n template: `import * as stylex from \"@stylexjs/stylex\";\n\nexport const colors = stylex.defineVars({\n background: \"oklch(0.145 0 0)\",\n foreground: \"oklch(0.985 0 0)\",\n muted: \"oklch(0.269 0 0)\",\n mutedForeground: \"oklch(0.708 0 0)\",\n border: \"oklch(0.469 0 0)\",\n accent: \"oklch(0.985 0 0)\",\n accentForeground: \"oklch(0.205 0 0)\",\n danger: \"oklch(0.637 0.237 25.331)\",\n});\n\nexport const fonts = stylex.defineVars({\n sans: \"var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif\",\n mono: \"var(--font-geist-mono), ui-monospace, monospace\",\n});\n\nexport const radii = stylex.defineVars({\n sm: \"6px\",\n md: \"8px\",\n lg: \"12px\",\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/button.tsx\",\n template: `\"use client\";\n\nimport { ReactNode } from \"react\";\nimport * as stylex from \"@stylexjs/stylex\";\nimport type { StyleXStyles } from \"@stylexjs/stylex\";\nimport { colors, fonts, radii } from \"./tokens.stylex\";\n\ninterface ButtonProps {\n children: ReactNode;\n onClick?: () => void;\n type?: \"button\" | \"submit\" | \"reset\";\n disabled?: boolean;\n style?: StyleXStyles;\n}\n\nexport const Button = ({ children, onClick, type = \"button\", disabled, style }: ButtonProps) => {\n return (\n <button\n type={type}\n onClick={onClick}\n disabled={disabled}\n {...stylex.props(styles.base, disabled && styles.disabled, style)}\n >\n {children}\n </button>\n );\n};\n\nconst styles = stylex.create({\n base: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n height: 36,\n paddingBlock: 0,\n paddingInline: 16,\n fontFamily: fonts.sans,\n fontSize: 14,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n color: colors.accentForeground,\n backgroundColor: {\n default: colors.accent,\n \":hover\": \"oklch(0.922 0 0)\",\n },\n borderStyle: \"none\",\n borderRadius: radii.sm,\n boxShadow: \"0 1px 2px rgba(0, 0, 0, 0.3)\",\n cursor: \"pointer\",\n transitionProperty: \"background-color\",\n transitionDuration: \"150ms\",\n outlineColor: \"rgba(255, 255, 255, 0.5)\",\n outlineOffset: 2,\n outlineStyle: {\n default: \"none\",\n \":focus-visible\": \"solid\",\n },\n outlineWidth: 2,\n },\n disabled: {\n opacity: 0.5,\n pointerEvents: \"none\",\n },\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/link.tsx\",\n template: `import NextLink, { type LinkProps } from \"next/link\";\nimport { type PropsWithChildren } from \"react\";\nimport * as stylex from \"@stylexjs/stylex\";\nimport type { StyleXStyles } from \"@stylexjs/stylex\";\nimport { colors } from \"./tokens.stylex\";\n\nexport function Link({\n href,\n children,\n style,\n ...rest\n}: PropsWithChildren<LinkProps & { style?: StyleXStyles }>) {\n return (\n <NextLink href={href} {...rest} {...stylex.props(styles.link, style)}>\n {children}\n </NextLink>\n );\n}\n\nconst styles = stylex.create({\n link: {\n color: \"inherit\",\n textDecorationLine: \"underline\",\n textDecorationColor: {\n default: colors.mutedForeground,\n \":hover\": colors.foreground,\n },\n transitionProperty: \"text-decoration-color\",\n transitionDuration: \"150ms\",\n },\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/logo.tsx\",\n template: `import * as stylex from \"@stylexjs/stylex\";\nimport type { StyleXStyles } from \"@stylexjs/stylex\";\nimport { colors } from \"./tokens.stylex\";\n\ninterface LogoProps {\n style?: StyleXStyles;\n}\n\nexport function Logo({ style }: LogoProps) {\n return (\n <svg\n width=\"196\"\n height=\"138\"\n viewBox=\"0 0 196 138\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...stylex.props(styles.logo, style)}\n >\n <path\n d=\"M98 35C102.665 35 107.243 35.2232 111.707 35.6514C111.243 38.1972 111 40.8202 111 43.5C111 67.5244 130.476 87 154.5 87C165.156 87 174.914 83.1658 182.478 76.8057C183.476 79.9455 184 83.186 184 86.5C184 114.943 145.496 138 98 138C50.5035 138 12 114.943 12 86.5C12 83.1861 12.5228 79.9454 13.5215 76.8057C21.0851 83.1661 30.8441 87 41.5 87C65.5244 87 85 67.5244 85 43.5C85 40.8202 84.7559 38.1973 84.292 35.6514C88.7559 35.2232 93.3345 35 98 35ZM38.5 0C59.763 0 77 17.237 77 38.5C77 59.763 59.763 77 38.5 77C17.237 77 0 59.763 0 38.5C0 17.237 17.237 0 38.5 0ZM157.5 0C178.763 0 196 17.237 196 38.5C196 59.763 178.763 77 157.5 77C136.237 77 119 59.763 119 38.5C119 17.237 136.237 0 157.5 0Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nconst styles = stylex.create({\n logo: {\n color: colors.foreground,\n },\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/globals.css\",\n template: `@layer resets {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n * {\n margin: 0;\n padding: 0;\n }\n\n html,\n body {\n height: 100%;\n }\n\n html {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n}\n\n@stylex;\n`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"di-only\",\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\",\n \"typecheck\": \"next typegen && tsc --noEmit\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@stylexjs/stylex\": \"<%= versions[\"@stylexjs/stylex\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@stylexjs/babel-plugin\": \"<%= versions[\"@stylexjs/babel-plugin\"] %>\",\n \"@stylexjs/postcss-plugin\": \"<%= versions[\"@stylexjs/postcss-plugin\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\",\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/api\": \"workspace:*\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"@stylexjs/stylex\": \"<%= versions[\"@stylexjs/stylex\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@babel/plugin-proposal-decorators\": \"<%= versions[\"@babel/plugin-proposal-decorators\"] %>\",\n \"@babel/plugin-transform-class-properties\": \"<%= versions[\"@babel/plugin-transform-class-properties\"] %>\",\n \"babel-plugin-transform-typescript-metadata\": \"<%= versions[\"babel-plugin-transform-typescript-metadata\"] %>\",\n \"@stylexjs/babel-plugin\": \"<%= versions[\"@stylexjs/babel-plugin\"] %>\",\n \"@stylexjs/postcss-plugin\": \"<%= versions[\"@stylexjs/postcss-plugin\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/web/babel.config.js\",\n template: `import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst config = {\n presets: [\"next/babel\"],\n plugins: [\n<% if (nest === 'di-only') { %> \"babel-plugin-transform-typescript-metadata\",\n [\"@babel/plugin-proposal-decorators\", { version: \"legacy\" }],\n [\"@babel/plugin-transform-class-properties\", { loose: true }],\n<% } %> [\n \"@stylexjs/babel-plugin\",\n {\n dev: process.env.NODE_ENV !== \"production\",\n runtimeInjection: false,\n treeshakeCompensation: true,\n unstable_moduleResolution: {\n type: \"commonJS\",\n rootDir: path.join(dirname, \"../..\"),\n },\n },\n ],\n ],\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"apps/web/postcss.config.mjs\",\n template: `import babelConfig from \"./babel.config.js\";\n\nconst config = {\n plugins: {\n \"@stylexjs/postcss-plugin\": {\n include: [\n \"app/**/*.{js,jsx,ts,tsx}\",\n \"../../packages/ui/src/**/*.{js,jsx,ts,tsx}\",\n ],\n babelConfig: {\n babelrc: false,\n parserOpts: { plugins: [\"typescript\", \"jsx\"] },\n plugins: babelConfig.plugins,\n },\n useCSSLayers: true,\n },\n },\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"apps/web/app/layout.tsx\",\n template: `import type { Metadata } from \"next\";\nimport localFont from \"next/font/local\";\nimport * as stylex from \"@stylexjs/stylex\";\nimport Providers from \"@/app/providers\";\nimport { colors, fonts } from \"@<%= projectName %>/ui/tokens.stylex\";\nimport \"@<%= projectName %>/ui/globals.css\";\n\nconst geistSans = localFont({\n src: \"./fonts/GeistVF.woff\",\n variable: \"--font-geist-sans\",\n});\nconst geistMono = localFont({\n src: \"./fonts/GeistMonoVF.woff\",\n variable: \"--font-geist-mono\",\n});\n\nexport const metadata: Metadata = {\n title: \"<%= projectName %>\",\n description: \"Next + Nest = Newt\",\n icons: {\n icon: [\n { url: \"/icon0.svg\", type: \"image/svg+xml\" },\n { url: \"/icon1.png\", type: \"image/png\" },\n ],\n apple: \"/apple-icon.png\",\n },\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\" className={\\`\\${geistSans.variable} \\${geistMono.variable}\\`}>\n <body {...stylex.props(styles.body)}>\n <Providers>{children}</Providers>\n </body>\n </html>\n );\n}\n\nconst styles = stylex.create({\n body: {\n backgroundColor: colors.background,\n color: colors.foreground,\n fontFamily: fonts.sans,\n },\n});\n`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { colors, fonts, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello'],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main {...stylex.props(styles.main)}>\n <div {...stylex.props(styles.header)}>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/page.tsx</p>\n <p {...stylex.props(styles.muted)}>Delete me to get started!</p>\n </div>\n\n <div {...stylex.props(styles.titleRow)}>\n <Logo style={styles.logo} />\n <div>\n <h1 {...stylex.props(styles.h1)}><%= projectName %></h1>\n <p {...stylex.props(styles.muted, styles.tagline)}>\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>next.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/layout.tsx</p>\n <p {...stylex.props(styles.muted)}>Next.js rendering</p>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>nest.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>GET /api/hello</p>\n <pre {...stylex.props(styles.pre)}>\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow, styles.eyebrowSpaced)}>better-auth</p>\n {isPending ? (\n <p {...stylex.props(styles.muted)}>Loading…</p>\n ) : session ? (\n <div {...stylex.props(styles.signedIn)}>\n <p>Signed in as {session.user.name}</p>\n <Button onClick={() => void authClient.signOut()}>\n Sign out\n </Button>\n </div>\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div {...stylex.props(styles.footer)}>\n <p {...stylex.props(styles.muted)}>Learn more</p>\n <ul {...stylex.props(styles.list)}>\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}\n\nconst styles = stylex.create({\n main: {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n maxWidth: '32rem',\n minHeight: '100%',\n marginInline: 'auto',\n paddingBlock: '2rem',\n paddingInline: '1rem',\n fontSize: '0.875rem',\n },\n header: {\n paddingBottom: '1rem',\n borderBottomColor: colors.border,\n borderBottomStyle: 'solid',\n borderBottomWidth: 1,\n },\n titleRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n paddingBlock: '0.5rem',\n },\n logo: {\n width: '2.5rem',\n height: 'auto',\n },\n h1: {\n fontSize: '2.25rem',\n fontWeight: 900,\n letterSpacing: '-0.025em',\n },\n tagline: {\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n },\n card: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n padding: '1.5rem',\n borderColor: colors.border,\n borderRadius: radii.lg,\n borderStyle: 'solid',\n borderWidth: 1,\n },\n eyebrow: {\n fontFamily: fonts.mono,\n fontSize: '0.75rem',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n color: colors.mutedForeground,\n },\n eyebrowSpaced: {\n marginBottom: '0.75rem',\n },\n pre: {\n marginTop: '0.5rem',\n padding: '0.75rem',\n fontFamily: fonts.mono,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: colors.border,\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n overflowX: 'auto',\n },\n signedIn: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: '0.75rem',\n },\n footer: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n paddingBlock: '1rem',\n paddingInline: '0.5rem',\n },\n list: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n listStylePosition: 'inside',\n listStyleType: 'disc',\n },\n mono: {\n fontFamily: fonts.mono,\n },\n muted: {\n color: colors.mutedForeground,\n },\n});\n`,\n};\n","export default {\n filename: \"apps/web/app/auth-form.tsx\",\n template: `'use client';\n\nimport { useForm } from '@tanstack/react-form';\nimport { useState } from 'react';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { colors, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\nexport function AuthForm() {\n const [tab, setTab] = useState<'signin' | 'signup'>('signup');\n const [error, setError] = useState('');\n\n const form = useForm({\n defaultValues: { name: '', email: '', password: '' },\n onSubmit: async ({ value }) => {\n setError('');\n if (tab === 'signin') {\n const { error } = await authClient.signIn.email(value);\n if (error) setError(error.message ?? 'Sign in failed');\n } else {\n const { error } = await authClient.signUp.email(value);\n if (error) setError(error.message ?? 'Sign up failed');\n }\n },\n });\n\n return (\n <>\n <div {...stylex.props(styles.tabs)}>\n <button\n onClick={() => setTab('signup')}\n {...stylex.props(styles.tab, tab === 'signup' && styles.tabActive)}\n >\n Sign up\n </button>\n <span {...stylex.props(styles.divider)}>|</span>\n <button\n onClick={() => setTab('signin')}\n {...stylex.props(styles.tab, tab === 'signin' && styles.tabActive)}\n >\n Sign in\n </button>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n {...stylex.props(styles.form)}\n >\n {tab === 'signup' && (\n <form.Field name=\"name\">\n {(field) => (\n <div {...stylex.props(styles.field)}>\n <label {...stylex.props(styles.label)}>Name</label>\n <input\n type=\"text\"\n autoComplete=\"name\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n {...stylex.props(styles.input)}\n />\n </div>\n )}\n </form.Field>\n )}\n\n <form.Field name=\"email\">\n {(field) => (\n <div {...stylex.props(styles.field)}>\n <label {...stylex.props(styles.label)}>Email</label>\n <input\n type=\"email\"\n autoComplete=\"email\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n {...stylex.props(styles.input)}\n />\n </div>\n )}\n </form.Field>\n\n <form.Field name=\"password\">\n {(field) => (\n <div {...stylex.props(styles.field)}>\n <label {...stylex.props(styles.label)}>Password</label>\n <input\n type=\"password\"\n autoComplete={\n tab === 'signin' ? 'current-password' : 'new-password'\n }\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n minLength={8}\n {...stylex.props(styles.input)}\n />\n </div>\n )}\n </form.Field>\n\n {error && <p {...stylex.props(styles.error)}>{error}</p>}\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting} style={styles.submit}>\n {isSubmitting\n ? 'Loading…'\n : tab === 'signin'\n ? 'Sign in'\n : 'Create account'}\n </Button>\n )}\n </form.Subscribe>\n </form>\n </>\n );\n}\n\nconst styles = stylex.create({\n tabs: {\n display: 'flex',\n gap: '0.5rem',\n marginBottom: '1.5rem',\n fontSize: '0.875rem',\n },\n tab: {\n color: {\n default: colors.mutedForeground,\n ':hover': colors.foreground,\n },\n backgroundColor: 'transparent',\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n fontFamily: 'inherit',\n fontSize: 'inherit',\n },\n tabActive: {\n color: colors.foreground,\n fontWeight: 600,\n },\n divider: {\n color: colors.border,\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n },\n field: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n },\n label: {\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n input: {\n width: '100%',\n height: 36,\n paddingBlock: '0.25rem',\n paddingInline: '0.75rem',\n fontFamily: 'inherit',\n fontSize: '0.875rem',\n color: colors.foreground,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: {\n default: colors.border,\n ':focus-visible': colors.mutedForeground,\n },\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n outlineStyle: 'none',\n transitionProperty: 'border-color',\n transitionDuration: '150ms',\n },\n error: {\n fontSize: '0.875rem',\n color: colors.danger,\n },\n submit: {\n width: '100%',\n },\n});\n`,\n};\n","import type { Module } from \"../types\";\nimport tsconfig from \"../ui/templates/tsconfig\";\nimport packageJson from \"./templates/package-json\";\nimport tokens from \"./templates/tokens\";\nimport button from \"./templates/button\";\nimport link from \"./templates/link\";\nimport logo from \"./templates/logo\";\nimport globalsCss from \"./templates/globals-css\";\nimport webPackageJson from \"./templates/web-package-json\";\nimport webPackageJsonDi from \"./templates/web-package-json-di\";\nimport babelConfig from \"./templates/babel-config\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport layout from \"./templates/layout\";\nimport page from \"./templates/page\";\nimport authForm from \"./templates/auth-form\";\n\n// StyleX compiles styles out of the source that authors them, so the app owns\n// the babel and postcss config: the include globs have to reach back into\n// packages/ui, and Next's babel loader only reads a config next to the app.\nconst stylexUi: Module = {\n templates: [\n packageJson,\n tokens,\n button,\n link,\n logo,\n globalsCss,\n tsconfig,\n webPackageJson,\n webPackageJsonDi,\n babelConfig,\n postcssConfig,\n layout,\n page,\n authForm,\n ],\n};\n\nexport default stylexUi;\n","export default {\n filename: \"packages/eslint-config/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/eslint-config\",\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"private\": true,\n \"exports\": {\n \"./base\": \"./base.js\",\n \"./next-js\": \"./next.js\",\n \"./react-internal\": \"./react-internal.js\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"<%= versions[\"@eslint/js\"] %>\",\n \"@next/eslint-plugin-next\": \"<%= versions[\"@next/eslint-plugin-next\"] %>\",\n \"eslint\": \"<%= versions.eslint %>\",\n \"eslint-config-prettier\": \"<%= versions[\"eslint-config-prettier\"] %>\",\n \"eslint-plugin-only-warn\": \"<%= versions[\"eslint-plugin-only-warn\"] %>\",\n \"eslint-plugin-react\": \"<%= versions[\"eslint-plugin-react\"] %>\",\n \"eslint-plugin-react-hooks\": \"<%= versions[\"eslint-plugin-react-hooks\"] %>\",\n \"eslint-plugin-turbo\": \"<%= versions[\"eslint-plugin-turbo\"] %>\",\n \"globals\": \"<%= versions.globals %>\",\n \"typescript\": \"<%= versions.typescript %>\",\n \"typescript-eslint\": \"<%= versions[\"typescript-eslint\"] %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/eslint-config/base.js\",\n template: `import js from \"@eslint/js\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\nimport turboPlugin from \"eslint-plugin-turbo\";\nimport tseslint from \"typescript-eslint\";\nimport onlyWarn from \"eslint-plugin-only-warn\";\n\n/**\n * A shared ESLint configuration for the repository.\n *\n * @type {import(\"eslint\").Linter.Config[]}\n * */\nexport const config = [\n js.configs.recommended,\n eslintConfigPrettier,\n ...tseslint.configs.recommended,\n {\n plugins: {\n turbo: turboPlugin,\n },\n rules: {\n \"turbo/no-undeclared-env-vars\": \"warn\",\n },\n },\n {\n plugins: {\n onlyWarn,\n },\n },\n {\n ignores: [\"dist/**\"],\n },\n];`,\n};\n","export default {\n filename: \"packages/eslint-config/next.js\",\n template: `import js from \"@eslint/js\";\nimport { globalIgnores } from \"eslint/config\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\nimport tseslint from \"typescript-eslint\";\nimport pluginReactHooks from \"eslint-plugin-react-hooks\";\nimport pluginReact from \"eslint-plugin-react\";\nimport globals from \"globals\";\nimport pluginNext from \"@next/eslint-plugin-next\";\nimport { config as baseConfig } from \"./base.js\";\n\n/**\n * A custom ESLint configuration for libraries that use Next.js.\n *\n * @type {import(\"eslint\").Linter.Config[]}\n * */\nexport const nextJsConfig = [\n ...baseConfig,\n js.configs.recommended,\n eslintConfigPrettier,\n ...tseslint.configs.recommended,\n globalIgnores([\n // Default ignores of eslint-config-next:\n \".next/**\",\n \"out/**\",\n \"build/**\",\n \"next-env.d.ts\",\n ]),\n {\n ...pluginReact.configs.flat.recommended,\n languageOptions: {\n ...pluginReact.configs.flat.recommended.languageOptions,\n globals: {\n ...globals.serviceworker,\n ...globals.node,\n },\n },\n },\n {\n plugins: {\n \"@next/next\": pluginNext,\n },\n rules: {\n ...pluginNext.configs.recommended.rules,\n ...pluginNext.configs[\"core-web-vitals\"].rules,\n },\n },\n {\n plugins: {\n \"react-hooks\": pluginReactHooks,\n },\n settings: { react: { version: \"detect\" } },\n rules: {\n ...pluginReactHooks.configs.recommended.rules,\n // React scope no longer necessary with new JSX transform.\n \"react/react-in-jsx-scope\": \"off\",\n },\n },\n];`,\n};\n","export default {\n filename: \"packages/eslint-config/react-internal.js\",\n template: `import js from \"@eslint/js\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\nimport tseslint from \"typescript-eslint\";\nimport pluginReactHooks from \"eslint-plugin-react-hooks\";\nimport pluginReact from \"eslint-plugin-react\";\nimport globals from \"globals\";\nimport { config as baseConfig } from \"./base.js\";\n\n/**\n * A custom ESLint configuration for libraries that use React.\n *\n * @type {import(\"eslint\").Linter.Config[]} */\nexport const config = [\n ...baseConfig,\n js.configs.recommended,\n eslintConfigPrettier,\n ...tseslint.configs.recommended,\n pluginReact.configs.flat.recommended,\n {\n languageOptions: {\n ...pluginReact.configs.flat.recommended.languageOptions,\n globals: {\n ...globals.serviceworker,\n ...globals.browser,\n },\n },\n },\n {\n plugins: {\n \"react-hooks\": pluginReactHooks,\n },\n settings: { react: { version: \"detect\" } },\n rules: {\n ...pluginReactHooks.configs.recommended.rules,\n // React scope no longer necessary with new JSX transform.\n \"react/react-in-jsx-scope\": \"off\",\n \"react/prop-types\": \"off\",\n },\n },\n];`,\n};\n","export default {\n filename: \"apps/web/eslint.config.js\",\n template: `import { nextJsConfig } from \"@<%= projectName %>/eslint-config/next-js\";\n\n/** @type {import(\"eslint\").Linter.Config[]} */\nexport default nextJsConfig;`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"off\",\n filename: \"apps/api/eslint.config.mjs\",\n template: `// @ts-check\nimport eslint from '@eslint/js';\nimport prettierConfig from 'eslint-config-prettier';\nimport globals from 'globals';\nimport tseslint from 'typescript-eslint';\n\nexport default tseslint.config(\n {\n ignores: ['eslint.config.mjs'],\n },\n eslint.configs.recommended,\n ...tseslint.configs.recommendedTypeChecked,\n prettierConfig,\n {\n languageOptions: {\n globals: {\n ...globals.node,\n ...globals.<%= testing %>,\n },\n sourceType: 'commonjs',\n parserOptions: {\n projectService: true,\n tsconfigRootDir: import.meta.dirname,\n },\n },\n },\n {\n rules: {\n '@typescript-eslint/no-explicit-any': 'off',\n '@typescript-eslint/no-floating-promises': 'warn',\n '@typescript-eslint/no-unsafe-argument': 'warn',\n },\n },\n);`,\n};\n","export default {\n filename: \"packages/ui/eslint.config.mjs\",\n template: `import { config } from \"@<%= projectName %>/eslint-config/react-internal\";\n\n/** @type {import(\"eslint\").Linter.Config} */\nexport default config;`,\n};\n","export default {\n filename: \".prettierrc\",\n template: `{}`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport packageJson from \"./templates/package-json\";\nimport base from \"./templates/base\";\nimport next from \"./templates/next\";\nimport reactInternal from \"./templates/react-internal\";\nimport webConfig from \"../web/templates/eslint-config\";\nimport apiConfig from \"../api/templates/eslint-config\";\nimport uiConfig from \"../ui/templates/eslint-config\";\nimport prettierrc from \"../root/templates/prettierrc\";\n\nconst web = \"apps/web\";\nconst api = \"apps/api\";\nconst ui = \"packages/ui\";\nconst root = \"\";\n\nconst eslintConfig: Module = {\n templates: [packageJson, base, next, reactInternal, webConfig, apiConfig, uiConfig, prettierrc],\n packages: [\n { package: \"eslint\", module: web, version: versions.eslint, dev: true },\n {\n package: \"@<%= projectName %>/eslint-config\",\n module: web,\n version: \"workspace:*\",\n dev: true,\n },\n {\n package: \"@eslint/js\",\n module: api,\n version: versions[\"@eslint/js\"],\n dev: true,\n },\n { package: \"eslint\", module: api, version: versions.eslint, dev: true },\n {\n package: \"eslint-config-prettier\",\n module: api,\n version: versions[\"eslint-config-prettier\"],\n dev: true,\n },\n { package: \"globals\", module: api, version: versions.globals, dev: true },\n {\n package: \"typescript-eslint\",\n module: api,\n version: versions[\"typescript-eslint\"],\n dev: true,\n },\n { package: \"eslint\", module: ui, version: versions.eslint, dev: true },\n {\n package: \"@<%= projectName %>/eslint-config\",\n module: ui,\n version: \"workspace:*\",\n dev: true,\n },\n {\n package: \"prettier\",\n module: root,\n version: versions.prettier,\n dev: true,\n },\n ],\n scripts: [\n {\n module: web,\n name: \"lint\",\n script: \"eslint --fix && next typegen && tsc --noEmit\",\n },\n {\n module: web,\n name: \"lint:check\",\n script: \"eslint --max-warnings 0 && next typegen && tsc --noEmit\",\n },\n { module: api, name: \"lint\", script: `eslint \"src/**/*.ts\" --fix` },\n { module: api, name: \"lint:check\", script: `eslint \"src/**/*.ts\" --max-warnings 0` },\n { module: ui, name: \"lint\", script: \"eslint . --fix\" },\n { module: ui, name: \"lint:check\", script: \"eslint . --max-warnings 0\" },\n { module: root, name: \"lint:check\", script: \"turbo run lint:check\" },\n {\n module: root,\n name: \"format\",\n script: `prettier --write \"**/*.{ts,tsx,js,jsx,json,md,yaml,yml}\"`,\n },\n {\n module: root,\n name: \"format:check\",\n script: `prettier --check \"**/*.{ts,tsx,js,jsx,json,md,yaml,yml}\"`,\n },\n ],\n};\n\nexport default eslintConfig;\n","export default {\n filename: \".oxlintrc.json\",\n template: `{\n \"$schema\": \"https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json\",\n \"categories\": {\n \"correctness\": \"error\"\n }<% if (antiSlop) { %>,\n \"ignorePatterns\": [\"tools/oxlint/anti-slop/**\"],\n \"jsPlugins\": [{ \"name\": \"anti-slop\", \"specifier\": \"./tools/oxlint/anti-slop/index.ts\" }],\n \"rules\": {\n \"anti-slop/no-chained-type-assertions\": \"error\",\n \"anti-slop/no-conditional-empty-object-spread\": \"error\",\n \"anti-slop/no-known-value-widening\": \"error\",\n \"anti-slop/no-module-mocking\": \"error\",\n \"anti-slop/no-object-parameters\": \"error\",\n \"anti-slop/no-reflect-apply\": \"error\",\n \"anti-slop/no-reflect-get\": \"error\",\n \"anti-slop/no-runtime-typeof\": \"error\",\n \"anti-slop/no-shape-in-symbol-names\": \"error\",\n \"anti-slop/no-unknown-parameters\": \"error\",\n \"anti-slop/no-unknown-returns\": \"error\",\n \"anti-slop/no-unknown-type-aliases\": \"error\",\n \"anti-slop/no-unsafe-dictionary-type\": \"error\",\n \"anti-slop/no-widen-then-assert\": \"error\",\n \"anti-slop/require-safety-comment-for-type-assertion\": \"error\"\n }<% if (shadcn) { %>,\n \"overrides\": [\n {\n \"files\": [\"packages/ui/src/components/**\"],\n \"rules\": {\n \"anti-slop/no-chained-type-assertions\": \"off\",\n \"anti-slop/no-conditional-empty-object-spread\": \"off\",\n \"anti-slop/no-known-value-widening\": \"off\",\n \"anti-slop/no-module-mocking\": \"off\",\n \"anti-slop/no-object-parameters\": \"off\",\n \"anti-slop/no-reflect-apply\": \"off\",\n \"anti-slop/no-reflect-get\": \"off\",\n \"anti-slop/no-runtime-typeof\": \"off\",\n \"anti-slop/no-shape-in-symbol-names\": \"off\",\n \"anti-slop/no-unknown-parameters\": \"off\",\n \"anti-slop/no-unknown-returns\": \"off\",\n \"anti-slop/no-unknown-type-aliases\": \"off\",\n \"anti-slop/no-unsafe-dictionary-type\": \"off\",\n \"anti-slop/no-widen-then-assert\": \"off\",\n \"anti-slop/require-safety-comment-for-type-assertion\": \"off\"\n }\n }\n ]<% } %><% } %>\n}`,\n};\n","export default {\n filename: \".oxfmtrc.json\",\n template: `{\n \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n \"ignorePatterns\": [<% if (antiSlop) { %>\"tools/oxlint/anti-slop/\"<% } %>]\n}`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport oxlintrc from \"./templates/oxlintrc\";\nimport oxfmtrc from \"./templates/oxfmtrc\";\n\nconst root = \"\";\n\n// oxlint reads the nearest config per file and covers the whole tree in one\n// pass, so it runs once from the root rather than as a task per workspace.\nconst oxc: Module = {\n templates: [oxlintrc, oxfmtrc],\n packages: [\n { package: \"oxlint\", module: root, version: versions.oxlint, dev: true },\n { package: \"oxfmt\", module: root, version: versions.oxfmt, dev: true },\n ],\n scripts: [\n { module: root, name: \"lint\", script: \"oxlint --fix\" },\n { module: root, name: \"lint:check\", script: \"oxlint\" },\n { module: root, name: \"format\", script: \"oxfmt\" },\n { module: root, name: \"format:check\", script: \"oxfmt --check\" },\n ],\n};\n\nexport default oxc;\n","export default {\n filename: \"tools/oxlint/anti-slop/package.json\",\n template: `{\n \"type\": \"module\"\n}`,\n};\n","export default {\n filename: \"tools/oxlint/anti-slop/README.md\",\n template: `# anti-slop\n\nOxlint rules that reject low-evidence TypeScript patterns, vendored from\n[dmmulroy/anti-slop](https://github.com/dmmulroy/anti-slop) at \\`6d538555cb15\\` (MIT, see LICENSE).\n\nUpstream ships these to be vendored rather than depended on, so these files are\nyours: read them, change the messages, delete the rules you disagree with.\n\n\\`.oxlintrc.json\\` registers the plugin and turns every rule on as an error.\nTurn one off there:\n\n\\`\\`\\`json\n{\n \"rules\": {\n \"anti-slop/no-runtime-typeof\": \"off\"\n }\n}\n\\`\\`\\`\n\nVendored shadcn components under \\`packages/ui/src/components\\` are exempt, since\nthey are upstream code you re-pull rather than write.\n`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport pluginPackageJson from \"./templates/plugin-package-json\";\nimport pluginReadme from \"./templates/plugin-readme\";\n\nconst plugin = \"tools/oxlint/anti-slop\";\n\n// Upstream publishes nothing to npm, and oxlint needs the directory marked ESM.\nconst antiSlop: Module = {\n templates: [pluginPackageJson, pluginReadme],\n staticFiles: [\n { src: \"anti-slop/static/LICENSE\", filename: `${plugin}/LICENSE` },\n { src: \"anti-slop/static/index.ts\", filename: `${plugin}/index.ts` },\n {\n src: \"anti-slop/static/rules/no-chained-type-assertions.ts\",\n filename: `${plugin}/rules/no-chained-type-assertions.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-conditional-empty-object-spread.ts\",\n filename: `${plugin}/rules/no-conditional-empty-object-spread.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-known-value-widening.ts\",\n filename: `${plugin}/rules/no-known-value-widening.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-module-mocking.ts\",\n filename: `${plugin}/rules/no-module-mocking.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-object-parameters.ts\",\n filename: `${plugin}/rules/no-object-parameters.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-reflect-apply.ts\",\n filename: `${plugin}/rules/no-reflect-apply.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-reflect-get.ts\",\n filename: `${plugin}/rules/no-reflect-get.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-runtime-typeof.ts\",\n filename: `${plugin}/rules/no-runtime-typeof.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-shape-in-symbol-names.ts\",\n filename: `${plugin}/rules/no-shape-in-symbol-names.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unknown-parameters.ts\",\n filename: `${plugin}/rules/no-unknown-parameters.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unknown-returns.ts\",\n filename: `${plugin}/rules/no-unknown-returns.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unknown-type-aliases.ts\",\n filename: `${plugin}/rules/no-unknown-type-aliases.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unsafe-dictionary-type.ts\",\n filename: `${plugin}/rules/no-unsafe-dictionary-type.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-widen-then-assert.ts\",\n filename: `${plugin}/rules/no-widen-then-assert.ts`,\n },\n {\n src: \"anti-slop/static/rules/require-safety-comment-for-type-assertion.ts\",\n filename: `${plugin}/rules/require-safety-comment-for-type-assertion.ts`,\n },\n {\n src: \"anti-slop/static/shared/dictionary-types.ts\",\n filename: `${plugin}/shared/dictionary-types.ts`,\n },\n {\n src: \"anti-slop/static/shared/lexical-type-parameters.ts\",\n filename: `${plugin}/shared/lexical-type-parameters.ts`,\n },\n {\n src: \"anti-slop/static/shared/reflect-method.ts\",\n filename: `${plugin}/shared/reflect-method.ts`,\n },\n ],\n packages: [\n {\n package: \"@oxlint/plugins\",\n module: \"\",\n version: versions[\"@oxlint/plugins\"],\n dev: true,\n },\n ],\n};\n\nexport default antiSlop;\n","export default {\n filename: \"packages/typescript-config/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/typescript-config\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"license\": \"MIT\",\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}`,\n};\n","export default {\n filename: \"packages/typescript-config/base.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/tsconfig\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"esModuleInterop\": true,\n \"incremental\": false,\n \"isolatedModules\": true,\n \"lib\": [\"es2022\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"NodeNext\",\n \"moduleDetection\": \"force\",\n \"moduleResolution\": \"NodeNext\",\n \"noUncheckedIndexedAccess\": true,\n \"resolveJsonModule\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\"\n }\n}`,\n};\n","export default {\n filename: \"packages/typescript-config/nextjs.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/tsconfig\",\n \"extends\": \"./base.json\",\n \"compilerOptions\": {\n \"plugins\": [{ \"name\": \"next\" }],\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"allowJs\": true,\n \"jsx\": \"preserve\",\n \"noEmit\": true\n }\n}`,\n};\n","export default {\n filename: \"packages/typescript-config/react-library.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/tsconfig\",\n \"extends\": \"./base.json\",\n \"compilerOptions\": {\n \"jsx\": \"react-jsx\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\"\n }\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport base from \"./templates/base\";\nimport nextjs from \"./templates/nextjs\";\nimport reactLibrary from \"./templates/react-library\";\n\nconst typescriptConfig: Module = {\n templates: [packageJson, base, nextjs, reactLibrary],\n};\n\nexport default typescriptConfig;\n","export default {\n filename: \"apps/api/jest.config.ts\",\n template: `import type { Config } from 'jest';\n\nexport default {\n moduleFileExtensions: ['js', 'json', 'ts'],\n rootDir: 'src',\n testRegex: '.*\\\\\\\\.spec\\\\\\\\.ts$',\n transform: {\n // Under nodenext ts-jest follows each package's \"type\", so it would emit\n // packages/db as ESM, which jest's CommonJS runtime can't require\n '^.+\\\\\\\\.(t|j)s$': ['ts-jest', { tsconfig: { module: 'commonjs' } }],\n },\n collectCoverageFrom: ['**/*.(t|j)s'],\n coverageDirectory: '../coverage',\n testEnvironment: 'node',\n moduleNameMapper: {\n '^@thallesp/nestjs-better-auth$': '<rootDir>/../__mocks__/@thallesp/nestjs-better-auth.js',\n },\n} satisfies Config;`,\n};\n","export default {\n filename: \"apps/api/test/jest-e2e.json\",\n template: `{\n \"moduleFileExtensions\": [\"js\", \"mjs\", \"json\", \"ts\"],\n \"rootDir\": \".\",\n \"testEnvironment\": \"node\",\n \"testRegex\": \".e2e-spec.ts$\",\n \"extensionsToTreatAsEsm\": [\".ts\"],\n \"transform\": {\n \"^.+\\\\\\\\.ts$\": [\"ts-jest\", { \"useESM\": true, \"tsconfig\": { \"module\": \"esnext\" } }]\n },\n \"transformIgnorePatterns\": [\"node_modules/(?!.*\\\\\\\\.mjs$)\"]\n}`,\n};\n","export default {\n filename: \"apps/api/test/app.e2e-spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { INestApplication } from '@nestjs/common';\nimport request from 'supertest';\nimport { App } from 'supertest/types';\nimport { AppModule } from './../src/app.module';\n\ndescribe('AppController (e2e)', () => {\n let app: INestApplication<App>;\n\n beforeEach(async () => {\n const moduleFixture: TestingModule = await Test.createTestingModule({\n imports: [AppModule],\n }).compile();\n\n app = moduleFixture.createNestApplication();\n await app.init();\n });\n\n it('/hello (GET)', () => {\n return request(app.getHttpServer())\n .get('/hello')\n .expect(200)\n .expect({ message: 'Hello from Nest' });\n });\n});`,\n};\n","export default {\n filename: \"apps/api/__mocks__/@thallesp/nestjs-better-auth.js\",\n template: `// Mock for @thallesp/nestjs-better-auth — ESM-only package, incompatible with ts-jest CJS mode\nconst noop = () => () => {};\n\nmodule.exports = {\n AllowAnonymous: noop,\n RequireAuth: noop,\n Session: noop,\n AuthGuard: class AuthGuard {},\n BetterAuthModule: { forRoot: noop, forRootAsync: noop },\n};\n`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport jestConfig from \"./templates/jest-config\";\nimport jestE2eConfig from \"./templates/jest-e2e-config\";\nimport e2eSpec from \"./templates/e2e-spec\";\nimport nestjsBetterAuthMock from \"./templates/nestjs-better-auth-mock\";\n\nconst testingJest: Module = {\n templates: [jestConfig, jestE2eConfig, e2eSpec, nestjsBetterAuthMock],\n packages: [\n { package: \"jest\", module: \"apps/api\", version: versions.jest, dev: true },\n {\n package: \"ts-jest\",\n module: \"apps/api\",\n version: versions[\"ts-jest\"],\n dev: true,\n },\n {\n package: \"@types/jest\",\n module: \"apps/api\",\n version: versions[\"@types/jest\"],\n dev: true,\n },\n ],\n scripts: [\n { module: \"apps/api\", name: \"test\", script: \"jest\" },\n { module: \"apps/api\", name: \"test:watch\", script: \"jest --watch\" },\n { module: \"apps/api\", name: \"test:cov\", script: \"jest --coverage\" },\n {\n module: \"apps/api\",\n name: \"test:debug\",\n script: \"node --inspect-brk node_modules/.bin/jest --runInBand\",\n },\n {\n module: \"apps/api\",\n name: \"test:e2e\",\n script: \"NODE_OPTIONS=--experimental-vm-modules jest --config ./test/jest-e2e.json\",\n },\n ],\n};\n\nexport default testingJest;\n","export default {\n filename: \"apps/api/vitest.config.mts\",\n template: `import swc from 'unplugin-swc';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n test: {\n globals: true,\n root: './',\n },\n plugins: [\n swc.vite({\n module: { type: 'es6' },\n }),\n ],\n});`,\n};\n","export default {\n filename: \"apps/api/vitest.config.e2e.mts\",\n template: `import swc from 'unplugin-swc';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n test: {\n include: ['**/*.e2e-spec.ts'],\n globals: true,\n root: './',\n },\n plugins: [swc.vite()],\n});`,\n};\n","export default {\n filename: \"apps/api/test/app.e2e-spec.ts\",\n template: `import { describe, it, beforeEach } from 'vitest';\nimport { Test, TestingModule } from '@nestjs/testing';\nimport { INestApplication } from '@nestjs/common';\nimport request from 'supertest';\nimport { App } from 'supertest/types';\nimport { AppModule } from './../src/app.module';\n\ndescribe('AppController (e2e)', () => {\n let app: INestApplication<App>;\n\n beforeEach(async () => {\n const moduleFixture: TestingModule = await Test.createTestingModule({\n imports: [AppModule],\n }).compile();\n\n app = moduleFixture.createNestApplication();\n await app.init();\n });\n\n it('/hello (GET)', () => {\n return request(app.getHttpServer())\n .get('/hello')\n .expect(200)\n .expect({ message: 'Hello from Nest' });\n });\n});`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport vitestConfig from \"./templates/vitest-config\";\nimport vitestConfigE2e from \"./templates/vitest-config-e2e\";\nimport e2eSpec from \"./templates/e2e-spec\";\n\nconst testingVitest: Module = {\n templates: [vitestConfig, vitestConfigE2e, e2eSpec],\n packages: [\n {\n package: \"vitest\",\n module: \"apps/api\",\n version: versions.vitest,\n dev: true,\n },\n {\n package: \"@vitest/coverage-v8\",\n module: \"apps/api\",\n version: versions[\"@vitest/coverage-v8\"],\n dev: true,\n },\n {\n package: \"unplugin-swc\",\n module: \"apps/api\",\n version: versions[\"unplugin-swc\"],\n dev: true,\n },\n {\n package: \"@swc/core\",\n module: \"apps/api\",\n version: versions[\"@swc/core\"],\n dev: true,\n },\n ],\n scripts: [\n { module: \"apps/api\", name: \"test\", script: \"vitest run\" },\n { module: \"apps/api\", name: \"test:watch\", script: \"vitest\" },\n { module: \"apps/api\", name: \"test:cov\", script: \"vitest run --coverage\" },\n {\n module: \"apps/api\",\n name: \"test:debug\",\n script: \"vitest --inspect-brk --inspect --logHeapUsage --threads=false\",\n },\n {\n module: \"apps/api\",\n name: \"test:e2e\",\n script: \"vitest run --config ./vitest.config.e2e.mts\",\n },\n ],\n};\n\nexport default testingVitest;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"Dockerfile\",\n template: `FROM node:24-alpine AS base\nENV PNPM_HOME=\"/pnpm\"\nENV PATH=\"$PNPM_HOME:$PATH\"\nRUN corepack enable\n\nFROM base AS build\nWORKDIR /app\nCOPY . .\nRUN pnpm install --frozen-lockfile\nARG API_HOST=localhost\nENV API_HOST=$API_HOST\nRUN pnpm build --filter=web --filter=api --filter=@<%= projectName %>/auth\n\n# --- web ---\nFROM base AS web\nWORKDIR /app\nENV NODE_ENV=production\nCOPY --from=build /app/apps/web/.next/standalone ./\nCOPY --from=build /app/apps/web/.next/static ./apps/web/.next/static\nCOPY --from=build /app/apps/web/public ./apps/web/public\nEXPOSE 3000\nCMD [\"node\", \"apps/web/server.js\"]\n\n# --- api ---\nFROM build AS api\nWORKDIR /app/apps/api\nENV NODE_ENV=production\nEXPOSE 3001\nCMD [\"node\", \"dist/main\"]\n\n# --- migrate ---\nFROM build AS migrate\nWORKDIR /app\nCMD [\"pnpm\", \"db:migrate\"]`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"docker-compose.yml\",\n template: `x-app-env: &app-env\n BETTER_AUTH_SECRET: \\${BETTER_AUTH_SECRET}\n # Better Auth trusts this origin; without it every deployment falls back to\n # localhost:3000 and rejects requests from the real one.\n BETTER_AUTH_URL: \\${BETTER_AUTH_URL:-http://localhost:3000}\n<% if (database === 'postgres') { %> DATABASE_URL: postgresql://postgres:\\${POSTGRES_PASSWORD:-postgres}@db:5432/postgres\n<% } else { %> DATABASE_URL: /data/app.db\n<% } %>\nservices:\n web:\n build:\n context: .\n target: web\n args:\n - API_HOST=api\n ports:\n - \"3000:3000\"\n environment:\n <<: *app-env\n<% if (database === 'sqlite') { %> volumes:\n - db_data:/data\n<% } -%>\n depends_on:\n - api\n\n migrate:\n build:\n context: .\n target: migrate\n environment:\n <<: *app-env\n<% if (database === 'postgres') { %> depends_on:\n db:\n condition: service_healthy\n<% } else { %> volumes:\n - db_data:/data\n<% } -%>\n restart: \"no\"\n\n api:\n build:\n context: .\n target: api\n ports:\n - \"3001:3001\"\n environment:\n <<: *app-env\n<% if (database === 'sqlite') { %> volumes:\n - db_data:/data\n<% } -%>\n depends_on:\n<% if (database === 'postgres') { %> db:\n condition: service_healthy\n<% } -%>\n migrate:\n condition: service_completed_successfully\n\n<% if (database === 'postgres') { %> db:\n image: postgres:17-alpine\n ports:\n - \"5432:5432\"\n environment:\n - POSTGRES_PASSWORD=\\${POSTGRES_PASSWORD:-postgres}\n volumes:\n - db_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n<% } -%>\nvolumes:\n db_data:`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n output: \"standalone\",\n async rewrites() {\n return [\n {\n source: '/api/:path*',\n destination: \\`http://\\${process.env.API_HOST ?? 'localhost'}:3001/api/:path*\\`,\n },\n ];\n },\n};\n\nexport default nextConfig;`,\n};\n","export default {\n filename: \"turbo.json\",\n template: `{\n \"$schema\": \"https://turborepo.dev/schema.json\",\n \"ui\": \"tui\",\n \"tasks\": {\n \"build\": {\n \"dependsOn\": [\"^build\"],\n \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n \"env\": [\"API_HOST\", \"DATABASE_URL\"],\n \"outputs\": [\".next/**\", \"!.next/cache/**\", \"dist/**\"]\n },\n \"typecheck\": {\n \"dependsOn\": [\"^build\"]\n },<% if (linter !== \"oxc\") { %>\n \"lint\": {\n \"dependsOn\": [\"^lint\"],\n \"env\": [\"NODE_ENV\"]\n },\n \"lint:check\": {\n \"dependsOn\": [\"^lint:check\"],\n \"env\": [\"NODE_ENV\"]\n },<% } %>\n \"test\": {\n \"dependsOn\": [\"^build\"]\n },\n \"dev\": {\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false,\n \"persistent\": true\n },\n \"migrate\": {\n \"env\": [\"DATABASE_URL\"],\n \"dependsOn\": [\"^migrate\"],\n \"cache\": false\n },\n \"generate\": {\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false\n }\n }\n}`,\n};\n","import type { Module } from \"../types\";\nimport dockerfile from \"./templates/dockerfile\";\nimport dockerCompose from \"./templates/docker-compose\";\nimport nextConfig from \"./templates/next-config\";\nimport turboJson from \"./templates/turbo-json\";\n\nconst deploymentStandalone: Module = {\n templates: [dockerfile, dockerCompose, nextConfig, turboJson],\n};\n\nexport default deploymentStandalone;\n","export default {\n filename: \"apps/api/package.json\",\n template: `{\n \"name\": \"api\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"nest build\",\n \"start\": \"nest start\",\n \"dev\": \"nest start --watch\",\n \"start:debug\": \"nest start --debug --watch\",\n \"start:prod\": \"node dist/main\"\n },\n \"dependencies\": {\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"@nestjs/platform-express\": \"<%= versions[\"@nestjs/platform-express\"] %>\",\n \"@nestjs/serve-static\": \"<%= versions[\"@nestjs/serve-static\"] %>\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@thallesp/nestjs-better-auth\": \"<%= versions[\"@thallesp/nestjs-better-auth\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"rxjs\": \"<%= versions.rxjs %>\"\n },\n \"devDependencies\": {\n \"@nestjs/cli\": \"<%= versions[\"@nestjs/cli\"] %>\",\n \"@nestjs/schematics\": \"<%= versions[\"@nestjs/schematics\"] %>\",\n \"@nestjs/testing\": \"<%= versions[\"@nestjs/testing\"] %>\",\n \"@types/express\": \"<%= versions[\"@types/express\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/supertest\": \"<%= versions[\"@types/supertest\"] %>\",\n \"supertest\": \"<%= versions.supertest %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\nconst isProduction = process.env.NODE_ENV === 'production';\n\n// Static export in production — served by NestJS via ServeStaticModule.\n// rewrites() is incompatible with output: \"export\", so dev uses the proxy\n// and production uses the static files.\n/** @type {import('next').NextConfig} */\nconst nextConfig = isProduction\n ? { output: 'export' }\n : {\n async rewrites() {\n return [\n {\n source: '/api/:path*',\n destination: 'http://localhost:3001/api/:path*',\n },\n ];\n },\n };\n\nexport default nextConfig;`,\n};\n","import type { Module } from \"../types\";\nimport apiPackageJson from \"./templates/api-package-json\";\nimport webNextConfig from \"./templates/web-next-config\";\n\n// app.module.ts is not templated here: api-controllers and todo-example both\n// write that file and land after this module, so anything emitted here is\n// overwritten. Those templates add ServeStaticModule when deployment is 'spa'.\nconst singleProcessStaticExport: Module = {\n templates: [apiPackageJson, webNextConfig],\n};\n\nexport default singleProcessStaticExport;\n","export default {\n filename: \"apps/api/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/api\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"build\": \"nest build\"\n },\n \"dependencies\": {\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@thallesp/nestjs-better-auth\": \"<%= versions[\"@thallesp/nestjs-better-auth\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"rxjs\": \"<%= versions.rxjs %>\"\n },\n \"devDependencies\": {\n \"@nestjs/cli\": \"<%= versions[\"@nestjs/cli\"] %>\",\n \"@nestjs/schematics\": \"<%= versions[\"@nestjs/schematics\"] %>\",\n \"@nestjs/testing\": \"<%= versions[\"@nestjs/testing\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/api/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"module\": \"nodenext\",\n \"moduleResolution\": \"nodenext\",\n \"resolvePackageJsonExports\": true,\n \"esModuleInterop\": true,\n \"isolatedModules\": true,\n \"declaration\": true,\n \"removeComments\": true,\n \"emitDecoratorMetadata\": true,\n \"experimentalDecorators\": true,\n \"allowSyntheticDefaultImports\": true,\n \"target\": \"ES2023\",\n \"sourceMap\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"skipLibCheck\": true,\n \"strictNullChecks\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noImplicitAny\": false,\n \"strictBindCallApply\": false,\n \"noFallthroughCasesInSwitch\": false,\n \"types\": [<% if (testing === 'jest') { %>\"jest\", <% } %><% if (testing === 'vitest') { %>\"vitest/globals\", <% } %>\"node\"]\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"apps/api/src/index.ts\",\n template: `export { AppModule } from './app.module';\nexport { AppService } from './app.service';`,\n};\n","export default {\n filename: \"apps/web/lib/nest.ts\",\n template: `import 'reflect-metadata';\nimport { NestFactory } from '@nestjs/core';\nimport { AppModule } from '@<%= projectName %>/api';\nimport type { INestApplicationContext, Type, Abstract } from '@nestjs/common';\n\nlet context: INestApplicationContext | null = null;\n\nexport async function getContext(): Promise<INestApplicationContext> {\n if (!context) {\n context = await NestFactory.createApplicationContext(AppModule, {\n logger: false,\n });\n }\n return context;\n}\n\nexport async function inject<T>(token: Type<T> | Abstract<T> | string | symbol): Promise<T> {\n const ctx = await getContext();\n return ctx.get<T>(token);\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.stylex,\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/api\": \"workspace:*\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment !== \"standalone\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n serverExternalPackages: [\n '@<%= projectName %>/api',\n '@<%= projectName %>/db',\n '@nestjs/core',\n '@nestjs/common',\n '@nestjs/microservices',\n '@nestjs/websockets',\n '@thallesp/nestjs-better-auth',\n 'reflect-metadata',\n 'express',\n ],\n};\n\nexport default nextConfig;`,\n};\n","export default {\n filename: \"apps/web/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/nextjs.json\",\n \"compilerOptions\": {\n \"plugins\": [\n {\n \"name\": \"next\"\n }\n ],\n \"strictNullChecks\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\n \"**/*.ts\",\n \"**/*.tsx\",\n \"next-env.d.ts\",\n \"next.config.js\",\n \".next/types/**/*.ts\"\n ],\n \"exclude\": [\"node_modules\"]\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/hello/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { inject } from '@/lib/nest';\nimport { AppService } from '@<%= projectName %>/api';\n\nexport async function GET() {\n const appService = await inject(AppService);\n return NextResponse.json({ message: appService.getHello() });\n}`,\n};\n","import type { Module } from \"../types\";\nimport apiPackageJson from \"./templates/api-package-json\";\nimport apiTsconfig from \"./templates/api-tsconfig\";\nimport apiIndex from \"./templates/api-index\";\nimport webNestContext from \"./templates/web-nest-context\";\nimport webPackageJson from \"./templates/web-package-json\";\nimport webNextConfig from \"./templates/web-next-config\";\nimport webTsconfig from \"./templates/web-tsconfig\";\nimport webHelloRoute from \"./templates/web-hello-route\";\nconst nestDiOnly: Module = {\n templates: [\n apiPackageJson,\n apiTsconfig,\n apiIndex,\n webNestContext,\n webHelloRoute,\n webPackageJson,\n webNextConfig,\n webTsconfig,\n ],\n};\n\nexport default nestDiOnly;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment === \"none\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n// No /api rewrite: there is no second process, so Next serves /api itself.\n/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nexport default nextConfig;`,\n};\n","export default {\n filename: \"apps/web/app/api/hello/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { auth } from '@<%= projectName %>/auth';\n\nexport async function GET() {\n const session = await auth.api.getSession({ headers: await headers() });\n return NextResponse.json({\n message: session?.user.name ? \\`Hello \\${session.user.name}\\` : 'Hello from Next',\n });\n}`,\n};\n","import type { Module } from \"../types\";\nimport webNextConfig from \"./templates/web-next-config\";\nimport webHelloRoute from \"./templates/web-hello-route\";\n\n// Everything apps/api used to supply, written straight into apps/web: the\n// /api/hello handler and a next.config with nothing to proxy to.\nconst nestOff: Module = {\n templates: [webNextConfig, webHelloRoute],\n};\n\nexport default nestOff;\n","export default {\n filename: \"Dockerfile\",\n template: `FROM node:24-alpine AS base\nENV PNPM_HOME=\"/pnpm\"\nENV PATH=\"$PNPM_HOME:$PATH\"\nRUN corepack enable\n\nFROM base AS build\nWORKDIR /app\nCOPY . .\nRUN pnpm install --frozen-lockfile\nRUN pnpm build --filter=web<% if (nest === 'di-only') { %> --filter=@<%= projectName %>/api<% } %> --filter=@<%= projectName %>/auth\n\n# --- web ---\n# One image: <% if (nest === 'di-only') { %>Nest is wired into the Next.js server rather than bootstrapped\n# on its own port<% } else { %>Next.js serves /api itself<% } %>, so there is no separate api stage.\nFROM base AS web\nWORKDIR /app\nENV NODE_ENV=production\nCOPY --from=build /app/apps/web/.next/standalone ./\nCOPY --from=build /app/apps/web/.next/static ./apps/web/.next/static\nCOPY --from=build /app/apps/web/public ./apps/web/public\nEXPOSE 3000\nCMD [\"node\", \"apps/web/server.js\"]\n\n# --- migrate ---\nFROM build AS migrate\nWORKDIR /app\nCMD [\"pnpm\", \"db:migrate\"]`,\n};\n","export default {\n filename: \"docker-compose.yml\",\n template: `x-app-env: &app-env\n BETTER_AUTH_SECRET: \\${BETTER_AUTH_SECRET}\n # Better Auth trusts this origin; without it every deployment falls back to\n # localhost:3000 and rejects requests from the real one.\n BETTER_AUTH_URL: \\${BETTER_AUTH_URL:-http://localhost:3000}\n<% if (database === 'postgres') { %> DATABASE_URL: postgresql://postgres:\\${POSTGRES_PASSWORD:-postgres}@db:5432/postgres\n<% } else { %> DATABASE_URL: /data/app.db\n<% } %>\nservices:\n web:\n build:\n context: .\n target: web\n ports:\n - \"3000:3000\"\n environment:\n <<: *app-env\n<% if (database === 'sqlite') { %> volumes:\n - db_data:/data\n<% } -%>\n depends_on:\n<% if (database === 'postgres') { %> db:\n condition: service_healthy\n<% } -%>\n migrate:\n condition: service_completed_successfully\n\n migrate:\n build:\n context: .\n target: migrate\n environment:\n <<: *app-env\n<% if (database === 'postgres') { %> depends_on:\n db:\n condition: service_healthy\n<% } else { %> volumes:\n - db_data:/data\n<% } -%>\n restart: \"no\"\n\n<% if (database === 'postgres') { %> db:\n image: postgres:17-alpine\n ports:\n - \"5432:5432\"\n environment:\n - POSTGRES_PASSWORD=\\${POSTGRES_PASSWORD:-postgres}\n volumes:\n - db_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n<% } -%>\nvolumes:\n db_data:`,\n};\n","export default {\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n// No /api rewrite: Next serves /api itself, so there is no api container to\n// proxy to.\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n output: \"standalone\",<% if (nest === 'di-only') { %>\n serverExternalPackages: [\n '@<%= projectName %>/api',\n '@<%= projectName %>/db',\n '@nestjs/core',\n '@nestjs/common',\n '@nestjs/microservices',\n '@nestjs/websockets',\n '@thallesp/nestjs-better-auth',\n 'reflect-metadata',\n 'express',\n ],<% } %>\n};\n\nexport default nextConfig;`,\n};\n","import type { Module } from \"../types\";\nimport dockerfile from \"./templates/dockerfile\";\nimport dockerCompose from \"./templates/docker-compose\";\nimport nextConfig from \"./templates/next-config\";\n\n// The standalone deployment for the two modes with no api container: di-only\n// runs Nest inside the Next.js process and off has no Nest at all. Composed\n// after nest-di-only and nest-off, which otherwise overwrite the standalone\n// next.config.js and drop `output: \"standalone\"`.\nconst deploymentStandaloneWeb: Module = {\n templates: [dockerfile, dockerCompose, nextConfig],\n};\n\nexport default deploymentStandaloneWeb;\n","export default {\n filename: \"apps/api/src/app.controller.ts\",\n template: `import { Controller, Get } from '@nestjs/common';\nimport {\n AllowAnonymous,\n Session,\n UserSession,\n} from '@thallesp/nestjs-better-auth';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @AllowAnonymous()\n @Get('hello')\n getHello(@Session() session: UserSession | null) {\n if (session?.user.name) {\n return { message: \\`Hello \\${session.user.name}\\` };\n }\n\n return { message: this.appService.getHello() };\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/app.controller.spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\ndescribe('AppController', () => {\n let appController: AppController;\n\n beforeEach(async () => {\n const app: TestingModule = await Test.createTestingModule({\n controllers: [AppController],\n providers: [AppService],\n }).compile();\n\n appController = app.get<AppController>(AppController);\n });\n\n it('should be defined', () => {\n expect(appController).toBeDefined();\n });\n});`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\" && !s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `<% if (deployment === 'spa') { %>import { join } from 'path';\n<% } %>import { Module } from '@nestjs/common';\n<% if (deployment === 'spa') { %>import { ServeStaticModule } from '@nestjs/serve-static';\n<% } %>import { AuthModule } from '@thallesp/nestjs-better-auth';\nimport { auth } from '@<%= projectName %>/auth';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\n@Module({\n<% if (deployment === 'spa') { %> imports: [\n // serves apps/web's static export; the api runs from apps/api\n ServeStaticModule.forRoot({\n rootPath: join(process.cwd(), '../web/out'),\n exclude: ['/api/{*splat}', '/{*path}.:ext'],\n }),\n AuthModule.forRoot({ auth }),\n ],\n<% } else { %> imports: [AuthModule.forRoot({ auth })],\n<% } -%>\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","export default {\n filename: \"apps/api/src/main.ts\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\nimport { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.create(AppModule, { bodyParser: false });\n app.setGlobalPrefix('api');\n app.enableCors({\n origin: process.env.CORS_ORIGIN ?? 'http://localhost:3000',\n credentials: true,\n });\n await app.listen(process.env.PORT ?? 3001);\n}\nvoid bootstrap();`,\n};\n","import type { Module } from \"../types\";\nimport appController from \"./templates/app-controller\";\nimport appControllerSpec from \"./templates/app-controller-spec\";\nimport appModule from \"./templates/app-module\";\nimport main from \"../api/templates/main\";\n\nconst apiControllers: Module = {\n templates: [appController, appControllerSpec, appModule, main],\n};\n\nexport default apiControllers;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\",\n filename: \"apps/api/src/todos/todos.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { TodosService } from './todos.service';\n\n@Module({\n providers: [TodosService],\n exports: [TodosService],\n})\nexport class TodosModule {}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.service.ts\",\n template: `import { Injectable, NotFoundException } from '@nestjs/common';\nimport { randomUUID } from 'node:crypto';\nimport { db } from '@<%= projectName %>/db';\n\nexport interface Todo {\n id: string;\n title: string;\n done: boolean;\n createdAt: string;\n}\n\nconst columns = ['id', 'title', 'done', 'createdAt'] as const;\n\n@Injectable()\nexport class TodosService {\n async findAll(userId: string): Promise<Todo[]> {\n const rows = await db\n .selectFrom('todo')\n .select(columns)\n .where('userId', '=', userId)\n .orderBy('createdAt desc')\n .execute();\n return rows.map((row) => ({ ...row, done: Boolean(row.done) }));\n }\n\n async create(userId: string, title: string): Promise<Todo> {\n const id = randomUUID();\n await db.insertInto('todo').values({ id, userId, title }).execute();\n const row = await db\n .selectFrom('todo')\n .select(columns)\n .where('id', '=', id)\n .executeTakeFirstOrThrow();\n return { ...row, done: Boolean(row.done) };\n }\n\n async toggle(userId: string, id: string): Promise<Todo> {\n const current = await db\n .selectFrom('todo')\n .select('done')\n .where('id', '=', id)\n .where('userId', '=', userId)\n .executeTakeFirst();\n if (!current) throw new NotFoundException('Todo ' + id + ' not found');\n await db\n .updateTable('todo')\n .set({ done: current.done ? 0 : 1 })\n .where('id', '=', id)\n .where('userId', '=', userId)\n .execute();\n const row = await db\n .selectFrom('todo')\n .select(columns)\n .where('id', '=', id)\n .executeTakeFirstOrThrow();\n return { ...row, done: Boolean(row.done) };\n }\n\n async remove(userId: string, id: string): Promise<void> {\n const result = await db\n .deleteFrom('todo')\n .where('id', '=', id)\n .where('userId', '=', userId)\n .executeTakeFirst();\n if (!result.numDeletedRows) {\n throw new NotFoundException('Todo ' + id + ' not found');\n }\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.service.spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { TodosService } from './todos.service';\n\ndescribe('TodosService', () => {\n let service: TodosService;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [TodosService],\n }).compile();\n\n service = module.get<TodosService>(TodosService);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n});`,\n};\n","export default {\n filename: \"packages/db/src/schema.ts\",\n template: `import type { Generated } from \"kysely\";\n<% const date = database === 'postgres' ? 'Date' : 'string'; const bool = database === 'postgres' ? 'boolean' : 'number'; -%>\n\nexport interface TodoTable {\n id: string;\n userId: string;\n title: string;\n done: Generated<number>;\n createdAt: Generated<string>;\n}\n\nexport interface UserTable {\n id: string;\n name: string;\n email: string;\n emailVerified: <%= bool %>;\n image: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface SessionTable {\n id: string;\n expiresAt: <%= date %>;\n token: string;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n ipAddress: string | null;\n userAgent: string | null;\n userId: string;\n}\n\nexport interface AccountTable {\n id: string;\n issuer: string;\n accountId: string;\n providerId: string;\n userId: string;\n accessToken: string | null;\n refreshToken: string | null;\n idToken: string | null;\n accessTokenExpiresAt: <%= date %> | null;\n refreshTokenExpiresAt: <%= date %> | null;\n scope: string | null;\n password: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface VerificationTable {\n id: string;\n identifier: string;\n value: string;\n expiresAt: <%= date %>;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface DB {\n account: AccountTable;\n session: SessionTable;\n todo: TodoTable;\n user: UserTable;\n verification: VerificationTable;\n}`,\n};\n","export default {\n filename: \"packages/db/src/migrations/0001_create_todos.ts\",\n template: `import { Kysely, sql } from \"kysely\";\n\nexport async function up(db: Kysely<any>): Promise<void> {\n await db.schema\n .createTable(\"todo\")\n .addColumn(\"id\", \"text\", (c) => c.primaryKey())\n .addColumn(\"userId\", \"text\", (c) => c.notNull())\n .addColumn(\"title\", \"text\", (c) => c.notNull())\n .addColumn(\"done\", \"integer\", (c) => c.notNull().defaultTo(0))\n .addColumn(\"createdAt\", \"text\", (c) =>\n c.notNull().defaultTo(sql\\`CURRENT_TIMESTAMP\\`),\n )\n .execute();\n}\n\nexport async function down(db: Kysely<any>): Promise<void> {\n await db.schema.dropTable(\"todo\").execute();\n}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.controller.ts\",\n template: `import {\n Body,\n Controller,\n Delete,\n Get,\n Param,\n Patch,\n Post,\n} from '@nestjs/common';\nimport { Session } from '@thallesp/nestjs-better-auth';\nimport type { UserSession } from '@thallesp/nestjs-better-auth';\nimport { TodosService } from './todos.service';\n\n@Controller('todos')\nexport class TodosController {\n constructor(private readonly todosService: TodosService) {}\n\n @Get()\n findAll(@Session() session: UserSession) {\n return this.todosService.findAll(session.user.id);\n }\n\n @Post()\n create(@Session() session: UserSession, @Body('title') title: string) {\n return this.todosService.create(session.user.id, title);\n }\n\n @Patch(':id/toggle')\n toggle(@Session() session: UserSession, @Param('id') id: string) {\n return this.todosService.toggle(session.user.id, id);\n }\n\n @Delete(':id')\n remove(@Session() session: UserSession, @Param('id') id: string) {\n return this.todosService.remove(session.user.id, id);\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { TodosController } from './todos.controller';\nimport { TodosService } from './todos.service';\n\n@Module({\n controllers: [TodosController],\n providers: [TodosService],\n})\nexport class TodosModule {}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\" && s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `<% if (deployment === 'spa') { %>import { join } from 'path';\n<% } %>import { Module } from '@nestjs/common';\n<% if (deployment === 'spa') { %>import { ServeStaticModule } from '@nestjs/serve-static';\n<% } %>import { AuthModule } from '@thallesp/nestjs-better-auth';\nimport { auth } from '@<%= projectName %>/auth';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport { TodosModule } from './todos/todos.module';\n\n@Module({\n<% if (deployment === 'spa') { %> imports: [\n // serves apps/web's static export; the api runs from apps/api\n ServeStaticModule.forRoot({\n rootPath: join(process.cwd(), '../web/out'),\n exclude: ['/api/{*splat}', '/{*path}.:ext'],\n }),\n AuthModule.forRoot({ auth }),\n TodosModule,\n ],\n<% } else { %> imports: [AuthModule.forRoot({ auth }), TodosModule],\n<% } -%>\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\" && s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { AppService } from './app.service';\nimport { TodosModule } from './todos/todos.module';\n\n@Module({\n imports: [TodosModule],\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","export default {\n filename: \"apps/api/src/index.ts\",\n template: `export { AppModule } from './app.module';\nexport { AppService } from './app.service';\nexport { TodosService } from './todos/todos.service';\nexport type { Todo } from './todos/todos.service';`,\n};\n","export default {\n filename: \"apps/web/app/api/todos/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { inject } from '@/lib/nest';\nimport { auth } from '@<%= projectName %>/auth';\nimport { TodosService } from '@<%= projectName %>/api';\n\nexport async function GET() {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const todos = await inject(TodosService);\n return NextResponse.json(await todos.findAll(session.user.id));\n}\n\nexport async function POST(req: Request) {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const { title } = await req.json();\n const todos = await inject(TodosService);\n return NextResponse.json(await todos.create(session.user.id, title), {\n status: 201,\n });\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/todos/[id]/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { inject } from '@/lib/nest';\nimport { auth } from '@<%= projectName %>/auth';\nimport { TodosService } from '@<%= projectName %>/api';\n\nexport async function DELETE(_req: Request, { params }: { params: Promise<{ id: string }> }) {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const { id } = await params;\n const todos = await inject(TodosService);\n await todos.remove(session.user.id, id);\n return new NextResponse(null, { status: 204 });\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/todos/[id]/toggle/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { inject } from '@/lib/nest';\nimport { auth } from '@<%= projectName %>/auth';\nimport { TodosService } from '@<%= projectName %>/api';\n\nexport async function PATCH(_req: Request, { params }: { params: Promise<{ id: string }> }) {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const { id } = await params;\n const todos = await inject(TodosService);\n return NextResponse.json(await todos.toggle(session.user.id, id));\n}`,\n};\n","export default {\n filename: \"apps/web/app/todo-list.tsx\",\n template: `'use client';\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useForm } from '@tanstack/react-form';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\n\ninterface Todo {\n id: string;\n title: string;\n done: boolean;\n}\n\nconst api = {\n getTodos: (): Promise<Todo[]> => fetch('/api/todos').then((r) => r.json()),\n createTodo: (title: string): Promise<Todo> =>\n fetch('/api/todos', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n }).then((r) => r.json()),\n toggleTodo: (id: string): Promise<Todo> =>\n fetch(\\`/api/todos/\\${id}/toggle\\`, { method: 'PATCH' }).then((r) => r.json()),\n deleteTodo: (id: string): Promise<void> =>\n fetch(\\`/api/todos/\\${id}\\`, { method: 'DELETE' }).then(() => undefined),\n};\n\nexport function TodoList({\n session,\n}: {\n session: { user: { email: string } };\n}) {\n const queryClient = useQueryClient();\n\n const { data: todos = [], isPending } = useQuery({\n queryKey: ['todos'],\n queryFn: api.getTodos,\n });\n\n const createMutation = useMutation({\n mutationFn: api.createTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const toggleMutation = useMutation({\n mutationFn: api.toggleTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const deleteMutation = useMutation({\n mutationFn: api.deleteTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const form = useForm({\n defaultValues: { title: '' },\n onSubmit: async ({ value }) => {\n if (!value.title.trim()) return;\n createMutation.mutate(value.title.trim());\n form.reset();\n },\n });\n\n return (\n <>\n <div className=\"flex items-center justify-between mb-8\">\n <h1 className=\"text-2xl font-semibold\">Todos</h1>\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\n <span>{session.user.email}</span>\n <button\n className=\"hover:text-gray-100\"\n onClick={() => authClient.signOut()}\n >\n Sign out\n </button>\n </div>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"flex gap-2 mb-6\"\n >\n <form.Field name=\"title\">\n {(field) => (\n <input\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"New todo…\"\n className=\"flex h-9 flex-1 rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n )}\n </form.Field>\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting || createMutation.isPending}>\n Add\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : (\n <ul className=\"divide-y divide-neutral-700\">\n {todos.map((todo) => (\n <li key={todo.id} className=\"flex items-center gap-3 py-3\">\n <input\n type=\"checkbox\"\n checked={todo.done}\n onChange={() => toggleMutation.mutate(todo.id)}\n />\n <span\n className={\\`flex-1 text-sm \\${todo.done ? 'line-through text-muted-foreground' : ''}\\`}\n >\n {todo.title}\n </span>\n <button\n onClick={() => deleteMutation.mutate(todo.id)}\n className=\"text-gray-600 hover:text-red-400 text-lg leading-none\"\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {!isPending && todos.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No todos yet.</p>\n )}\n </>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.todoExample && !s.shadcn && !s.stylex,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { TodoList } from '@/app/todo-list';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello'],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b\">\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto text-foreground\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">next.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">nest.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 border rounded-md p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"rounded-xl border p-6\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground mb-4\">better-auth</p>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <TodoList session={session} />\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/todo-list.tsx\",\n template: `'use client';\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useForm } from '@tanstack/react-form';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Input } from '@<%= projectName %>/ui/input';\nimport { Checkbox } from '@<%= projectName %>/ui/checkbox';\n\ninterface Todo {\n id: string;\n title: string;\n done: boolean;\n}\n\nconst api = {\n getTodos: (): Promise<Todo[]> => fetch('/api/todos').then((r) => r.json()),\n createTodo: (title: string): Promise<Todo> =>\n fetch('/api/todos', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n }).then((r) => r.json()),\n toggleTodo: (id: string): Promise<Todo> =>\n fetch(\\`/api/todos/\\${id}/toggle\\`, { method: 'PATCH' }).then((r) => r.json()),\n deleteTodo: (id: string): Promise<void> =>\n fetch(\\`/api/todos/\\${id}\\`, { method: 'DELETE' }).then(() => undefined),\n};\n\nexport function TodoList({\n session,\n}: {\n session: { user: { email: string } };\n}) {\n const queryClient = useQueryClient();\n\n const { data: todos = [], isPending } = useQuery({\n queryKey: ['todos'],\n queryFn: api.getTodos,\n });\n\n const createMutation = useMutation({\n mutationFn: api.createTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const toggleMutation = useMutation({\n mutationFn: api.toggleTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const deleteMutation = useMutation({\n mutationFn: api.deleteTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const form = useForm({\n defaultValues: { title: '' },\n onSubmit: async ({ value }) => {\n if (!value.title.trim()) return;\n createMutation.mutate(value.title.trim());\n form.reset();\n },\n });\n\n return (\n <>\n <div className=\"flex items-center justify-between mb-6\">\n <h1 className=\"text-2xl font-semibold\">Todos</h1>\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\n <span>{session.user.email}</span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => authClient.signOut()}\n >\n Sign out\n </Button>\n </div>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"flex gap-2 mb-6\"\n >\n <form.Field name=\"title\">\n {(field) => (\n <Input\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"New todo…\"\n className=\"flex-1\"\n />\n )}\n </form.Field>\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting || createMutation.isPending}>\n Add\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : (\n <ul className=\"divide-y divide-border\">\n {todos.map((todo) => (\n <li key={todo.id} className=\"flex items-center gap-3 py-3\">\n <Checkbox\n checked={todo.done}\n onCheckedChange={() => toggleMutation.mutate(todo.id)}\n />\n <span\n className={\\`flex-1 text-sm \\${todo.done ? 'line-through text-muted-foreground' : ''}\\`}\n >\n {todo.title}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => deleteMutation.mutate(todo.id)}\n className=\"text-muted-foreground hover:text-destructive h-7 w-7 p-0\"\n >\n ×\n </Button>\n </li>\n ))}\n </ul>\n )}\n\n {!isPending && todos.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No todos yet.</p>\n )}\n </>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.todoExample && s.shadcn,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { TodoList } from '@/app/todo-list';\nimport { ModeToggle } from '@<%= projectName %>/ui/mode-toggle';\nimport { Card, CardContent, CardHeader, CardTitle } from '@<%= projectName %>/ui/card';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello'],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b flex items-start justify-between\">\n <div>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n <ModeToggle />\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto text-foreground\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n next.js\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n nest.js\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 rounded-md border p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n better-auth\n </CardTitle>\n </CardHeader>\n <CardContent>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <TodoList session={session} />\n ) : (\n <AuthForm />\n )}\n </CardContent>\n </Card>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/todo-list.tsx\",\n template: `'use client';\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useForm } from '@tanstack/react-form';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { colors, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\ninterface Todo {\n id: string;\n title: string;\n done: boolean;\n}\n\nconst api = {\n getTodos: (): Promise<Todo[]> => fetch('/api/todos').then((r) => r.json()),\n createTodo: (title: string): Promise<Todo> =>\n fetch('/api/todos', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n }).then((r) => r.json()),\n toggleTodo: (id: string): Promise<Todo> =>\n fetch(\\`/api/todos/\\${id}/toggle\\`, { method: 'PATCH' }).then((r) => r.json()),\n deleteTodo: (id: string): Promise<void> =>\n fetch(\\`/api/todos/\\${id}\\`, { method: 'DELETE' }).then(() => undefined),\n};\n\nexport function TodoList({\n session,\n}: {\n session: { user: { email: string } };\n}) {\n const queryClient = useQueryClient();\n\n const { data: todos = [], isPending } = useQuery({\n queryKey: ['todos'],\n queryFn: api.getTodos,\n });\n\n const createMutation = useMutation({\n mutationFn: api.createTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const toggleMutation = useMutation({\n mutationFn: api.toggleTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const deleteMutation = useMutation({\n mutationFn: api.deleteTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const form = useForm({\n defaultValues: { title: '' },\n onSubmit: async ({ value }) => {\n if (!value.title.trim()) return;\n createMutation.mutate(value.title.trim());\n form.reset();\n },\n });\n\n return (\n <>\n <div {...stylex.props(styles.header)}>\n <h1 {...stylex.props(styles.h1)}>Todos</h1>\n <div {...stylex.props(styles.session)}>\n <span>{session.user.email}</span>\n <button\n {...stylex.props(styles.signOut)}\n onClick={() => authClient.signOut()}\n >\n Sign out\n </button>\n </div>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n {...stylex.props(styles.form)}\n >\n <form.Field name=\"title\">\n {(field) => (\n <input\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"New todo…\"\n {...stylex.props(styles.input)}\n />\n )}\n </form.Field>\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting || createMutation.isPending}>\n Add\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n {isPending ? (\n <p {...stylex.props(styles.muted)}>Loading…</p>\n ) : (\n <ul {...stylex.props(styles.list)}>\n {todos.map((todo) => (\n <li key={todo.id} {...stylex.props(styles.item)}>\n <input\n type=\"checkbox\"\n checked={todo.done}\n onChange={() => toggleMutation.mutate(todo.id)}\n />\n <span {...stylex.props(styles.title, todo.done && styles.titleDone)}>\n {todo.title}\n </span>\n <button\n onClick={() => deleteMutation.mutate(todo.id)}\n {...stylex.props(styles.remove)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {!isPending && todos.length === 0 && (\n <p {...stylex.props(styles.muted)}>No todos yet.</p>\n )}\n </>\n );\n}\n\nconst styles = stylex.create({\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '2rem',\n },\n h1: {\n fontSize: '1.5rem',\n fontWeight: 600,\n },\n session: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n fontSize: '0.875rem',\n color: colors.mutedForeground,\n },\n signOut: {\n color: {\n default: 'inherit',\n ':hover': colors.foreground,\n },\n backgroundColor: 'transparent',\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n fontFamily: 'inherit',\n fontSize: 'inherit',\n },\n form: {\n display: 'flex',\n gap: '0.5rem',\n marginBottom: '1.5rem',\n },\n input: {\n flexGrow: 1,\n height: 36,\n paddingBlock: '0.25rem',\n paddingInline: '0.75rem',\n fontFamily: 'inherit',\n fontSize: '0.875rem',\n color: colors.foreground,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: {\n default: colors.border,\n ':focus-visible': colors.mutedForeground,\n },\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n outlineStyle: 'none',\n transitionProperty: 'border-color',\n transitionDuration: '150ms',\n },\n list: {\n listStyleType: 'none',\n },\n item: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n paddingBlock: '0.75rem',\n borderTopColor: colors.border,\n borderTopStyle: 'solid',\n borderTopWidth: {\n default: 1,\n ':first-child': 0,\n },\n },\n title: {\n flexGrow: 1,\n fontSize: '0.875rem',\n },\n titleDone: {\n color: colors.mutedForeground,\n textDecorationLine: 'line-through',\n },\n remove: {\n color: {\n default: colors.mutedForeground,\n ':hover': colors.danger,\n },\n backgroundColor: 'transparent',\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n fontSize: '1.125rem',\n lineHeight: 1,\n },\n muted: {\n fontSize: '0.875rem',\n color: colors.mutedForeground,\n },\n});\n`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.todoExample && s.stylex,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { TodoList } from '@/app/todo-list';\nimport { colors, fonts, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello'],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main {...stylex.props(styles.main)}>\n <div {...stylex.props(styles.header)}>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/page.tsx</p>\n <p {...stylex.props(styles.muted)}>Delete me to get started!</p>\n </div>\n\n <div {...stylex.props(styles.titleRow)}>\n <Logo style={styles.logo} />\n <div>\n <h1 {...stylex.props(styles.h1)}><%= projectName %></h1>\n <p {...stylex.props(styles.muted, styles.tagline)}>\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>next.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/layout.tsx</p>\n <p {...stylex.props(styles.muted)}>Next.js rendering</p>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>nest.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>GET /api/hello</p>\n <pre {...stylex.props(styles.pre)}>\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow, styles.eyebrowSpaced)}>better-auth</p>\n {isPending ? (\n <p {...stylex.props(styles.muted)}>Loading…</p>\n ) : session ? (\n <TodoList session={session} />\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div {...stylex.props(styles.footer)}>\n <p {...stylex.props(styles.muted)}>Learn more</p>\n <ul {...stylex.props(styles.list)}>\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}\n\nconst styles = stylex.create({\n main: {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n maxWidth: '32rem',\n minHeight: '100%',\n marginInline: 'auto',\n paddingBlock: '2rem',\n paddingInline: '1rem',\n fontSize: '0.875rem',\n },\n header: {\n paddingBottom: '1rem',\n borderBottomColor: colors.border,\n borderBottomStyle: 'solid',\n borderBottomWidth: 1,\n },\n titleRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n paddingBlock: '0.5rem',\n },\n logo: {\n width: '2.5rem',\n height: 'auto',\n },\n h1: {\n fontSize: '2.25rem',\n fontWeight: 900,\n letterSpacing: '-0.025em',\n },\n tagline: {\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n },\n card: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n padding: '1.5rem',\n borderColor: colors.border,\n borderRadius: radii.lg,\n borderStyle: 'solid',\n borderWidth: 1,\n },\n eyebrow: {\n fontFamily: fonts.mono,\n fontSize: '0.75rem',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n color: colors.mutedForeground,\n },\n eyebrowSpaced: {\n marginBottom: '0.75rem',\n },\n pre: {\n marginTop: '0.5rem',\n padding: '0.75rem',\n fontFamily: fonts.mono,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: colors.border,\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n overflowX: 'auto',\n },\n footer: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n paddingBlock: '1rem',\n paddingInline: '0.5rem',\n },\n list: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n listStylePosition: 'inside',\n listStyleType: 'disc',\n },\n mono: {\n fontFamily: fonts.mono,\n },\n muted: {\n color: colors.mutedForeground,\n },\n});\n`,\n};\n","import type { Module } from \"../types\";\nimport todosModule from \"./templates/todos-module\";\nimport todosService from \"./templates/todos-service\";\nimport todosServiceSpec from \"./templates/todos-service-spec\";\nimport dbSchema from \"./templates/db-schema\";\nimport dbMigrationTodos from \"./templates/db-migration-todos\";\nimport todosController from \"./templates/todos-controller\";\nimport todosModuleControllers from \"./templates/todos-module-controllers\";\nimport appModuleControllers from \"./templates/app-module-controllers\";\nimport appModuleDi from \"./templates/app-module-di\";\nimport apiIndex from \"./templates/api-index\";\nimport webTodosRoute from \"./templates/web-todos-route\";\nimport webTodosIdRoute from \"./templates/web-todos-id-route\";\nimport webTodosToggleRoute from \"./templates/web-todos-toggle-route\";\nimport webTodoList from \"./templates/web-todo-list\";\nimport webPage from \"./templates/web-page\";\nimport shadcnTodoList from \"./templates/shadcn-todo-list\";\nimport shadcnPage from \"./templates/shadcn-page\";\nimport stylexTodoList from \"./templates/stylex-todo-list\";\nimport stylexPage from \"./templates/stylex-page\";\n\n// Shared by every mode: the Kysely-backed todos service, its Nest module, and\n// the db schema + migration for the todo table.\nexport const todoExampleApi: Module = {\n templates: [todosModule, todosService, todosServiceSpec, dbSchema, dbMigrationTodos],\n};\n\n// api-controllers mode: REST controller plus app.module wired with TodosModule.\nexport const todoExampleControllers: Module = {\n templates: [todosController, todosModuleControllers, appModuleControllers],\n};\n\n// nest-di-only mode: Next.js route handlers plus app.module wired with TodosModule.\nexport const todoExampleDi: Module = {\n templates: [webTodosRoute, webTodosIdRoute, webTodosToggleRoute, appModuleDi, apiIndex],\n};\n\n// Web UI: TodoList component and the homepage that renders it.\nexport const todoExampleWeb: Module = {\n templates: [webTodoList, webPage],\n};\n\nexport const todoExampleShadcn: Module = {\n templates: [shadcnTodoList, shadcnPage],\n};\n\nexport const todoExampleStylex: Module = {\n templates: [stylexTodoList, stylexPage],\n};\n","import { fileURLToPath } from \"node:url\";\nimport root from \"./root/index\";\nimport web from \"./web/index\";\nimport api from \"./api/index\";\nimport auth from \"./auth/index\";\nimport { dbSqlite, dbPostgres } from \"./db/index\";\nimport ui from \"./ui/index\";\nimport shadcnUi from \"./shadcn-ui/index\";\nimport stylexUi from \"./stylex-ui/index\";\nimport eslintConfig from \"./eslint-config/index\";\nimport oxc from \"./oxc/index\";\nimport antiSlop from \"./anti-slop/index\";\nimport typescriptConfig from \"./typescript-config/index\";\nimport testingJest from \"./testing-jest/index\";\nimport testingVitest from \"./testing-vitest/index\";\nimport deploymentStandalone from \"./deployment-standalone/index\";\nimport deploymentSpa from \"./single-process-static-export/index\";\nimport nestDiOnlyModule from \"./nest-di-only/index\";\nimport nestOff from \"./nest-off/index\";\nimport deploymentStandaloneWeb from \"./deployment-standalone-web/index\";\nimport apiControllers from \"./api-controllers/index\";\nimport {\n todoExampleApi,\n todoExampleControllers,\n todoExampleDi,\n todoExampleWeb,\n todoExampleShadcn,\n todoExampleStylex,\n} from \"./todo-example/index\";\nimport type { Module, ModuleSelection } from \"./types\";\n\nexport * from \"./types\";\n\nexport const staticDir = new URL(\"./static/\", import.meta.url);\n\nexport const staticDirPath = fileURLToPath(staticDir);\n\nexport function getStaticFilePath(name: string): string {\n return fileURLToPath(new URL(`./static/${name}`, import.meta.url));\n}\n\nexport const templates = {\n root,\n web,\n api,\n auth,\n dbSqlite,\n dbPostgres,\n ui,\n shadcnUi,\n stylexUi,\n eslintConfig,\n oxc,\n antiSlop,\n typescriptConfig,\n testingJest,\n testingVitest,\n deploymentStandalone,\n deploymentSpa,\n nestDiOnly: nestDiOnlyModule,\n nestOff,\n deploymentStandaloneWeb,\n apiControllers,\n todoExampleApi,\n todoExampleControllers,\n todoExampleDi,\n todoExampleWeb,\n todoExampleShadcn,\n todoExampleStylex,\n};\n\nconst E2E_FILES = [\n \"apps/api/test/app.e2e-spec.ts\",\n \"apps/api/test/jest-e2e.json\",\n \"apps/api/vitest.config.e2e.mts\",\n];\n\n// The single source of truth for which modules a selection scaffolds. Kept here\n// rather than in the CLI so the render tests exercise the real selection.\nexport function selectModules(selection: ModuleSelection): Module[] {\n const { deployment, nest, todoExample, shadcn, stylex, database, linter, testing, extras } =\n selection;\n\n const deploymentModule =\n deployment === \"standalone\"\n ? deploymentStandalone\n : deployment === \"spa\"\n ? deploymentSpa\n : null;\n\n // In SPA mode NestJS serves Better Auth (AuthModule.forRoot); the Next.js\n // auth handler is redundant and can't be statically exported, so drop it.\n const webModule =\n deployment === \"spa\"\n ? {\n ...web,\n templates: web.templates.filter(\n (t) => t.filename !== \"apps/web/app/api/auth/[...all]/route.ts\",\n ),\n }\n : web;\n\n // Every testing config, script and dev dependency targets apps/api, so `off`\n // gets none of them. DI-only keeps the unit suite but drops the e2e one: its\n // Nest has no controllers of its own, so a suite booting apps/api has\n // nothing to hit.\n const selectedTesting = testing === \"vitest\" ? testingVitest : testingJest;\n const testingModule =\n nest === \"off\"\n ? null\n : nest === \"di-only\"\n ? {\n ...selectedTesting,\n templates: selectedTesting.templates.filter((t) => !E2E_FILES.includes(t.filename)),\n scripts: selectedTesting.scripts?.filter((s) => s.name !== \"test:e2e\"),\n }\n : selectedTesting;\n\n const nestModule =\n nest === \"di-only\" ? nestDiOnlyModule : nest === \"off\" ? nestOff : apiControllers;\n\n return [\n root,\n webModule,\n ...(nest === \"off\" ? [] : [api]),\n database === \"postgres\" ? dbPostgres : dbSqlite,\n auth,\n shadcn ? shadcnUi : stylex ? stylexUi : ui,\n linter === \"oxc\" ? oxc : eslintConfig,\n ...(extras.includes(\"anti-slop\") ? [antiSlop] : []),\n typescriptConfig,\n ...(testingModule ? [testingModule] : []),\n ...(deploymentModule ? [deploymentModule] : []),\n nestModule,\n // nest-di-only and nest-off both overwrite the standalone next.config.js\n // and leave the Dockerfile pointing at an api entrypoint neither emits\n ...(nest !== \"on\" && deployment === \"standalone\" ? [deploymentStandaloneWeb] : []),\n ...(todoExample\n ? [\n todoExampleApi,\n ...(nest === \"di-only\" ? [todoExampleDi] : [todoExampleControllers]),\n shadcn ? todoExampleShadcn : stylex ? todoExampleStylex : todoExampleWeb,\n ]\n : []),\n ];\n}\n","import ejs from \"ejs\";\nimport { existsSync, promises } from \"fs\";\nimport path from \"path\";\nimport type { Module, Package, Script, Selection, TemplateData } from \"./types.js\";\nimport { getStaticFilePath } from \"./templates\";\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\nfunction isMissingFile(cause: unknown): boolean {\n return cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\";\n}\n\nexport async function updatePackageJson(\n destDir: string,\n packages: Package[],\n templateData: TemplateData,\n) {\n for (const pkg of packages) {\n const renderedPackage = ejs.render(pkg.package, templateData);\n const packageJsonPath = path.join(destDir, pkg.module, \"package.json\");\n let packageJsonContent: string;\n\n try {\n packageJsonContent = await promises.readFile(packageJsonPath, \"utf8\");\n } catch (err: unknown) {\n if (isMissingFile(err)) {\n continue;\n }\n throw err;\n }\n\n const packageJson = JSON.parse(packageJsonContent);\n\n const dependencyKey = pkg.dev ? \"devDependencies\" : \"dependencies\";\n\n if (!packageJson[dependencyKey]) {\n packageJson[dependencyKey] = {};\n }\n\n packageJson[dependencyKey][renderedPackage] = pkg.version;\n\n await promises.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n}\n\nexport async function updateScripts(\n destDir: string,\n scripts: Script[],\n templateData: TemplateData,\n) {\n for (const script of scripts) {\n const renderedScript = ejs.render(script.script, templateData);\n\n const packageJsonPath = path.join(destDir, script.module, \"package.json\");\n\n let packageJsonContent: string;\n\n try {\n packageJsonContent = await promises.readFile(packageJsonPath, \"utf8\");\n } catch (err: unknown) {\n if (isMissingFile(err)) {\n continue;\n }\n throw err;\n }\n\n const packageJson = JSON.parse(packageJsonContent);\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n packageJson.scripts[script.name] = renderedScript;\n\n await promises.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n}\n\nexport async function renderTemplatesToDisk(\n basePackages: Module[],\n destDir: string,\n templateData: TemplateData,\n selection: Selection,\n) {\n await promises.mkdir(destDir, { recursive: true });\n\n await basePackages.reduce(async (prev, pkg) => {\n await prev;\n\n // `when` decides which template owns a file for these options; templates\n // that don't apply are skipped rather than overwritten by a later one.\n const applicable = pkg.templates.filter((template) => template.when?.(selection) ?? true);\n\n await applicable.reduce(async (prev, template) => {\n await prev;\n\n const destPath = path.join(destDir, template.filename);\n await promises.mkdir(path.dirname(destPath), { recursive: true });\n\n const output = await ejs.render(template.template, templateData);\n\n await promises.writeFile(destPath, output, \"utf8\");\n }, Promise.resolve());\n\n if (pkg.staticFiles) {\n await pkg.staticFiles.reduce(async (prev, staticFile) => {\n await prev;\n\n const destPath = path.join(destDir, staticFile.filename);\n const destDirPath = path.dirname(destPath);\n\n await promises.mkdir(destDirPath, { recursive: true });\n\n await promises.copyFile(getStaticFilePath(staticFile.src), destPath);\n }, Promise.resolve());\n }\n }, Promise.resolve());\n}\n\nconst DEP_FIELDS = [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"optionalDependencies\"];\n\nfunction sortByKey<T>(obj: Record<string, T>): Record<string, T> {\n return Object.fromEntries(\n Object.keys(obj)\n .sort()\n .map((key) => [key, obj[key]]),\n );\n}\n\n// Alphabetize scripts and dependency fields in every scaffolded package.json.\n// Module injection appends deps/scripts to the end, so without this they land\n// out of order.\nexport async function sortPackageJsons(destDir: string) {\n const nested = await Promise.all(\n [\"apps\", \"packages\"].map(async (base) => {\n const dir = path.join(destDir, base);\n try {\n const entries = await promises.readdir(dir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(dir, entry.name, \"package.json\"));\n } catch {\n return [];\n }\n }),\n );\n const files = [path.join(destDir, \"package.json\")].concat(...nested);\n\n await Promise.all(\n files.map(async (file) => {\n if (!existsSync(file)) return;\n const pkg = JSON.parse(await promises.readFile(file, \"utf8\"));\n if (pkg.scripts) pkg.scripts = sortByKey(pkg.scripts);\n DEP_FIELDS.forEach((field) => {\n if (pkg[field]) pkg[field] = sortByKey(pkg[field]);\n });\n await promises.writeFile(file, JSON.stringify(pkg, null, 2) + \"\\n\");\n }),\n );\n}\n\nexport function validateFlagValue(\n flag: string,\n value: string,\n allowed: readonly string[],\n): ValidationResult {\n if (allowed.includes(value)) {\n return { valid: true };\n }\n\n return {\n valid: false,\n error: `Invalid value \"${value}\" for ${flag}. Valid choices: ${allowed.join(\", \")}.`,\n };\n}\n\nexport function validateExtrasCombo(extras: readonly string[], linter: string): ValidationResult {\n if (extras.includes(\"anti-slop\") && linter !== \"oxc\") {\n return {\n valid: false,\n error:\n \"--extras anti-slop needs --linter oxc.\\n\" +\n \"anti-slop is a set of oxlint rules, and the eslint option installs neither oxlint\\n\" +\n \"nor a config to register them in. Add --linter oxc, or drop the extra.\",\n };\n }\n\n return { valid: true };\n}\n\nexport function validateStylingCombo(shadcn: boolean, stylex: boolean): ValidationResult {\n if (shadcn && stylex) {\n return {\n valid: false,\n error:\n \"--shadcn cannot be combined with --stylex.\\n\" +\n \"shadcn/ui components are written in Tailwind utility classes, which StyleX does\\n\" +\n \"not compile. Pick one styling system: drop --stylex for shadcn/ui, or drop\\n\" +\n \"--shadcn for StyleX.\",\n };\n }\n\n return { valid: true };\n}\n\nexport function validateDeploymentCombo(deployment: string, nest: string): ValidationResult {\n if (deployment === \"spa\" && nest === \"di-only\") {\n return {\n valid: false,\n error:\n \"--deployment spa cannot be combined with --nest di-only.\\n\" +\n \"SPA mode statically exports Next.js (output: 'export'), which cannot include the\\n\" +\n \"API route handlers that di-only mode depends on. Pick one: --nest on to get SPA\\n\" +\n \"mode with NestJS controllers, or drop --deployment spa.\",\n };\n }\n\n if (deployment === \"spa\" && nest === \"off\") {\n return {\n valid: false,\n error:\n \"--deployment spa cannot be combined with --nest off.\\n\" +\n \"SPA mode statically exports Next.js and hands the output to NestJS to serve, so\\n\" +\n \"there is nothing left to serve it. Pick one: --nest on, or drop --deployment spa.\",\n };\n }\n\n return { valid: true };\n}\n\nexport function validateExampleCombo(todoExample: boolean, nest: string): ValidationResult {\n if (todoExample && nest === \"off\") {\n return {\n valid: false,\n error:\n \"--include-example cannot be combined with --nest off.\\n\" +\n \"The todo example is a Nest module: an @Injectable service plus either a controller\\n\" +\n \"or a Next.js route handler that resolves it. Pick one: --nest on or --nest di-only,\\n\" +\n \"or drop --include-example.\",\n };\n }\n\n return { valid: true };\n}\n\nconst TOOL_HINTS = {\n pnpm: \"Install it with `npm install -g pnpm`, or run `corepack enable`.\",\n git: \"Install it from https://git-scm.com/downloads, or pass --no-git.\",\n} satisfies Record<string, string>;\n\n// Only the tools this run will actually shell out to: --no-install never\n// invokes pnpm and --no-git never invokes git, so requiring them there would\n// reject a scaffold that was going to succeed.\nexport async function checkRequiredTools(\n needs: { install: boolean; git: boolean },\n hasCommand: (command: string) => Promise<boolean>,\n): Promise<ValidationResult> {\n const required = [\n ...(needs.install ? ([\"pnpm\"] as const) : []),\n ...(needs.git ? ([\"git\"] as const) : []),\n ];\n\n const missing = (\n await Promise.all(required.map(async (tool) => ((await hasCommand(tool)) ? null : tool)))\n ).filter((tool) => tool !== null);\n\n if (missing.length === 0) return { valid: true };\n\n return {\n valid: false,\n error: missing.map((tool) => `${tool} was not found on PATH. ${TOOL_HINTS[tool]}`).join(\"\\n\"),\n };\n}\n\nexport function validateNodeVersion(current: string, requirement: string): ValidationResult {\n const parse = (value: string) => (value.match(/\\d+/g) ?? []).slice(0, 3).map(Number);\n const [major = 0, minor = 0, patch = 0] = parse(current);\n const [minMajor = 0, minMinor = 0, minPatch = 0] = parse(requirement);\n\n const satisfied =\n major !== minMajor\n ? major > minMajor\n : minor !== minMinor\n ? minor > minMinor\n : patch >= minPatch;\n\n if (satisfied) return { valid: true };\n\n return {\n valid: false,\n error: `Node ${requirement} is required, but this is ${current}.\\nUpgrade Node, or switch versions with a manager such as nvm or fnm.`,\n };\n}\n\n// The project name becomes the npm scope for every workspace package\n// (@name/db, @name/auth, @name/ui), so anything npm rejects breaks pnpm install.\n// Whatever is typed gets bent into that shape rather than refused.\nexport function normalizeProjectName(projectName: string): string {\n return projectName\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9\\-._~]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-._]+/, \"\")\n .replace(/-+$/, \"\")\n .slice(0, 214);\n}\n\nexport function validateProjectName(projectName: string): ValidationResult {\n if (!projectName) {\n return { valid: false, error: \"Project name is required\" };\n }\n\n const normalized = normalizeProjectName(projectName);\n\n if (!normalized) {\n return {\n valid: false,\n error: `\"${projectName}\" has nothing left after normalizing. Include a letter or a digit.`,\n };\n }\n\n const targetPath = path.resolve(process.cwd(), normalized);\n\n if (existsSync(targetPath)) {\n return { valid: false, error: `Directory \"${normalized}\" already exists` };\n }\n\n return { valid: true };\n}\n","import { randomBytes } from \"node:crypto\";\nimport { execa } from \"execa\";\nimport type { Module, Selection, TemplateData } from \"./templates\";\nimport { versions } from \"./templates/versions.js\";\nimport {\n renderTemplatesToDisk,\n sortPackageJsons,\n updatePackageJson,\n updateScripts,\n validateProjectName,\n} from \"./utils.js\";\n\nexport async function scaffold(\n modules: Module[],\n options: {\n name: string;\n testing: \"jest\" | \"vitest\";\n database: \"sqlite\" | \"postgres\";\n deployment: TemplateData[\"deployment\"];\n linter: TemplateData[\"linter\"];\n antiSlop: boolean;\n selection: Selection;\n },\n) {\n const validation = validateProjectName(options.name);\n if (!validation.valid) {\n console.error(`Error: ${validation.error}`);\n process.exit(1);\n }\n\n const templateData: TemplateData = {\n projectName: options.name,\n nest: options.selection.nest,\n testing: options.testing,\n database: options.database,\n deployment: options.deployment,\n linter: options.linter,\n antiSlop: options.antiSlop,\n shadcn: options.selection.shadcn,\n authSecret: randomBytes(32).toString(\"base64url\"),\n versions,\n };\n\n await renderTemplatesToDisk(modules, options.name, templateData, options.selection);\n\n const packages = modules\n .map((mod) => mod.packages)\n .filter((ele) => ele !== undefined)\n .flat();\n\n if (packages.length > 0) {\n await updatePackageJson(options.name, packages, templateData);\n }\n\n const scripts = modules\n .map((mod) => mod.scripts)\n .filter((ele) => ele !== undefined)\n .flat();\n\n if (scripts.length > 0) {\n await updateScripts(options.name, scripts, templateData);\n }\n\n await sortPackageJsons(options.name);\n}\n\n// execa throws ENOENT when the binary is not on PATH. Every tool we shell out\n// to answers --version, so this doubles as a liveness check.\nexport async function hasCommand(command: string) {\n try {\n await execa(command, [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function pnpmInstall(cwd: string) {\n return await execa(\"pnpm\", [\"install\"], {\n cwd,\n });\n}\n\nexport async function pnpmFormat(cwd: string) {\n return await execa(\"pnpm\", [\"format\"], {\n cwd,\n });\n}\n\nexport async function initGit(cwd: string) {\n await execa(\"git\", [\"init\"], {\n cwd,\n });\n\n await execa(\"git\", [\"add\", \".\"], {\n cwd,\n });\n\n await execa(\"git\", [\"commit\", \"-m\", \"Initial commit\"], {\n cwd,\n });\n}\n","import https from \"node:https\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport type { ModuleSelection } from \"./templates\";\n\n// Inlined by tsdown, and empty in every build but a release, so nothing else\n// can report a scaffold even if the opt-out logic were wrong.\n// turbo.json must list this under the build task or turbo strips it.\nconst ENDPOINT = process.env.NEWT_TELEMETRY_URL ?? \"\";\n\n// A real round trip to the edge measures ~110ms, and DNS or refused failures\n// return in about that too. Only a firewall that drops packets waits out the\n// full budget, and it does so on every run, so this is deliberately tight.\nconst SEND_TIMEOUT_MS = 1000;\n\nexport type TelemetryMode = \"interactive\" | \"flags\";\n\nexport type RunReport = {\n mode: TelemetryMode;\n explicitFlags: readonly string[];\n selection: ModuleSelection;\n};\n\nconst CI_PROVIDERS = [\n [\"GITHUB_ACTIONS\", \"github-actions\"],\n [\"GITLAB_CI\", \"gitlab-ci\"],\n [\"CIRCLECI\", \"circleci\"],\n [\"TRAVIS\", \"travis\"],\n [\"BUILDKITE\", \"buildkite\"],\n [\"JENKINS_URL\", \"jenkins\"],\n [\"TEAMCITY_VERSION\", \"teamcity\"],\n [\"CODEBUILD_BUILD_ID\", \"codebuild\"],\n [\"VERCEL\", \"vercel\"],\n [\"NETLIFY\", \"netlify\"],\n] as const;\n\nexport function detectCi(env: NodeJS.ProcessEnv = process.env): string {\n const named = CI_PROVIDERS.find(([key]) => env[key]);\n if (named) return named[1];\n return env.CI ? \"unknown\" : \"none\";\n}\n\n// DO_NOT_TRACK is the cross-tool convention from consoledonottrack.com, and is\n// checked first so the project-specific switches cannot re-enable past it.\nexport function isOptedOut(env: NodeJS.ProcessEnv = process.env): boolean {\n if (env.DO_NOT_TRACK === \"1\" || env.DO_NOT_TRACK?.toLowerCase() === \"true\") return true;\n if (env.NEWT_TELEMETRY_DISABLED === \"1\") return true;\n if (env.NEWT_TELEMETRY !== undefined) return env.NEWT_TELEMETRY !== \"1\";\n return false;\n}\n\nexport function isEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return Boolean(ENDPOINT) && !isOptedOut(env);\n}\n\nexport function nodeMajor(version: string = process.version): string {\n const match = /^v?(\\d+)/.exec(version);\n return match ? `v${match[1]}` : \"other\";\n}\n\nexport function buildPayload(report: RunReport) {\n const { selection } = report;\n return {\n cliVersion: pkg.version,\n nodeMajor: nodeMajor(),\n platform: process.platform,\n mode: report.mode,\n ci: detectCi(),\n // Sorted, so one set of flags is one value and not one per ordering.\n explicitFlags: [...report.explicitFlags].sort().join(\",\"),\n shadcn: selection.shadcn,\n stylex: selection.stylex,\n testing: selection.testing,\n database: selection.database,\n linter: selection.linter,\n deployment: selection.deployment,\n nest: selection.nest,\n todoExample: selection.todoExample,\n antiSlop: selection.extras.includes(\"anti-slop\"),\n };\n}\n\n// node:https rather than fetch: fetch's connect timeout cannot be configured\n// without pulling in undici, and its 10s default outlives an AbortSignal. On a\n// firewall that DROPs packets that leaves the CLI sitting there for nine\n// seconds after it has already printed \"Next steps\".\nfunction post(body: string): Promise<void> {\n return new Promise((resolve) => {\n try {\n const req = https.request(ENDPOINT, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"content-length\": Buffer.byteLength(body),\n },\n timeout: SEND_TIMEOUT_MS,\n });\n\n // Never unref this socket: an awaited promise does not hold the event\n // loop open, so the process would exit before the request completes.\n req.on(\"response\", (res) => {\n res.resume();\n res.on(\"end\", () => resolve());\n });\n req.on(\"timeout\", () => {\n req.destroy();\n resolve();\n });\n req.on(\"error\", () => resolve());\n req.end(body);\n } catch {\n resolve();\n }\n });\n}\n\n// Never rejects. Call only after the project exists, so a cancelled run sends nothing.\nexport async function reportRun(report: RunReport): Promise<void> {\n if (!isEnabled()) return;\n await post(JSON.stringify(buildPayload(report)));\n}\n","#!/usr/bin/env node\nimport { intro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport { selectModules, type Extra, type ModuleSelection, type Nest } from \"./templates\";\nimport { hasCommand, initGit, pnpmFormat, pnpmInstall, scaffold } from \"./tasks.js\";\nimport { reportRun } from \"./telemetry.js\";\nimport {\n checkRequiredTools,\n normalizeProjectName,\n validateDeploymentCombo,\n validateExampleCombo,\n validateExtrasCombo,\n validateStylingCombo,\n validateFlagValue,\n validateNodeVersion,\n validateProjectName,\n} from \"./utils.js\";\n\nconst TESTING_CHOICES = [\"jest\", \"vitest\"] as const;\nconst DATABASE_CHOICES = [\"sqlite\", \"postgres\"] as const;\nconst LINTER_CHOICES = [\"eslint\", \"oxc\"] as const;\nconst DEPLOYMENT_CHOICES = [\"none\", \"standalone\", \"spa\"] as const;\nconst NEST_CHOICES = [\"on\", \"off\", \"di-only\"] as const satisfies readonly Nest[];\nconst EXTRAS_CHOICES = [\"anti-slop\"] as const satisfies readonly Extra[];\n\ntype Testing = (typeof TESTING_CHOICES)[number];\ntype Database = (typeof DATABASE_CHOICES)[number];\ntype Linter = (typeof LINTER_CHOICES)[number];\ntype Deployment = (typeof DEPLOYMENT_CHOICES)[number];\n\ntype Answers = {\n name?: string;\n shadcn?: boolean;\n stylex?: boolean;\n testing?: Testing;\n database?: Database;\n linter?: Linter;\n deployment?: Deployment;\n nest?: Nest;\n todoExample?: boolean;\n extras?: Extra[];\n};\n\ntype Options = {\n name?: string;\n install: boolean;\n git: boolean;\n nonInteractive: boolean;\n shadcn: boolean;\n stylex: boolean;\n testing: Testing;\n database: Database;\n linter: Linter;\n deployment: Deployment;\n nest: Nest;\n includeExample: boolean;\n extras: readonly Extra[];\n explicitFlags: readonly string[];\n};\n\nclass TaskBuilder {\n tasks: p.Task[] = [];\n\n add(task: p.Task) {\n this.tasks.push(task);\n }\n}\n\nexport async function doInit(options: Options) {\n const groupOpts = {\n ...(!options.name && {\n name: () =>\n p.text({\n message: \"What is your project name?\",\n placeholder: \"my-newt-app\",\n validate: (value) => validateProjectName(value).error,\n }),\n }),\n ...(!options.nonInteractive && {\n shadcn: () =>\n p.confirm({\n message: \"Use shadcn/ui?\",\n initialValue: true,\n }),\n stylex: ({ results }) =>\n results.shadcn\n ? undefined\n : p.confirm({\n message: \"Use StyleX instead of Tailwind?\",\n initialValue: false,\n }),\n nest: () =>\n p.select<Nest>({\n message: \"NestJS?\",\n options: [\n { value: \"on\", label: \"On\", hint: \"apps/api on port 3001\" },\n {\n value: \"di-only\",\n label: \"DI only\",\n hint: \"no HTTP server; Next.js route handlers inject its services\",\n },\n { value: \"off\", label: \"Off\", hint: \"no apps/api; Next.js owns the backend\" },\n ],\n initialValue: \"on\",\n }),\n // Every testing config, script and dev dependency lands in apps/api,\n // which `off` never scaffolds.\n testing: ({ results }) =>\n results.nest === \"off\"\n ? undefined\n : p.select<Testing>({\n message: \"Testing framework?\",\n options: [\n { value: \"jest\", label: \"Jest\" },\n { value: \"vitest\", label: \"Vitest\" },\n ],\n initialValue: \"jest\",\n }),\n database: () =>\n p.select<Database>({\n message: \"Database?\",\n options: [\n { value: \"sqlite\", label: \"SQLite\" },\n { value: \"postgres\", label: \"Postgres\" },\n ],\n initialValue: \"sqlite\",\n }),\n linter: () =>\n p.select<Linter>({\n message: \"Linter and formatter?\",\n options: [\n { value: \"eslint\", label: \"ESLint + Prettier\" },\n { value: \"oxc\", label: \"oxlint + oxfmt\" },\n ],\n initialValue: \"eslint\",\n }),\n extras: ({ results }) =>\n results.linter === \"oxc\"\n ? p.multiselect<Extra>({\n message: \"Extras?\",\n options: [\n {\n value: \"anti-slop\",\n label: \"anti-slop\",\n hint: \"oxlint rules that reject low-evidence TypeScript\",\n },\n ],\n required: false,\n })\n : undefined,\n // The example is a Nest module either way: a service behind a controller,\n // or behind a route handler that injects it.\n todoExample: ({ results }) =>\n results.nest === \"off\"\n ? undefined\n : p.confirm({\n message: \"Include the todo example?\",\n initialValue: true,\n }),\n deployment: ({ results }) =>\n p.select<Deployment>({\n message: \"Deployment?\",\n options: [\n { value: \"none\", label: \"None\", hint: \"skip\" },\n {\n value: \"standalone\",\n label: \"Standalone + Dockerfile\",\n hint: \"Dockerfiles + docker-compose.yml\",\n },\n // SPA hands a static export to NestJS to serve, so it needs a Nest\n // with its own HTTP server: di-only has none, and off has no Nest\n ...(results.nest === \"on\"\n ? [\n {\n value: \"spa\" as const,\n label: \"SPA Mode\",\n hint: \"static export served by NestJS\",\n },\n ]\n : []),\n ],\n initialValue: \"none\",\n }),\n }),\n };\n\n try {\n // Before the prompts, and before anything is written: a missing tool used\n // to surface as a spawn error partway through, leaving a half-scaffolded\n // directory that the next run then refuses to overwrite.\n const preflight = [\n validateNodeVersion(process.version, pkg.engines.node),\n ...(options.name ? [validateProjectName(options.name)] : []),\n await checkRequiredTools({ install: options.install, git: options.git }, hasCommand),\n ].find((result) => !result.valid);\n\n if (preflight) {\n throw new Error(preflight.error);\n }\n\n const answers: Answers = await p.group(groupOpts, {\n onCancel: () => {\n console.log(\"Exiting.\");\n process.exit(0);\n },\n });\n\n const useShadcn = options.nonInteractive ? options.shadcn : (answers.shadcn ?? true);\n const useStylex = options.nonInteractive ? options.stylex : (answers.stylex ?? false);\n const testing: Testing = options.nonInteractive ? options.testing : (answers.testing ?? \"jest\");\n const database: Database = options.nonInteractive\n ? options.database\n : (answers.database ?? \"sqlite\");\n const linter: Linter = options.nonInteractive ? options.linter : (answers.linter ?? \"eslint\");\n const deployment: Deployment = options.nonInteractive\n ? options.deployment\n : (answers.deployment ?? \"none\");\n const nest: Nest = options.nonInteractive ? options.nest : (answers.nest ?? \"on\");\n const todoExample = options.nonInteractive\n ? options.includeExample\n : nest !== \"off\" && (answers.todoExample ?? true);\n const extras: readonly Extra[] = options.nonInteractive\n ? options.extras\n : (answers.extras ?? []);\n\n const stylingCombo = validateStylingCombo(useShadcn, useStylex);\n if (!stylingCombo.valid) {\n throw new Error(stylingCombo.error);\n }\n\n const deploymentCombo = validateDeploymentCombo(deployment, nest);\n if (!deploymentCombo.valid) {\n throw new Error(deploymentCombo.error);\n }\n\n const exampleCombo = validateExampleCombo(todoExample, nest);\n if (!exampleCombo.valid) {\n throw new Error(exampleCombo.error);\n }\n\n const extrasCombo = validateExtrasCombo(extras, linter);\n if (!extrasCombo.valid) {\n throw new Error(extrasCombo.error);\n }\n\n const selection: ModuleSelection = {\n deployment,\n nest,\n todoExample,\n shadcn: useShadcn,\n stylex: useStylex,\n database,\n linter,\n testing,\n extras,\n };\n\n const allModules = selectModules(selection);\n\n const rawName = answers.name ?? options.name ?? \"\";\n\n const nameCheck = validateProjectName(rawName);\n if (!nameCheck.valid) {\n throw new Error(nameCheck.error);\n }\n\n // Normalized here, not inside scaffold, so the directory, the package scope\n // and the \"cd\" line below can never disagree.\n const name = normalizeProjectName(rawName);\n\n const taskBuilder = new TaskBuilder();\n\n taskBuilder.add({\n title: \"Scaffolding project\",\n task: async () => {\n await scaffold(allModules, {\n name,\n testing,\n database,\n deployment,\n linter,\n antiSlop: extras.includes(\"anti-slop\"),\n selection,\n });\n return \"Scaffolded.\";\n },\n });\n\n if (options.install) {\n taskBuilder.add({\n title: \"Installing with pnpm\",\n task: async () => {\n await pnpmInstall(name);\n return \"Installed.\";\n },\n });\n\n taskBuilder.add({\n title: \"Formatting\",\n task: async () => {\n await pnpmFormat(name);\n return \"Formatted.\";\n },\n });\n }\n\n if (options.git) {\n taskBuilder.add({\n title: \"Initializing git\",\n task: async () => {\n await initGit(name);\n return \"Initialized git.\";\n },\n });\n }\n\n await p.tasks(taskBuilder.tasks);\n\n p.outro(`Done!`);\n\n console.log(\"Next steps:\");\n console.log();\n console.log(chalk.blue(` cd ${name}`));\n if (!options.install) {\n console.log(chalk.blue(` pnpm install`));\n console.log(chalk.blue(` pnpm format`));\n }\n console.log(chalk.blue(` pnpm dev`));\n console.log();\n\n await reportRun({\n mode: options.nonInteractive ? \"flags\" : \"interactive\",\n explicitFlags: options.explicitFlags,\n selection,\n });\n\n // A DNS lookup that never answers sits on the libuv threadpool, where\n // unref cannot reach it, so an unreachable endpoint would otherwise hold\n // the process open after the user already has their project.\n process.exit(0);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"create-newt-app\")\n .version(pkg.version)\n .description(\"Create a new newt-app monorepo\")\n .argument(\"[name]\")\n .option(\"-ni, --no-install\", \"Skip pnpm install\", true)\n .option(\"-ng, --no-git\", \"Skip git initialization\", true)\n .option(\"--shadcn\", \"Include shadcn/ui\", false)\n .option(\"--stylex\", \"Use StyleX instead of Tailwind\", false)\n .option(\"--testing <framework>\", \"Testing framework: vitest or jest\", \"jest\")\n .option(\"--database <database>\", \"Database: sqlite or postgres\", \"sqlite\")\n .option(\"--linter <linter>\", \"Linter: eslint or oxc\", \"eslint\")\n .option(\"--deployment <strategy>\", \"Deployment: none, standalone, or spa\", \"none\")\n .option(\"--nest <mode>\", \"NestJS: on, off, or di-only\", \"on\")\n .option(\"--include-example\", \"Include the todo example\", false)\n .option(\"--extras <list>\", \"Extras, comma-separated: anti-slop\", \"\")\n .action(\n async (\n name: string,\n options: {\n install: boolean;\n git: boolean;\n shadcn: boolean;\n stylex: boolean;\n testing: string;\n database: string;\n linter: string;\n deployment: string;\n nest: string;\n includeExample: boolean;\n extras: string;\n },\n command: Command,\n ) => {\n intro(`Create a ${chalk.blue(\"newt\")} app.`);\n\n // Any explicitly passed config flag skips the prompts.\n const CONFIG_FLAGS = {\n shadcn: \"--shadcn\",\n stylex: \"--stylex\",\n testing: \"--testing\",\n database: \"--database\",\n linter: \"--linter\",\n deployment: \"--deployment\",\n nest: \"--nest\",\n includeExample: \"--include-example\",\n extras: \"--extras\",\n } as const;\n\n const explicitFlags = Object.entries(CONFIG_FLAGS)\n .filter(([option]) => command.getOptionValueSource(option) === \"cli\")\n .map(([, flag]) => flag);\n\n const nonInteractive = explicitFlags.length > 0;\n\n const extras = options.extras\n .split(\",\")\n .map((extra) => extra.trim())\n .filter(Boolean);\n\n // Reject typos instead of silently falling back to a default.\n const choices = [\n { flag: \"--testing\", value: options.testing, allowed: TESTING_CHOICES },\n {\n flag: \"--database\",\n value: options.database,\n allowed: DATABASE_CHOICES,\n },\n { flag: \"--linter\", value: options.linter, allowed: LINTER_CHOICES },\n {\n flag: \"--deployment\",\n value: options.deployment,\n allowed: DEPLOYMENT_CHOICES,\n },\n { flag: \"--nest\", value: options.nest, allowed: NEST_CHOICES },\n ...extras.map((extra) => ({\n flag: \"--extras\",\n value: extra,\n allowed: EXTRAS_CHOICES,\n })),\n ];\n\n const invalid = choices\n .map(({ flag, value, allowed }) => validateFlagValue(flag, value, allowed))\n .find((result) => !result.valid);\n\n if (invalid) {\n console.error(`Error: ${invalid.error}`);\n process.exit(1);\n }\n\n // SAFETY: validateFlagValue above rejected any value outside these choice\n // lists and exited, so each string is a member of its union.\n await doInit({\n name,\n install: options.install,\n git: options.git,\n nonInteractive,\n shadcn: options.shadcn,\n stylex: options.stylex,\n testing: options.testing as Testing,\n database: options.database as Database,\n linter: options.linter as Linter,\n deployment: options.deployment as Deployment,\n nest: options.nest as Nest,\n includeExample: options.includeExample,\n extras: extras as Extra[],\n explicitFlags,\n });\n },\n );\n\nprogram.parse();\n"],"mappings":"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gEqFRA;EACAC;G/DzFF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;E+DwFRA;EACAC;G9D1FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E8DyFRA;EACAC;G7D3FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E6D0FRA;EACAC;G5D5FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E4D2FRA;EACAC;G3D7FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E2D4FRA;EACAC;G1D9FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;E0D6FRA;EACAC;GzD/FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EyD8FRA;EACAC;GxDhGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EwD+FRA;EACAC;GvDjGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EuDgGRA;EACAC;GtDlGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EsDiGRA;EACAC;GrDnGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EqDkGRA;EACAC;GpDpGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EoDmGRA;EACAC;GnDrGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EmDoGRA;EACAC;GlDtGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EkDqGRA;EACAC;GjDvGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EiDsGRA;EACAC;GhDxGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;EgDuGRA;EACAC;G/CzGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E+CwGRA;EACAC;G9C1GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E8CyGRA;EACAC;G7C3GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E6C0GRA;EACAC;G5C5GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E4C2GRA;EACAC;G3C7GF,UAAU;GACV,UAAU;;;;;;;E2C4GRA;EACAC;G1C9GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E0C6GRA;EACAC;GzC/GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EyC8GRA;EACAC;GxChHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EwC+GRA;EACAC;GvCjHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EuCgHRA;EACAC;GtClHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EsCiHRA;EACAC;GrCnHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EqCkHRA;EACAC;GpCpHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EoCmHRA;EACAC;GnCrHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EmCoHRA;EACAC;GlCtHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;EkCqHRA;EACAC;GjCvHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EiCsHRA;EACAC;GhCxHF,UAAU;GACV,UAAU;;;;;;;;;;;EgCuHRA;EACAC;G/BzHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E+BwHRA;EACAC;G9B1HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;E8ByHRA;EACAC;G7B3HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;E6B0HRA;EACAC;G5B5HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E4B2HRA;EACAC;G3B7HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E2B4HRA;EACAC;G1B9HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E0B6HRA;EACAC;GzB/HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EyB8HRA;EACAC;GxBhIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EwB+HRA;EACAC;GvBjIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EuBgIRA;EACAC;GtBlIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EsBiIRA;EACAC;GrBnIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EqBkIRA;EACAC;GpBpIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EoBmIRA;EACAC;GnBrIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;EmBoIRA;EACAC;GlBtIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EkBqIRA;EACAC;GjBvIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EiBsIRA;EACAC;GhBxIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;EgBuIRA;EACAC;GfzIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EewIRA;EACAC;Gd1IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EcyIRA;EACAC;Gb3IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Ea0IRA;EACAC;GZ5IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EY2IRA;EACAC;GX7IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EW4IRA;EACAC;GV9IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;EU6IRA;EACAC;GT/IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ES8IRA;EACAC;GRhJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EQ+IRA;EACAC;GPjJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EOgJRA;EACAC;GNlJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;EMiJRA;EACAC;GLnJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EKkJRA;EACAC;GJpJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EImJRA;EACAC;GHrJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EGoJRA;EACAC;GFtJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEqJRA;EACAC;GDv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"}
1
+ {"version":3,"file":"index.js","names":["root","packageJson","gitignore","dockerignore","npmrc","turboJson","pnpmWorkspace","readme","env","envExample","agentsMd","claudeMd","web","packageJson","gitignore","readme","nextConfig","postcssConfig","tsconfig","layout","page","providers","authForm","authRoute","authClient","manifest","api","packageJson","nestCli","tsconfig","tsconfigBuild","appModule","appService","appServiceSpec","readme","packageJson","srcIndex","tsconfig","tsconfig","srcSchema","srcMigrate","scriptsNewMigration","migrationsReadme","packageJsonSqlite","srcIndexSqlite","packageJsonPostgres","srcIndexPostgres","ui","packageJson","button","link","logo","utils","globalsCss","postcssConfig","tsconfig","packageJson","utils","useMobile","globalsCss","postcssConfig","tsconfig","link","logo","layout","page","providers","authForm","accordion","alertDialog","alert","aspectRatio","avatar","badge","breadcrumb","button","calendar","card","carousel","chart","checkbox","collapsible","command","combobox","contextMenu","dialog","direction","drawer","dropdownMenu","empty","field","hoverCard","buttonGroup","inputGroup","item","kbd","nativeSelect","spinner","inputOtp","input","label","menubar","navigationMenu","pagination","popover","progress","radioGroup","resizable","scrollArea","select","separator","sheet","sidebar","skeleton","slider","sonner","switchComp","table","tabs","textarea","toggleGroup","toggle","tooltip","modeToggle","attachment","bubble","marker","message","messageScroller","componentsJson","webComponentsJson","packageJson","tokens","button","link","logo","globalsCss","tsconfig","webPackageJson","webPackageJsonDi","babelConfig","postcssConfig","layout","page","authForm","root","packageJson","base","next","reactInternal","webConfig","apiConfig","uiConfig","prettierrc","prettierignore","oxlintrc","oxfmtrc","pluginPackageJson","pluginReadme","packageJson","base","nextjs","reactLibrary","jestConfig","jestE2eConfig","e2eSpec","nestjsBetterAuthMock","vitestConfig","vitestConfigE2e","e2eSpec","dockerfile","dockerCompose","nextConfig","turboJson","apiPackageJson","webNextConfig","apiPackageJson","apiTsconfig","apiIndex","webNestContext","webHelloRoute","webPackageJson","webNextConfig","webTsconfig","webNextConfig","webHelloRoute","dockerfile","dockerCompose","nextConfig","appController","appControllerSpec","appModule","main","todosModule","todosService","todosServiceSpec","dbSchema","dbMigrationTodos","todosController","todosModuleControllers","appModuleControllers","webTodosRoute","webTodosIdRoute","webTodosToggleRoute","appModuleDi","apiIndex","webTodoList","webPage","shadcnTodoList","shadcnPage","stylexTodoList","stylexPage","deploymentSpa","web","nestDiOnlyModule","root","api","ui","pkg.version","pkg.version"],"sources":["../package.json","../src/templates/root/templates/package-json.ts","../src/templates/root/templates/gitignore.ts","../src/templates/root/templates/dockerignore.ts","../src/templates/root/templates/npmrc.ts","../src/templates/root/templates/turbo-json.ts","../src/templates/root/templates/pnpm-workspace.ts","../src/templates/root/templates/readme.ts","../src/templates/root/templates/env.ts","../src/templates/root/templates/env-example.ts","../src/templates/root/templates/agents-md.ts","../src/templates/root/templates/claude-md.ts","../src/templates/root/index.ts","../src/templates/web/templates/package-json.ts","../src/templates/web/templates/gitignore.ts","../src/templates/web/templates/readme.ts","../src/templates/web/templates/next-config.ts","../src/templates/web/templates/postcss-config.ts","../src/templates/web/templates/tsconfig.ts","../src/templates/web/templates/layout.ts","../src/templates/web/templates/page.ts","../src/templates/web/templates/providers.ts","../src/templates/web/templates/auth-form.ts","../src/templates/web/templates/auth-route.ts","../src/templates/web/templates/auth-client.ts","../src/templates/web/templates/manifest.ts","../src/templates/web/index.ts","../src/templates/api/templates/package-json.ts","../src/templates/api/templates/nest-cli.ts","../src/templates/api/templates/tsconfig.ts","../src/templates/api/templates/tsconfig-build.ts","../src/templates/api/templates/app-module.ts","../src/templates/api/templates/app-service.ts","../src/templates/api/templates/app-service-spec.ts","../src/templates/api/templates/readme.ts","../src/templates/api/index.ts","../src/templates/auth/templates/package-json.ts","../src/templates/auth/templates/src-index.ts","../src/templates/auth/templates/tsconfig.ts","../src/templates/auth/index.ts","../src/templates/db/templates/tsconfig.ts","../src/templates/db/templates/src-schema.ts","../src/templates/db/templates/src-migrate.ts","../src/templates/db/templates/scripts-new-migration.ts","../src/templates/db/templates/migrations-readme.ts","../src/templates/db/templates/package-json-sqlite.ts","../src/templates/db/templates/package-json-postgres.ts","../src/templates/db/templates/src-index-sqlite.ts","../src/templates/db/templates/src-index-postgres.ts","../src/templates/db/index.ts","../src/templates/ui/templates/package-json.ts","../src/templates/ui/templates/button.ts","../src/templates/ui/templates/link.ts","../src/templates/ui/templates/logo.ts","../src/templates/ui/templates/utils.ts","../src/templates/ui/templates/globals-css.ts","../src/templates/ui/templates/postcss-config.ts","../src/templates/ui/templates/tsconfig.ts","../src/templates/ui/index.ts","../src/templates/versions.ts","../src/templates/shadcn-ui/templates/components-json.ts","../src/templates/shadcn-ui/templates/web-components-json.ts","../src/templates/shadcn-ui/templates/package-json.ts","../src/templates/shadcn-ui/templates/utils.ts","../src/templates/shadcn-ui/templates/use-mobile.ts","../src/templates/shadcn-ui/templates/globals-css.ts","../src/templates/shadcn-ui/templates/postcss-config.ts","../src/templates/shadcn-ui/templates/tsconfig.ts","../src/templates/shadcn-ui/templates/link.ts","../src/templates/shadcn-ui/templates/logo.ts","../src/templates/shadcn-ui/templates/layout.ts","../src/templates/shadcn-ui/templates/page.ts","../src/templates/shadcn-ui/templates/providers.ts","../src/templates/shadcn-ui/templates/auth-form.ts","../src/templates/shadcn-ui/templates/accordion.ts","../src/templates/shadcn-ui/templates/alert-dialog.ts","../src/templates/shadcn-ui/templates/alert.ts","../src/templates/shadcn-ui/templates/aspect-ratio.ts","../src/templates/shadcn-ui/templates/avatar.ts","../src/templates/shadcn-ui/templates/badge.ts","../src/templates/shadcn-ui/templates/breadcrumb.ts","../src/templates/shadcn-ui/templates/button.ts","../src/templates/shadcn-ui/templates/calendar.ts","../src/templates/shadcn-ui/templates/card.ts","../src/templates/shadcn-ui/templates/carousel.ts","../src/templates/shadcn-ui/templates/chart.ts","../src/templates/shadcn-ui/templates/checkbox.ts","../src/templates/shadcn-ui/templates/collapsible.ts","../src/templates/shadcn-ui/templates/command.ts","../src/templates/shadcn-ui/templates/combobox.ts","../src/templates/shadcn-ui/templates/context-menu.ts","../src/templates/shadcn-ui/templates/dialog.ts","../src/templates/shadcn-ui/templates/direction.ts","../src/templates/shadcn-ui/templates/drawer.ts","../src/templates/shadcn-ui/templates/dropdown-menu.ts","../src/templates/shadcn-ui/templates/empty.ts","../src/templates/shadcn-ui/templates/field.ts","../src/templates/shadcn-ui/templates/hover-card.ts","../src/templates/shadcn-ui/templates/button-group.ts","../src/templates/shadcn-ui/templates/input-group.ts","../src/templates/shadcn-ui/templates/item.ts","../src/templates/shadcn-ui/templates/kbd.ts","../src/templates/shadcn-ui/templates/native-select.ts","../src/templates/shadcn-ui/templates/spinner.ts","../src/templates/shadcn-ui/templates/input-otp.ts","../src/templates/shadcn-ui/templates/input.ts","../src/templates/shadcn-ui/templates/label.ts","../src/templates/shadcn-ui/templates/menubar.ts","../src/templates/shadcn-ui/templates/navigation-menu.ts","../src/templates/shadcn-ui/templates/pagination.ts","../src/templates/shadcn-ui/templates/popover.ts","../src/templates/shadcn-ui/templates/progress.ts","../src/templates/shadcn-ui/templates/radio-group.ts","../src/templates/shadcn-ui/templates/resizable.ts","../src/templates/shadcn-ui/templates/scroll-area.ts","../src/templates/shadcn-ui/templates/select.ts","../src/templates/shadcn-ui/templates/separator.ts","../src/templates/shadcn-ui/templates/sheet.ts","../src/templates/shadcn-ui/templates/sidebar.ts","../src/templates/shadcn-ui/templates/skeleton.ts","../src/templates/shadcn-ui/templates/slider.ts","../src/templates/shadcn-ui/templates/sonner.ts","../src/templates/shadcn-ui/templates/switch.ts","../src/templates/shadcn-ui/templates/table.ts","../src/templates/shadcn-ui/templates/tabs.ts","../src/templates/shadcn-ui/templates/textarea.ts","../src/templates/shadcn-ui/templates/toggle-group.ts","../src/templates/shadcn-ui/templates/toggle.ts","../src/templates/shadcn-ui/templates/tooltip.ts","../src/templates/shadcn-ui/templates/mode-toggle.ts","../src/templates/shadcn-ui/templates/attachment.ts","../src/templates/shadcn-ui/templates/bubble.ts","../src/templates/shadcn-ui/templates/marker.ts","../src/templates/shadcn-ui/templates/message.ts","../src/templates/shadcn-ui/templates/message-scroller.ts","../src/templates/shadcn-ui/index.ts","../src/templates/stylex-ui/templates/package-json.ts","../src/templates/stylex-ui/templates/tokens.ts","../src/templates/stylex-ui/templates/button.ts","../src/templates/stylex-ui/templates/link.ts","../src/templates/stylex-ui/templates/logo.ts","../src/templates/stylex-ui/templates/globals-css.ts","../src/templates/stylex-ui/templates/web-package-json.ts","../src/templates/stylex-ui/templates/web-package-json-di.ts","../src/templates/stylex-ui/templates/babel-config.ts","../src/templates/stylex-ui/templates/postcss-config.ts","../src/templates/stylex-ui/templates/layout.ts","../src/templates/stylex-ui/templates/page.ts","../src/templates/stylex-ui/templates/auth-form.ts","../src/templates/stylex-ui/index.ts","../src/templates/eslint-config/templates/package-json.ts","../src/templates/eslint-config/templates/base.ts","../src/templates/eslint-config/templates/next.ts","../src/templates/eslint-config/templates/react-internal.ts","../src/templates/web/templates/eslint-config.ts","../src/templates/api/templates/eslint-config.ts","../src/templates/ui/templates/eslint-config.ts","../src/templates/root/templates/prettierrc.ts","../src/templates/root/templates/prettierignore.ts","../src/templates/eslint-config/index.ts","../src/templates/oxc/templates/oxlintrc.ts","../src/templates/oxc/templates/oxfmtrc.ts","../src/templates/oxc/index.ts","../src/templates/anti-slop/templates/plugin-package-json.ts","../src/templates/anti-slop/templates/plugin-readme.ts","../src/templates/anti-slop/index.ts","../src/templates/typescript-config/templates/package-json.ts","../src/templates/typescript-config/templates/base.ts","../src/templates/typescript-config/templates/nextjs.ts","../src/templates/typescript-config/templates/react-library.ts","../src/templates/typescript-config/index.ts","../src/templates/testing-jest/templates/jest-config.ts","../src/templates/testing-jest/templates/jest-e2e-config.ts","../src/templates/testing-jest/templates/e2e-spec.ts","../src/templates/testing-jest/templates/nestjs-better-auth-mock.ts","../src/templates/testing-jest/index.ts","../src/templates/testing-vitest/templates/vitest-config.ts","../src/templates/testing-vitest/templates/vitest-config-e2e.ts","../src/templates/testing-vitest/templates/e2e-spec.ts","../src/templates/testing-vitest/index.ts","../src/templates/deployment-standalone/templates/dockerfile.ts","../src/templates/deployment-standalone/templates/docker-compose.ts","../src/templates/deployment-standalone/templates/next-config.ts","../src/templates/deployment-standalone/templates/turbo-json.ts","../src/templates/deployment-standalone/index.ts","../src/templates/single-process-static-export/templates/api-package-json.ts","../src/templates/single-process-static-export/templates/web-next-config.ts","../src/templates/single-process-static-export/index.ts","../src/templates/nest-di-only/templates/api-package-json.ts","../src/templates/nest-di-only/templates/api-tsconfig.ts","../src/templates/nest-di-only/templates/api-index.ts","../src/templates/nest-di-only/templates/web-nest-context.ts","../src/templates/nest-di-only/templates/web-package-json.ts","../src/templates/nest-di-only/templates/web-next-config.ts","../src/templates/nest-di-only/templates/web-tsconfig.ts","../src/templates/nest-di-only/templates/web-hello-route.ts","../src/templates/nest-di-only/index.ts","../src/templates/nest-off/templates/web-next-config.ts","../src/templates/nest-off/templates/web-hello-route.ts","../src/templates/nest-off/index.ts","../src/templates/deployment-standalone-web/templates/dockerfile.ts","../src/templates/deployment-standalone-web/templates/docker-compose.ts","../src/templates/deployment-standalone-web/templates/next-config.ts","../src/templates/deployment-standalone-web/index.ts","../src/templates/api-controllers/templates/app-controller.ts","../src/templates/api-controllers/templates/app-controller-spec.ts","../src/templates/api-controllers/templates/app-module.ts","../src/templates/api/templates/main.ts","../src/templates/api-controllers/index.ts","../src/templates/todo-example/templates/todos-module.ts","../src/templates/todo-example/templates/todos-service.ts","../src/templates/todo-example/templates/todos-service-spec.ts","../src/templates/todo-example/templates/db-schema.ts","../src/templates/todo-example/templates/db-migration-todos.ts","../src/templates/todo-example/templates/todos-controller.ts","../src/templates/todo-example/templates/todos-module-controllers.ts","../src/templates/todo-example/templates/app-module-controllers.ts","../src/templates/todo-example/templates/app-module-di.ts","../src/templates/todo-example/templates/api-index.ts","../src/templates/todo-example/templates/web-todos-route.ts","../src/templates/todo-example/templates/web-todos-id-route.ts","../src/templates/todo-example/templates/web-todos-toggle-route.ts","../src/templates/todo-example/templates/web-todo-list.ts","../src/templates/todo-example/templates/web-page.ts","../src/templates/todo-example/templates/shadcn-todo-list.ts","../src/templates/todo-example/templates/shadcn-page.ts","../src/templates/todo-example/templates/stylex-todo-list.ts","../src/templates/todo-example/templates/stylex-page.ts","../src/templates/todo-example/index.ts","../src/templates/index.ts","../src/utils.ts","../src/tasks.ts","../src/telemetry.ts","../src/index.ts"],"sourcesContent":["","export default {\n filename: \"package.json\",\n template: `{\n \"name\": \"<%= projectName %>\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"turbo run build\",\n \"dev\": \"turbo run dev\",\n \"lint\": \"turbo run lint\",\n \"test\": \"turbo run test\",\n \"typecheck\": \"turbo run typecheck\",\n \"db:make\": \"pnpm --filter @<%= projectName %>/db run make\",\n \"db:migrate\": \"turbo run migrate\",\n \"db:generate\": \"turbo run generate\"\n },\n \"devDependencies\": {<% if (shadcn && linter === \"oxc\") { %>\n \"@shadcn/lint\": \"<%= versions[\"@shadcn/lint\"] %>\",<% } %>\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"turbo\": \"<%= versions.turbo %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n },\n \"packageManager\": \"pnpm@11.25.0\",\n \"engines\": {\n \"node\": \">=24.0.0\"\n }\n}`,\n};\n","export default {\n filename: \".gitignore\",\n template: `# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# Dependencies\nnode_modules\n.pnp\n.pnp.js\n\n# Local env files\n.env\ndev.db*\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# Testing\ncoverage\n\n# Turbo\n.turbo\n\n# Vercel\n.vercel\n\n# Build Outputs\n.next/\nout/\nbuild\ndist\n\n\n# Debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Misc\n.DS_Store\n*.pem`,\n};\n","export default {\n filename: \".dockerignore\",\n template: `node_modules\n.next\ndist\n.turbo\n*.log\n.env\n.env.*\n!.env.example\ndev.db*\n.git\ncoverage`,\n};\n","export default {\n filename: \".npmrc\",\n template: ``,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment !== \"standalone\",\n filename: \"turbo.json\",\n template: `{\n \"$schema\": \"https://turborepo.dev/schema.json\",\n \"ui\": \"tui\",\n \"tasks\": {\n \"build\": {\n \"env\": [\"DATABASE_URL\"],\n \"dependsOn\": [\"^build\"],\n \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n \"outputs\": [\".next/**\", \"!.next/cache/**\", \"dist/**\"]\n },\n \"typecheck\": {\n \"dependsOn\": [\"^build\"]\n },<% if (linter !== \"oxc\") { %>\n \"lint\": {\n \"dependsOn\": [\"^lint\"],\n \"env\": [\"NODE_ENV\"]\n },\n \"lint:check\": {\n \"dependsOn\": [\"^lint:check\"],\n \"env\": [\"NODE_ENV\"]\n },<% } %>\n \"test\": {\n \"dependsOn\": [\"^build\"]\n },\n \"dev\": {\n \"dependsOn\": [\"^migrate\"],\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false,\n \"persistent\": true\n },\n \"migrate\": {\n \"dependsOn\": [\"^migrate\"],\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false\n },\n \"generate\": {\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false\n }\n }\n}`,\n};\n","export default {\n filename: \"pnpm-workspace.yaml\",\n template: `packages:\n - \"apps/*\"\n - \"packages/*\"\n\nallowBuilds:\n \"@parcel/watcher\": true\n \"@swc/core\": true\n better-sqlite3: true\n esbuild: true\n sharp: true\n unrs-resolver: true`,\n};\n","export default {\n filename: \"README.md\",\n template: `# <%= projectName %>\n\nFull-stack monorepo: Next.js 16<% if (nest !== 'off') { %> + NestJS 11<% } %> + better-auth + <%= database === 'postgres' ? 'Postgres' : 'SQLite' %>.\n\n## Quick start\n\n\\`\\`\\`sh\n<% if (database === 'postgres') { %># set DATABASE_URL in .env to your Postgres database\n<% } %>pnpm install\npnpm dev\n\\`\\`\\`\n\nOpen [http://localhost:3000](http://localhost:3000).\n\n## Apps\n\n- **web**: Next.js frontend (port 3000)\n<% if (nest === 'on') { -%>\n- **api**: NestJS backend (port 3001)\n<% } else if (nest === 'di-only') { -%>\n- **api**: NestJS providers, resolved from the web process (no HTTP server)\n<% } -%>\n\n## Packages\n\n- **\\`@<%= projectName %>/auth\\`**: better-auth config\n- **\\`@<%= projectName %>/db\\`**: Kysely client and migrations\n- **\\`@<%= projectName %>/ui\\`**: shared React components\n<% if (linter === 'eslint') { -%>\n- **\\`@<%= projectName %>/eslint-config\\`**: shared ESLint config\n<% } -%>\n- **\\`@<%= projectName %>/typescript-config\\`**: shared tsconfig\n`,\n};\n","export default {\n filename: \".env\",\n template: `<% if (database === 'postgres') { %>DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres\n<% } else { %># Local SQLite database, written to dev.db at the repo root\n<% } %>BETTER_AUTH_URL=http://localhost:3000\nBETTER_AUTH_SECRET=<%= authSecret %>\n`,\n};\n","export default {\n filename: \".env.example\",\n template: `<% if (database === 'postgres') { %>DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres\n<% } else { %># Local SQLite database, written to dev.db at the repo root\n<% } %>BETTER_AUTH_URL=http://localhost:3000\nBETTER_AUTH_SECRET=generate-with-openssl-rand-base64-32\n`,\n};\n","export default {\n filename: \"AGENTS.md\",\n template: `<!-- BEGIN:nextjs-agent-rules -->\n# This is NOT the Next.js you know\n\nThis version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in \\`node_modules/next/dist/docs/\\` before writing any code. Heed deprecation notices.\n<!-- END:nextjs-agent-rules --><% if (shadcn) { %>\n\nAfter making changes, run \\`pnpm lint:check\\` and fix all errors.<% } %>`,\n};\n","export default {\n filename: \"CLAUDE.md\",\n template: `@AGENTS.md`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport gitignore from \"./templates/gitignore\";\nimport dockerignore from \"./templates/dockerignore\";\nimport npmrc from \"./templates/npmrc\";\nimport turboJson from \"./templates/turbo-json\";\nimport pnpmWorkspace from \"./templates/pnpm-workspace\";\nimport readme from \"./templates/readme\";\nimport env from \"./templates/env\";\nimport envExample from \"./templates/env-example\";\nimport agentsMd from \"./templates/agents-md\";\nimport claudeMd from \"./templates/claude-md\";\n\nconst root: Module = {\n templates: [\n packageJson,\n gitignore,\n dockerignore,\n npmrc,\n turboJson,\n pnpmWorkspace,\n readme,\n env,\n envExample,\n agentsMd,\n claudeMd,\n ],\n};\n\nexport default root;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"di-only\" && !s.stylex,\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\",\n \"typecheck\": \"next typegen && tsc --noEmit\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/web/.gitignore\",\n template: `# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n.yarn/install-state.gz\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# env files (can opt-in for commiting if needed)\n.env*\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts`,\n};\n","export default {\n filename: \"apps/web/README.md\",\n template: `This is a [Next.js](https://nextjs.org) project bootstrapped with [\\`create-next-app\\`](https://nextjs.org/docs/app/api-reference/create-next-app).\n\n## Getting Started\n\nFirst, run the development server:\n\n\\`\\`\\`bash\nnpm run dev\n# or\nyarn dev\n# or\npnpm dev\n# or\nbun dev\n\\`\\`\\`\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying \\`app/page.tsx\\`. The page auto-updates as you edit the file.\n\nThis project uses [\\`next/font\\`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load Inter, a custom Google Font.\n\n## Learn More\n\nTo learn more about Next.js, take a look at the following resources:\n\n- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.\n- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.\n\nYou can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!\n\n## Deploy on Vercel\n\nThe easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.\n\nCheck out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment === \"none\" && s.nest === \"on\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n async rewrites() {\n return [\n {\n source: '/api/:path*',\n destination: 'http://localhost:3001/api/:path*',\n },\n ];\n },\n};\n\nexport default nextConfig;`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.stylex,\n filename: \"apps/web/postcss.config.mjs\",\n template: `export { default } from \"@<%= projectName %>/ui/postcss.config\";`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"di-only\",\n filename: \"apps/web/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/nextjs.json\",\n \"compilerOptions\": {\n \"plugins\": [\n {\n \"name\": \"next\"\n }\n ],\n \"strictNullChecks\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\n \"**/*.ts\",\n \"**/*.tsx\",\n \"next-env.d.ts\",\n \"next.config.js\",\n \".next/types/**/*.ts\"\n ],\n \"exclude\": [\"node_modules\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.shadcn && !s.stylex,\n filename: \"apps/web/app/layout.tsx\",\n template: `import type { Metadata } from \"next\";\nimport localFont from \"next/font/local\";\nimport Providers from \"@/app/providers\";\nimport \"@<%= projectName %>/ui/globals.css\";\n\nconst geistSans = localFont({\n src: \"./fonts/GeistVF.woff\",\n variable: \"--font-geist-sans\",\n});\nconst geistMono = localFont({\n src: \"./fonts/GeistMonoVF.woff\",\n variable: \"--font-geist-mono\",\n});\n\nexport const metadata: Metadata = {\n title: \"<%= projectName %>\",\n description: \"Next + Nest = Newt\",\n icons: {\n icon: [\n { url: \"/icon0.svg\", type: \"image/svg+xml\" },\n { url: \"/icon1.png\", type: \"image/png\" },\n ],\n apple: \"/apple-icon.png\",\n },\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\">\n <body className={\\`\\${geistSans.variable} \\${geistMono.variable} h-full\\`}>\n <Providers>{children}</Providers>\n </body>\n </html>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample && !s.shadcn && !s.stylex,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello', session?.user.id],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b\">\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto text-foreground\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">next.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">nest.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 border rounded-md p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"rounded-xl border p-6\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground mb-4\">better-auth</p>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <div className=\"space-y-3\">\n <p className=\"text-sm\">Signed in as {session.user.name}</p>\n <Button onClick={() => void authClient.signOut()}>\n Sign out\n </Button>\n </div>\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.shadcn,\n filename: \"apps/web/app/providers.tsx\",\n template: `'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useState } from 'react';\n\nexport default function Providers({ children }: { children: React.ReactNode }) {\n const [client] = useState(() => new QueryClient());\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>;\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.shadcn && !s.stylex,\n filename: \"apps/web/app/auth-form.tsx\",\n template: `'use client';\n\nimport { useForm } from '@tanstack/react-form';\nimport { useState } from 'react';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\n\nexport function AuthForm() {\n const [tab, setTab] = useState<'signin' | 'signup'>('signup');\n const [error, setError] = useState('');\n\n const form = useForm({\n defaultValues: { name: '', email: '', password: '' },\n onSubmit: async ({ value }) => {\n setError('');\n if (tab === 'signin') {\n const { error } = await authClient.signIn.email(value);\n if (error) setError(error.message ?? 'Sign in failed');\n } else {\n const { error } = await authClient.signUp.email(value);\n if (error) setError(error.message ?? 'Sign up failed');\n }\n },\n });\n\n return (\n <>\n <div className=\"flex gap-2 mb-6 text-sm\">\n <button\n onClick={() => setTab('signup')}\n className={\n tab === 'signup'\n ? 'font-semibold'\n : 'text-muted-foreground hover:text-gray-200'\n }\n >\n Sign up\n </button>\n <span className=\"text-gray-600\">|</span>\n <button\n onClick={() => setTab('signin')}\n className={\n tab === 'signin'\n ? 'font-semibold'\n : 'text-muted-foreground hover:text-gray-200'\n }\n >\n Sign in\n </button>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n {tab === 'signup' && (\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium\">Name</label>\n <input\n type=\"text\"\n autoComplete=\"name\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n className=\"flex h-9 w-full rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n </div>\n )}\n </form.Field>\n )}\n\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium\">Email</label>\n <input\n type=\"email\"\n autoComplete=\"email\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n className=\"flex h-9 w-full rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n </div>\n )}\n </form.Field>\n\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-1\">\n <label className=\"text-sm font-medium\">Password</label>\n <input\n type=\"password\"\n autoComplete={\n tab === 'signin' ? 'current-password' : 'new-password'\n }\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n minLength={8}\n className=\"flex h-9 w-full rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n </div>\n )}\n </form.Field>\n\n {error && <p className=\"text-sm text-red-500\">{error}</p>}\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting} className=\"w-full\">\n {isSubmitting\n ? 'Loading…'\n : tab === 'signin'\n ? 'Sign in'\n : 'Create account'}\n </Button>\n )}\n </form.Subscribe>\n </form>\n </>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/auth/[...all]/route.ts\",\n template: `import { auth } from \"@<%= projectName %>/auth\";\nimport { toNextJsHandler } from \"better-auth/next-js\";\n\nexport const { GET, POST } = toNextJsHandler(auth);`,\n};\n","export default {\n filename: \"apps/web/lib/auth-client.ts\",\n template: `import { createAuthClient } from \"better-auth/react\";\n\nexport const authClient: ReturnType<typeof createAuthClient> = createAuthClient();`,\n};\n","export default {\n filename: \"apps/web/app/manifest.json\",\n template: `{\n \"name\": \"<%= projectName %>\",\n \"short_name\": \"<%= projectName %>\",\n \"icons\": [\n {\n \"src\": \"/web-app-manifest-192x192.png\",\n \"sizes\": \"192x192\",\n \"type\": \"image/png\",\n \"purpose\": \"maskable\"\n },\n {\n \"src\": \"/web-app-manifest-512x512.png\",\n \"sizes\": \"512x512\",\n \"type\": \"image/png\",\n \"purpose\": \"maskable\"\n }\n ],\n \"theme_color\": \"#ffffff\",\n \"background_color\": \"#ffffff\",\n \"display\": \"standalone\"\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport gitignore from \"./templates/gitignore\";\nimport readme from \"./templates/readme\";\nimport nextConfig from \"./templates/next-config\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport tsconfig from \"./templates/tsconfig\";\nimport layout from \"./templates/layout\";\nimport page from \"./templates/page\";\nimport providers from \"./templates/providers\";\nimport authForm from \"./templates/auth-form\";\nimport authRoute from \"./templates/auth-route\";\nimport authClient from \"./templates/auth-client\";\nimport manifest from \"./templates/manifest\";\nconst web: Module = {\n templates: [\n packageJson,\n gitignore,\n readme,\n nextConfig,\n postcssConfig,\n tsconfig,\n layout,\n page,\n providers,\n authForm,\n authRoute,\n authClient,\n manifest,\n ],\n staticFiles: [\n {\n src: \"web/static/fonts/GeistVF.woff\",\n filename: \"apps/web/app/fonts/GeistVF.woff\",\n },\n {\n src: \"web/static/fonts/GeistMonoVF.woff\",\n filename: \"apps/web/app/fonts/GeistMonoVF.woff\",\n },\n { src: \"web/static/favicon.ico\", filename: \"apps/web/app/favicon.ico\" },\n { src: \"web/static/icon0.svg\", filename: \"apps/web/app/icon0.svg\" },\n { src: \"web/static/icon1.png\", filename: \"apps/web/app/icon1.png\" },\n {\n src: \"web/static/apple-icon.png\",\n filename: \"apps/web/app/apple-icon.png\",\n },\n {\n src: \"web/static/public/web-app-manifest-192x192.png\",\n filename: \"apps/web/public/web-app-manifest-192x192.png\",\n },\n {\n src: \"web/static/public/web-app-manifest-512x512.png\",\n filename: \"apps/web/public/web-app-manifest-512x512.png\",\n },\n ],\n};\n\nexport default web;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\" && s.deployment !== \"spa\",\n filename: \"apps/api/package.json\",\n template: `{\n \"name\": \"api\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"nest build\",\n \"typecheck\": \"tsc -p tsconfig.build.json --noEmit\",\n \"start\": \"nest start\",\n \"dev\": \"nest start --watch\",\n \"start:debug\": \"nest start --debug --watch\",\n \"start:prod\": \"node dist/main\"\n },\n \"dependencies\": {\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"@nestjs/platform-express\": \"<%= versions[\"@nestjs/platform-express\"] %>\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@thallesp/nestjs-better-auth\": \"<%= versions[\"@thallesp/nestjs-better-auth\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"rxjs\": \"<%= versions.rxjs %>\"\n },\n \"devDependencies\": {\n \"@nestjs/cli\": \"<%= versions[\"@nestjs/cli\"] %>\",\n \"@nestjs/schematics\": \"<%= versions[\"@nestjs/schematics\"] %>\",\n \"@nestjs/testing\": \"<%= versions[\"@nestjs/testing\"] %>\",\n \"@types/express\": \"<%= versions[\"@types/express\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/supertest\": \"<%= versions[\"@types/supertest\"] %>\",\n \"supertest\": \"<%= versions.supertest %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/api/nest-cli.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/nest-cli\",\n \"collection\": \"@nestjs/schematics\",\n \"sourceRoot\": \"src\",\n \"compilerOptions\": {\n \"deleteOutDir\": true\n }\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"apps/api/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"module\": \"nodenext\",\n \"moduleResolution\": \"nodenext\",\n \"resolvePackageJsonExports\": true,\n \"esModuleInterop\": true,\n \"isolatedModules\": true,\n \"declaration\": true,\n \"removeComments\": true,\n \"emitDecoratorMetadata\": true,\n \"experimentalDecorators\": true,\n \"allowSyntheticDefaultImports\": true,\n \"target\": \"ES2023\",\n \"sourceMap\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"skipLibCheck\": true,\n \"strict\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noFallthroughCasesInSwitch\": false,\n \"types\": [<% if (testing === 'jest') { %>\"jest\", <% } %><% if (testing === 'vitest') { %>\"vitest/globals\", <% } %>\"node\"]\n },\n \"exclude\": [\"vitest.config.mts\", \"vitest.config.e2e.mts\", \"node_modules\", \"dist\"]\n}`,\n};\n","export default {\n filename: \"apps/api/tsconfig.build.json\",\n template: `{\n \"extends\": \"./tsconfig.json\",\n \"exclude\": [\"node_modules\", \"test\", \"dist\", \"**/*spec.ts\", \"vitest.config.mts\", \"vitest.config.e2e.mts\", \"jest.config.ts\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\" && !s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Module({\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","export default {\n filename: \"apps/api/src/app.service.ts\",\n template: `import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello from Nest';\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/app.service.spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { AppService } from './app.service';\n\ndescribe('AppService', () => {\n let service: AppService;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [AppService],\n }).compile();\n\n service = module.get<AppService>(AppService);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n});`,\n};\n","export default {\n filename: \"apps/api/README.md\",\n template: `# API\n\nNestJS backend for the monorepo.\n\n## Scripts\n\n\\`\\`\\`sh\npnpm dev # watch mode\npnpm build # production build\npnpm test # unit tests<% if (nest === 'on') { %>\npnpm test:e2e # e2e tests<% } %>\n\\`\\`\\``,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport nestCli from \"./templates/nest-cli\";\nimport tsconfig from \"./templates/tsconfig\";\nimport tsconfigBuild from \"./templates/tsconfig-build\";\nimport appModule from \"./templates/app-module\";\nimport appService from \"./templates/app-service\";\nimport appServiceSpec from \"./templates/app-service-spec\";\nimport readme from \"./templates/readme\";\n\nconst api: Module = {\n templates: [\n packageJson,\n nestCli,\n tsconfig,\n tsconfigBuild,\n appModule,\n appService,\n appServiceSpec,\n readme,\n ],\n};\n\nexport default api;\n","export default {\n filename: \"packages/auth/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/auth\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"migrate\": \"dotenv -e ../../.env -- auth migrate -y --config src/index.ts\",\n \"generate\": \"dotenv -e ../../.env -- auth generate --config src/index.ts\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"auth\": \"<%= versions.auth %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"dotenv-cli\": \"<%= versions[\"dotenv-cli\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/auth/src/index.ts\",\n template: `import { betterAuth } from \"better-auth\";\nimport { driver } from \"@<%= projectName %>/db\";\n\nexport const auth = betterAuth({\n database: driver,\n emailAndPassword: { enabled: true },\n trustedOrigins: [process.env.BETTER_AUTH_URL ?? \"http://localhost:3000\"],\n});\n\nexport type Auth = typeof auth;`,\n};\n","export default {\n filename: \"packages/auth/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"erasableSyntaxOnly\": true,\n \"esModuleInterop\": true,\n \"lib\": [\"es2022\"],\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"noEmit\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\"\n },\n \"include\": [\"src\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport srcIndex from \"./templates/src-index\";\nimport tsconfig from \"./templates/tsconfig\";\n\nconst auth: Module = {\n templates: [packageJson, srcIndex, tsconfig],\n};\n\nexport default auth;\n","export default {\n filename: \"packages/db/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"erasableSyntaxOnly\": true,\n \"esModuleInterop\": true,\n \"lib\": [\"es2022\"],\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"noEmit\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\"\n },\n \"include\": [\"src\", \"scripts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"packages/db/src/schema.ts\",\n template: `<% const date = database === 'postgres' ? 'Date' : 'string'; const bool = database === 'postgres' ? 'boolean' : 'number'; -%>\nexport interface UserTable {\n id: string;\n name: string;\n email: string;\n emailVerified: <%= bool %>;\n image: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface SessionTable {\n id: string;\n expiresAt: <%= date %>;\n token: string;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n ipAddress: string | null;\n userAgent: string | null;\n userId: string;\n}\n\nexport interface AccountTable {\n id: string;\n issuer: string;\n accountId: string;\n providerId: string;\n userId: string;\n accessToken: string | null;\n refreshToken: string | null;\n idToken: string | null;\n accessTokenExpiresAt: <%= date %> | null;\n refreshTokenExpiresAt: <%= date %> | null;\n scope: string | null;\n password: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface VerificationTable {\n id: string;\n identifier: string;\n value: string;\n expiresAt: <%= date %>;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface DB {\n account: AccountTable;\n session: SessionTable;\n user: UserTable;\n verification: VerificationTable;\n}`,\n};\n","export default {\n filename: \"packages/db/src/migrate.ts\",\n template: `import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { FileMigrationProvider, Migrator } from \"kysely\";\nimport { db } from \"./index.js\";\n\nasync function main() {\n const migrator = new Migrator({\n db,\n provider: new FileMigrationProvider({\n fs,\n path,\n migrationFolder: path.join(process.cwd(), \"src/migrations\"),\n }),\n });\n\n const { error, results } = await migrator.migrateToLatest();\n\n for (const it of results ?? []) {\n if (it.status === \"Success\") {\n console.log(\"applied \" + it.migrationName);\n } else if (it.status === \"Error\") {\n console.error(\"failed \" + it.migrationName);\n }\n }\n\n if (error) {\n console.error(\"migration failed\");\n console.error(error);\n process.exit(1);\n }\n\n await db.destroy();\n}\n\nmain();`,\n};\n","export default {\n filename: \"packages/db/scripts/new-migration.ts\",\n template: `import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nasync function main() {\n const name = process.argv[2];\n if (!name) {\n console.error(\"Usage: pnpm db:make <name>\");\n process.exit(1);\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[-:T]/g, \"\")\n .slice(0, 14);\n const slug = name.replace(/[^a-zA-Z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n const filename = timestamp + \"_\" + slug + \".ts\";\n const dir = path.join(process.cwd(), \"src/migrations\");\n const stub = [\n 'import { Kysely, sql } from \"kysely\";',\n \"\",\n \"export async function up(db: Kysely<any>): Promise<void> {\",\n \" // await db.schema.createTable(...).execute();\",\n \"}\",\n \"\",\n \"export async function down(db: Kysely<any>): Promise<void> {\",\n \" // await db.schema.dropTable(...).execute();\",\n \"}\",\n \"\",\n ].join(\"\\\\n\");\n\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(path.join(dir, filename), stub);\n console.log(\"created src/migrations/\" + filename);\n}\n\nmain();`,\n};\n","export default {\n filename: \"packages/db/src/migrations/README.md\",\n template: `# Migrations\n\nKysely migrations run in filename order. Each file exports \\`up\\` and \\`down\\`.\n\n\\`\\`\\`bash\npnpm db:make add_widgets # scaffold a new migration\npnpm db:migrate # apply pending migrations\n\\`\\`\\`\n\nMigrations are written with Kysely's schema builder, so one file compiles to\nboth SQLite (dev) and Postgres (prod). Prefer dialect-agnostic column types\n(\\`text\\`, \\`integer\\`) and app-generated string ids over auto-increment.`,\n};\n","export default {\n filename: \"packages/db/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/db\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"migrate\": \"dotenv -e ../../.env -- tsx src/migrate.ts\",\n \"make\": \"tsx scripts/new-migration.ts\"\n },\n \"dependencies\": {\n \"better-sqlite3\": \"<%= versions[\"better-sqlite3\"] %>\",\n \"kysely\": \"<%= versions.kysely %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/better-sqlite3\": \"<%= versions[\"@types/better-sqlite3\"] %>\",\n \"dotenv-cli\": \"<%= versions[\"dotenv-cli\"] %>\",\n \"tsx\": \"<%= versions.tsx %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/db/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/db\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"migrate\": \"dotenv -e ../../.env -- tsx src/migrate.ts\",\n \"make\": \"tsx scripts/new-migration.ts\"\n },\n \"dependencies\": {\n \"kysely\": \"<%= versions.kysely %>\",\n \"pg\": \"<%= versions.pg %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/pg\": \"<%= versions[\"@types/pg\"] %>\",\n \"dotenv-cli\": \"<%= versions[\"dotenv-cli\"] %>\",\n \"tsx\": \"<%= versions.tsx %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/db/src/index.ts\",\n template: `import BetterSqlite3 from \"better-sqlite3\";\nimport { Kysely, SqliteDialect } from \"kysely\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { DB } from \"./schema.js\";\n\nfunction projectRoot(from: string) {\n for (let dir = from; ; ) {\n if (fs.existsSync(path.join(dir, \"pnpm-workspace.yaml\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return from;\n dir = parent;\n }\n}\n\nexport const databaseFile =\n process.env.DATABASE_URL ?? path.join(projectRoot(process.cwd()), \"dev.db\");\n\nexport const driver = new BetterSqlite3(databaseFile);\n\nexport const db = new Kysely<DB>({\n dialect: new SqliteDialect({ database: driver }),\n});\n\nexport type Database = Kysely<DB>;`,\n};\n","export default {\n filename: \"packages/db/src/index.ts\",\n template: `import { Kysely, PostgresDialect } from \"kysely\";\nimport { Pool } from \"pg\";\nimport type { DB } from \"./schema.js\";\n\nexport const driver = new Pool({ connectionString: process.env.DATABASE_URL });\n\nexport const db = new Kysely<DB>({\n dialect: new PostgresDialect({ pool: driver }),\n});\n\nexport type Database = Kysely<DB>;`,\n};\n","import type { Module } from \"../types\";\nimport tsconfig from \"./templates/tsconfig\";\nimport srcSchema from \"./templates/src-schema\";\nimport srcMigrate from \"./templates/src-migrate\";\nimport scriptsNewMigration from \"./templates/scripts-new-migration\";\nimport migrationsReadme from \"./templates/migrations-readme\";\nimport packageJsonSqlite from \"./templates/package-json-sqlite\";\nimport packageJsonPostgres from \"./templates/package-json-postgres\";\nimport srcIndexSqlite from \"./templates/src-index-sqlite\";\nimport srcIndexPostgres from \"./templates/src-index-postgres\";\n\nconst shared = [tsconfig, srcSchema, srcMigrate, scriptsNewMigration, migrationsReadme];\n\nexport const dbSqlite: Module = {\n templates: [...shared, packageJsonSqlite, srcIndexSqlite],\n};\n\nexport const dbPostgres: Module = {\n templates: [...shared, packageJsonPostgres, srcIndexPostgres],\n};\n","export default {\n filename: \"packages/ui/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/ui\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"exports\": {\n \"./globals.css\": \"./src/globals.css\",\n \"./postcss.config\": \"./postcss.config.mjs\",\n \"./utils\": \"./src/utils.ts\",\n \"./*\": \"./src/*.tsx\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.0.0\",\n \"react\": \">=19.0.0\",\n \"react-dom\": \">=19.0.0\"\n },\n \"dependencies\": {\n \"clsx\": \"<%= versions.clsx %>\",\n \"tailwind-merge\": \"<%= versions[\"tailwind-merge\"] %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/src/button.tsx\",\n template: `\"use client\";\n\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ninterface ButtonProps {\n children: ReactNode;\n onClick?: () => void;\n type?: \"button\" | \"submit\" | \"reset\";\n disabled?: boolean;\n className?: string;\n}\n\nexport const Button = ({ children, onClick, type = \"button\", disabled, className }: ButtonProps) => {\n return (\n <button\n type={type}\n onClick={onClick}\n disabled={disabled}\n className={cn(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all\",\n \"h-9 px-4 py-2\",\n \"bg-white text-gray-900 shadow-xs hover:bg-gray-100\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-white/50\",\n className\n )}\n >\n {children}\n </button>\n );\n};`,\n};\n","export default {\n filename: \"packages/ui/src/link.tsx\",\n template: `import NextLink, { type LinkProps } from \"next/link\";\nimport { type PropsWithChildren } from \"react\";\nimport { cn } from \"./utils\";\n\nexport function Link({\n href,\n children,\n className,\n ...rest\n}: PropsWithChildren<LinkProps & { className?: string }>) {\n return (\n <NextLink\n href={href}\n {...rest}\n className={cn(\n \"underline decoration-muted-foreground hover:decoration-foreground transition-colors\",\n className\n )}\n >\n {children}\n </NextLink>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/logo.tsx\",\n template: `import { cn } from \"./utils\";\n\ninterface LogoProps {\n className?: string;\n}\n\nexport function Logo({ className }: LogoProps) {\n return (\n <svg\n width=\"196\"\n height=\"138\"\n viewBox=\"0 0 196 138\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"text-foreground\", className)}\n >\n <path\n d=\"M98 35C102.665 35 107.243 35.2232 111.707 35.6514C111.243 38.1972 111 40.8202 111 43.5C111 67.5244 130.476 87 154.5 87C165.156 87 174.914 83.1658 182.478 76.8057C183.476 79.9455 184 83.186 184 86.5C184 114.943 145.496 138 98 138C50.5035 138 12 114.943 12 86.5C12 83.1861 12.5228 79.9454 13.5215 76.8057C21.0851 83.1661 30.8441 87 41.5 87C65.5244 87 85 67.5244 85 43.5C85 40.8202 84.7559 38.1973 84.292 35.6514C88.7559 35.2232 93.3345 35 98 35ZM38.5 0C59.763 0 77 17.237 77 38.5C77 59.763 59.763 77 38.5 77C17.237 77 0 59.763 0 38.5C0 17.237 17.237 0 38.5 0ZM157.5 0C178.763 0 196 17.237 196 38.5C196 59.763 178.763 77 157.5 77C136.237 77 119 59.763 119 38.5C119 17.237 136.237 0 157.5 0Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/utils.ts\",\n template: `import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}`,\n};\n","export default {\n filename: \"packages/ui/src/globals.css\",\n template: `@import 'tailwindcss';\n@source \"../../../apps/**/*.{ts,tsx}\";\n@source \"../**/*.{ts,tsx}\";\n\n:root {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --border: oklch(0.469 0 0);\n}\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-border: var(--border);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n}\n\n@layer base {\n html,\n body {\n height: 100%;\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n font-family: var(--font-geist-sans);\n -webkit-font-smoothing: antialiased;\n }\n * {\n border-color: var(--border);\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/postcss.config.mjs\",\n template: `const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"packages/ui/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/react-library.json\",\n \"compilerOptions\": {\n \"outDir\": \"dist\",\n \"strictNullChecks\": true\n },\n \"include\": [\"src\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport button from \"./templates/button\";\nimport link from \"./templates/link\";\nimport logo from \"./templates/logo\";\nimport utils from \"./templates/utils\";\nimport globalsCss from \"./templates/globals-css\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport tsconfig from \"./templates/tsconfig\";\n\nconst ui: Module = {\n templates: [packageJson, button, link, logo, utils, globalsCss, postcssConfig, tsconfig],\n};\n\nexport default ui;\n","// Single source of truth for every third-party dependency version a scaffolded\n// app gets. Templates read it as `<%= versions[\"pkg\"] %>`; module `packages`\n// entries read it directly. versions.test.ts fails if a package ever ends up\n// with two versions across the rendered output.\nexport const versions = {\n \"@babel/plugin-proposal-decorators\": \"^8.0.2\",\n \"@babel/plugin-transform-class-properties\": \"^8.0.1\",\n \"@base-ui/react\": \"^1.6.0\",\n \"@eslint/js\": \"^9.39.1\",\n \"@nestjs/cli\": \"^11.0.0\",\n \"@nestjs/common\": \"^11.0.1\",\n \"@nestjs/core\": \"^11.0.1\",\n \"@nestjs/platform-express\": \"^11.0.1\",\n \"@nestjs/schematics\": \"^11.0.0\",\n \"@nestjs/serve-static\": \"^5.0.0\",\n \"@nestjs/testing\": \"^11.0.1\",\n \"@next/eslint-plugin-next\": \"^16.3.4\",\n \"@oxlint/plugins\": \"^1.74.0\",\n \"@shadcn/lint\": \"^0.1.0\",\n \"@shadcn/react\": \"^0.2.1\",\n \"@stylexjs/babel-plugin\": \"0.19.0\",\n \"@stylexjs/postcss-plugin\": \"0.19.0\",\n \"@stylexjs/stylex\": \"0.19.0\",\n \"@swc/core\": \"^1.10.0\",\n \"@tailwindcss/postcss\": \"^4.2.1\",\n \"@tanstack/react-form\": \"^1.28.5\",\n \"@tanstack/react-query\": \"^5.90.21\",\n \"@thallesp/nestjs-better-auth\": \"^2.5.1\",\n \"@types/better-sqlite3\": \"^7.6.13\",\n \"@types/express\": \"^5.0.0\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^24.13.3\",\n \"@types/pg\": \"^8.11.13\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/supertest\": \"^6.0.2\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n auth: \"^1.5.5\",\n \"babel-plugin-transform-typescript-metadata\": \"^0.4.0\",\n \"better-auth\": \"^1.2.8\",\n \"better-sqlite3\": \"^12.11.1\",\n \"class-variance-authority\": \"^0.7.1\",\n clsx: \"^2.1.1\",\n cmdk: \"^1.1.1\",\n cn: \"^0.3.0\",\n \"date-fns\": \"^4.2.1\",\n dotenv: \"^17.3.1\",\n \"dotenv-cli\": \"^11.0.0\",\n \"embla-carousel-react\": \"^8.6.0\",\n eslint: \"^9.39.1\",\n \"eslint-config-prettier\": \"^10.1.1\",\n \"eslint-plugin-only-warn\": \"^1.1.0\",\n \"eslint-plugin-react\": \"^7.37.5\",\n \"eslint-plugin-react-hooks\": \"^5.2.0\",\n \"eslint-plugin-turbo\": \"^2.7.1\",\n globals: \"^16.5.0\",\n \"input-otp\": \"^1.4.2\",\n jest: \"^30.0.0\",\n kysely: \"^0.28.2\",\n \"lucide-react\": \"^1.16.0\",\n next: \"16.3.4\",\n \"next-themes\": \"^0.4.6\",\n oxfmt: \"^0.59.0\",\n oxlint: \"^1.80.0\",\n pg: \"^8.14.1\",\n prettier: \"^3.7.4\",\n react: \"^19.2.4\",\n \"react-day-picker\": \"^10.0.1\",\n \"react-dom\": \"^19.2.4\",\n \"react-resizable-panels\": \"^4.11.1\",\n recharts: \"^3.8.0\",\n \"reflect-metadata\": \"^0.2.2\",\n rxjs: \"^7.8.1\",\n shadcn: \"^4.7.0\",\n sonner: \"^2.0.7\",\n supertest: \"^7.0.0\",\n \"tailwind-merge\": \"^3.6.0\",\n tailwindcss: \"^4.2.1\",\n \"ts-jest\": \"^29.2.5\",\n tsx: \"^4.19.4\",\n turbo: \"^2.8.16\",\n \"tw-animate-css\": \"^1.4.0\",\n typescript: \"6.0.2\",\n \"typescript-eslint\": \"^8.50.0\",\n \"unplugin-swc\": \"^1.5.9\",\n vitest: \"^4.1.10\",\n} as const;\n\nexport type Versions = typeof versions;\n","export default {\n filename: \"packages/ui/components.json\",\n template: `{\n \"$schema\": \"https://ui.shadcn.com/schema.json\",\n \"style\": \"base-nova\",\n \"rsc\": true,\n \"tsx\": true,\n \"tailwind\": {\n \"config\": \"\",\n \"css\": \"src/styles/globals.css\",\n \"baseColor\": \"neutral\",\n \"cssVariables\": true\n },\n \"iconLibrary\": \"lucide\",\n \"aliases\": {\n \"components\": \"@<%= projectName %>/ui/components\",\n \"utils\": \"@<%= projectName %>/ui/lib/utils\",\n \"hooks\": \"@<%= projectName %>/ui/hooks\",\n \"lib\": \"@<%= projectName %>/ui/lib\",\n \"ui\": \"@<%= projectName %>/ui/components\"\n },\n \"rtl\": false,\n \"menuColor\": \"default\",\n \"menuAccent\": \"subtle\"\n}`,\n};\n","export default {\n filename: \"apps/web/components.json\",\n template: `{\n \"$schema\": \"https://ui.shadcn.com/schema.json\",\n \"style\": \"base-nova\",\n \"rsc\": true,\n \"tsx\": true,\n \"tailwind\": {\n \"config\": \"\",\n \"css\": \"../../packages/ui/src/styles/globals.css\",\n \"baseColor\": \"neutral\",\n \"cssVariables\": true\n },\n \"iconLibrary\": \"lucide\",\n \"aliases\": {\n \"components\": \"@/components\",\n \"hooks\": \"@/hooks\",\n \"lib\": \"@/lib\",\n \"utils\": \"@<%= projectName %>/ui/lib/utils\",\n \"ui\": \"@<%= projectName %>/ui/components\"\n },\n \"rtl\": false,\n \"menuColor\": \"default\",\n \"menuAccent\": \"subtle\"\n}`,\n};\n","export default {\n filename: \"packages/ui/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/ui\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"exports\": {\n \"./globals.css\": \"./src/styles/globals.css\",\n \"./postcss.config\": \"./postcss.config.mjs\",\n \"./lib/*\": \"./src/lib/*.ts\",\n \"./components/*\": \"./src/components/*.tsx\",\n \"./hooks/*\": \"./src/hooks/*.ts\",\n \"./*\": \"./src/components/*.tsx\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@base-ui/react\": \"<%= versions[\"@base-ui/react\"] %>\",\n \"@shadcn/react\": \"<%= versions[\"@shadcn/react\"] %>\",\n \"shadcn\": \"<%= versions.shadcn %>\",\n \"class-variance-authority\": \"<%= versions[\"class-variance-authority\"] %>\",\n \"cmdk\": \"<%= versions.cmdk %>\",\n \"cn\": \"<%= versions.cn %>\",\n \"date-fns\": \"<%= versions[\"date-fns\"] %>\",\n \"embla-carousel-react\": \"<%= versions[\"embla-carousel-react\"] %>\",\n \"input-otp\": \"<%= versions[\"input-otp\"] %>\",\n \"lucide-react\": \"<%= versions[\"lucide-react\"] %>\",\n \"next-themes\": \"<%= versions[\"next-themes\"] %>\",\n \"react-day-picker\": \"<%= versions[\"react-day-picker\"] %>\",\n \"react-resizable-panels\": \"<%= versions[\"react-resizable-panels\"] %>\",\n \"recharts\": \"<%= versions.recharts %>\",\n \"sonner\": \"<%= versions.sonner %>\",\n \"tw-animate-css\": \"<%= versions[\"tw-animate-css\"] %>\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.0.0\",\n \"react\": \">=19.0.0\",\n \"react-dom\": \">=19.0.0\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/src/lib/utils.ts\",\n template: `export { cn } from \"cn\"\n`,\n};\n","export default {\n filename: \"packages/ui/src/hooks/use-mobile.ts\",\n template: `import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(\\`(max-width: \\${MOBILE_BREAKPOINT - 1}px)\\`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/styles/globals.css\",\n template: `@import \"tailwindcss\";\n@source \"../../../../apps/**/*.{ts,tsx}\";\n@source \"../../../../components/**/*.{ts,tsx}\";\n@source \"../**/*.{ts,tsx}\";\n\n@import \"tw-animate-css\";\n@import \"shadcn/tailwind.css\";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\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-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 --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --radius-sm: calc(var(--radius) * 0.6);\n --radius-md: calc(var(--radius) * 0.8);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) * 1.4);\n --radius-2xl: calc(var(--radius) * 1.8);\n --radius-3xl: calc(var(--radius) * 2.2);\n --radius-4xl: calc(var(--radius) * 2.6);\n}\n\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.87 0 0);\n --chart-2: oklch(0.556 0 0);\n --chart-3: oklch(0.439 0 0);\n --chart-4: oklch(0.371 0 0);\n --chart-5: oklch(0.269 0 0);\n --radius: 0.625rem;\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.87 0 0);\n --chart-2: oklch(0.556 0 0);\n --chart-3: oklch(0.439 0 0);\n --chart-4: oklch(0.371 0 0);\n --chart-5: oklch(0.269 0 0);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(1 0 0 / 10%);\n --sidebar-ring: oklch(0.556 0 0);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground font-sans;\n }\n}\n\n::-webkit-scrollbar {\n width: 8px;\n}\n\n::-webkit-scrollbar-track {\n @apply bg-muted;\n}\n\n::-webkit-scrollbar-thumb {\n @apply bg-border rounded-full;\n}\n\n::-webkit-scrollbar-thumb:hover {\n @apply bg-muted-foreground/50;\n}\n`,\n};\n","export default {\n filename: \"packages/ui/postcss.config.mjs\",\n template: `const config = {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"packages/ui/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/react-library.json\",\n \"compilerOptions\": {\n \"outDir\": \"dist\",\n \"strictNullChecks\": true,\n \"paths\": {\n \"@<%= projectName %>/ui/*\": [\"./src/*\"]\n }\n },\n \"include\": [\"src\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","export default {\n filename: \"packages/ui/src/components/link.tsx\",\n template: `import NextLink, { type LinkProps } from \"next/link\";\nimport { type PropsWithChildren } from \"react\";\nimport { cn } from \"@<%= projectName %>/ui/lib/utils\";\n\nexport function Link({\n href,\n children,\n className,\n ...rest\n}: PropsWithChildren<LinkProps & { className?: string }>) {\n return (\n <NextLink\n href={href}\n {...rest}\n className={cn(\n \"underline decoration-muted-foreground hover:decoration-foreground transition-colors\",\n className\n )}\n >\n {children}\n </NextLink>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/components/logo.tsx\",\n template: `import { cn } from \"@<%= projectName %>/ui/lib/utils\";\n\ninterface LogoProps {\n className?: string;\n}\n\nexport function Logo({ className }: LogoProps) {\n return (\n <svg\n width=\"196\"\n height=\"138\"\n viewBox=\"0 0 196 138\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"text-foreground\", className)}\n >\n <path\n d=\"M98 35C102.665 35 107.243 35.2232 111.707 35.6514C111.243 38.1972 111 40.8202 111 43.5C111 67.5244 130.476 87 154.5 87C165.156 87 174.914 83.1658 182.478 76.8057C183.476 79.9455 184 83.186 184 86.5C184 114.943 145.496 138 98 138C50.5035 138 12 114.943 12 86.5C12 83.1861 12.5228 79.9454 13.5215 76.8057C21.0851 83.1661 30.8441 87 41.5 87C65.5244 87 85 67.5244 85 43.5C85 40.8202 84.7559 38.1973 84.292 35.6514C88.7559 35.2232 93.3345 35 98 35ZM38.5 0C59.763 0 77 17.237 77 38.5C77 59.763 59.763 77 38.5 77C17.237 77 0 59.763 0 38.5C0 17.237 17.237 0 38.5 0ZM157.5 0C178.763 0 196 17.237 196 38.5C196 59.763 178.763 77 157.5 77C136.237 77 119 59.763 119 38.5C119 17.237 136.237 0 157.5 0Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/layout.tsx\",\n template: `import type { Metadata } from \"next\";\nimport localFont from \"next/font/local\";\nimport Providers from \"@/app/providers\";\nimport { Toaster } from \"@<%= projectName %>/ui/sonner\";\nimport \"@<%= projectName %>/ui/globals.css\";\n\nconst geistSans = localFont({\n src: \"./fonts/GeistVF.woff\",\n variable: \"--font-geist-sans\",\n});\nconst geistMono = localFont({\n src: \"./fonts/GeistMonoVF.woff\",\n variable: \"--font-geist-mono\",\n});\n\nexport const metadata: Metadata = {\n title: \"<%= projectName %>\",\n description: \"Next + Nest = Newt\",\n icons: {\n icon: [\n { url: \"/icon0.svg\", type: \"image/svg+xml\" },\n { url: \"/icon1.png\", type: \"image/png\" },\n ],\n apple: \"/apple-icon.png\",\n },\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body className={\\`\\${geistSans.variable} \\${geistMono.variable} h-full\\`}>\n <Providers>\n {children}\n <Toaster />\n </Providers>\n </body>\n </html>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { ModeToggle } from '@<%= projectName %>/ui/mode-toggle';\nimport { Card, CardContent, CardHeader } from '@<%= projectName %>/ui/card';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello', session?.user.id],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b flex items-start justify-between\">\n <div>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n <ModeToggle />\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <Card>\n <CardHeader>\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n next.js\n </p>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n nest.js\n </p>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 rounded-md border p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n better-auth\n </p>\n </CardHeader>\n <CardContent>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <div className=\"space-y-3\">\n <p className=\"text-sm\">Signed in as {session.user.name}</p>\n <Button variant=\"outline\" onClick={() => authClient.signOut()}>\n Sign out\n </Button>\n </div>\n ) : (\n <AuthForm />\n )}\n </CardContent>\n </Card>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/providers.tsx\",\n template: `'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { ThemeProvider } from 'next-themes';\nimport { useState } from 'react';\n\nexport default function Providers({ children }: { children: React.ReactNode }) {\n const [client] = useState(() => new QueryClient());\n return (\n <QueryClientProvider client={client}>\n <ThemeProvider attribute=\"class\" defaultTheme=\"dark\" disableTransitionOnChange>\n {children}\n </ThemeProvider>\n </QueryClientProvider>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/auth-form.tsx\",\n template: `'use client';\n\nimport { useForm } from '@tanstack/react-form';\nimport { useState } from 'react';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Input } from '@<%= projectName %>/ui/input';\nimport { Label } from '@<%= projectName %>/ui/label';\n\nexport function AuthForm() {\n const [tab, setTab] = useState<'signin' | 'signup'>('signup');\n const [error, setError] = useState('');\n\n const form = useForm({\n defaultValues: { name: '', email: '', password: '' },\n onSubmit: async ({ value }) => {\n setError('');\n if (tab === 'signin') {\n const { error } = await authClient.signIn.email(value);\n if (error) setError(error.message ?? 'Sign in failed');\n } else {\n const { error } = await authClient.signUp.email(value);\n if (error) setError(error.message ?? 'Sign up failed');\n }\n },\n });\n\n return (\n <>\n <div className=\"flex gap-1 mb-6\">\n <Button\n type=\"button\"\n variant={tab === 'signup' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setTab('signup')}\n >\n Sign up\n </Button>\n <Button\n type=\"button\"\n variant={tab === 'signin' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setTab('signin')}\n >\n Sign in\n </Button>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"space-y-4\"\n >\n {tab === 'signup' && (\n <form.Field name=\"name\">\n {(field) => (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"name\">Name</Label>\n <Input\n id=\"name\"\n type=\"text\"\n autoComplete=\"name\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n />\n </div>\n )}\n </form.Field>\n )}\n\n <form.Field name=\"email\">\n {(field) => (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n />\n </div>\n )}\n </form.Field>\n\n <form.Field name=\"password\">\n {(field) => (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"password\">Password</Label>\n <Input\n id=\"password\"\n type=\"password\"\n autoComplete={\n tab === 'signin' ? 'current-password' : 'new-password'\n }\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n minLength={8}\n />\n </div>\n )}\n </form.Field>\n\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting} className=\"w-full\">\n {isSubmitting\n ? 'Loading…'\n : tab === 'signin'\n ? 'Sign in'\n : 'Create account'}\n </Button>\n )}\n </form.Subscribe>\n </form>\n </>\n );\n}`,\n};\n","export default {\n filename: \"packages/ui/src/components/accordion.tsx\",\n template: `import { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\"\nimport { cn } from \"cn\"\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nfunction Accordion({ className, ...props }: AccordionPrimitive.Root.Props) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"not-last:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: AccordionPrimitive.Trigger.Props) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden\" />\n <ChevronUpIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: AccordionPrimitive.Panel.Props) {\n return (\n <AccordionPrimitive.Panel\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up\"\n {...props}\n >\n <div\n className={cn(\n \"h-(--accordion-panel-height) pt-0 pb-2.5 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Panel>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/alert-dialog.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { AlertDialog as AlertDialogPrimitive } from \"@base-ui/react/alert-dialog\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\n\nfunction AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.Props) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: AlertDialogPrimitive.Backdrop.Props) {\n return (\n <AlertDialogPrimitive.Backdrop\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n size = \"default\",\n ...props\n}: AlertDialogPrimitive.Popup.Props & {\n size?: \"default\" | \"sm\"\n}) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Popup\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n \"group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n \"grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogMedia({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-media\"\n className={cn(\n \"mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n \"text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof Button>) {\n return (\n <Button\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n size = \"default\",\n ...props\n}: AlertDialogPrimitive.Close.Props &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <AlertDialogPrimitive.Close\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n render={<Button variant={variant} size={size} />}\n {...props}\n />\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/alert.tsx\",\n template: `import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nconst alertVariants = cva(\n \"group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"absolute top-2 right-2\", className)}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/aspect-ratio.tsx\",\n template: `import { cn } from \"cn\"\n\nfunction AspectRatio({\n ratio,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & { ratio: number }) {\n return (\n <div\n data-slot=\"aspect-ratio\"\n style={\n {\n \"--ratio\": ratio,\n } as React.CSSProperties\n }\n className={cn(\"relative aspect-(--ratio)\", className)}\n {...props}\n />\n )\n}\n\nexport { AspectRatio }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/avatar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\"\nimport { cn } from \"cn\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: AvatarPrimitive.Root.Props & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/badge.tsx\",\n template: `import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(badgeVariants({ variant }), className),\n },\n props\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/breadcrumb.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cn } from \"cn\"\nimport { ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"a\">) {\n return useRender({\n defaultTagName: \"a\",\n props: mergeProps<\"a\">(\n {\n className: cn(\"transition-colors hover:text-foreground\", className),\n },\n props\n ),\n render,\n state: {\n slot: \"breadcrumb-link\",\n },\n })\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <ChevronRightIcon />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"flex size-5 items-center justify-center [&>svg]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon\n />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/button.tsx\",\n template: `import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/calendar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n type Locale,\n} from \"react-day-picker\"\n\nimport { Button, buttonVariants } from \"@<%= projectName %>/ui/components/button\"\nimport { ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon } from \"lucide-react\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n locale,\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"group/calendar bg-background p-2 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(7)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent\",\n String.raw\\`rtl:**:[.rdp-button\\\\_next>svg]:rotate-180\\`,\n String.raw\\`rtl:**:[.rdp-button\\\\_previous>svg]:rotate-180\\`,\n className\n )}\n captionLayout={captionLayout}\n locale={locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(locale?.code, { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative rounded-(--cell-radius)\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute inset-0 bg-popover opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"font-medium select-none\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n defaultClassNames.caption_label\n ),\n month_grid: cn(\"w-full border-collapse\", defaultClassNames.month_grid),\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-(--cell-size) select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] text-muted-foreground select-none\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\n \"relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted\",\n defaultClassNames.range_end\n ),\n today: cn(\n \"rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: ({ ...props }) => (\n <CalendarDayButton locale={locale} {...props} />\n ),\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n locale,\n ...props\n}: React.ComponentProps<typeof DayButton> & { locale?: Partial<Locale> }) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString(locale?.code)}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-foreground [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/card.tsx\",\n template: `import * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-(--card-spacing)\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-(--card-spacing)\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/carousel.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: \"horizontal\" | \"vertical\"\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api || !setApi) return\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) return\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api?.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div\n ref={carouselRef}\n className=\"overflow-hidden\"\n data-slot=\"carousel-content\"\n >\n <div\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel()\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute touch-manipulation rounded-full\",\n orientation === \"horizontal\"\n ? \"inset-y-0 -left-12 my-auto\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute touch-manipulation rounded-full\",\n orientation === \"horizontal\"\n ? \"inset-y-0 -right-12 my-auto\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ChevronRightIcon />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n useCarousel,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/chart.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport * as RechartsPrimitive from \"recharts\"\nimport type { TooltipValueType } from \"recharts\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const\ntype TooltipNameType = number | string\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\")\n }\n\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n initialDimension?: {\n width: number\n height: number\n }\n}) {\n const uniqueId = React.useId()\n const chartId = \\`chart-\\${id ?? uniqueId.replace(/:/g, \"\")}\\`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer\n initialDimension={initialDimension}\n >\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme ?? config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => \\`\n\\${prefix} [data-chart=\\${id}] {\n\\${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ??\n itemConfig.color\n return color ? \\` --color-\\${key}: \\${color};\\` : null\n })\n .join(\"\\\\n\")}\n}\n\\`\n )\n .join(\"\\\\n\"),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: \"line\" | \"dot\" | \"dashed\"\n nameKey?: string\n labelKey?: string\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<\n TooltipValueType,\n TooltipNameType\n >,\n \"accessibilityLayer\"\n >) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = \\`\\${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}\\`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === \"string\"\n ? (config[label]?.label ?? label)\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = \\`\\${nameKey ?? item.name ?? item.dataKey ?? \"value\"}\\`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color ?? item.payload?.fill ?? item.color\n\n return (\n <div\n key={index}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === \"number\"\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> & {\n hideIcon?: boolean\n nameKey?: string\n} & RechartsPrimitive.DefaultLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = \\`\\${nameKey ?? item.dataKey ?? \"value\"}\\`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/checkbox.tsx\",\n template: `\"use client\"\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\"\nimport { cn } from \"cn\"\nimport { CheckIcon } from \"lucide-react\"\n\nfunction Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none [&>svg]:size-3.5\"\n >\n <CheckIcon\n />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/collapsible.tsx\",\n template: `\"use client\"\n\nimport { Collapsible as CollapsiblePrimitive } from \"@base-ui/react/collapsible\"\n\nfunction Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {\n return (\n <CollapsiblePrimitive.Trigger data-slot=\"collapsible-trigger\" {...props} />\n )\n}\n\nfunction CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {\n return (\n <CollapsiblePrimitive.Panel data-slot=\"collapsible-content\" {...props} />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/command.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { cn } from \"cn\"\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@<%= projectName %>/ui/components/dialog\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"@<%= projectName %>/ui/components/input-group\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = false,\n ...props\n}: Omit<React.ComponentProps<typeof Dialog>, \"children\"> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n children: React.ReactNode\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\n \"top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0\",\n className\n )}\n showCloseButton={showCloseButton}\n >\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1 pb-0\">\n <InputGroup className=\"h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/combobox.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"@<%= projectName %>/ui/components/input-group\"\nimport { ChevronDownIcon, XIcon, CheckIcon } from \"lucide-react\"\n\nconst Combobox = ComboboxPrimitive.Root\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <XIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean\n showClear?: boolean\n}) {\n return (\n <InputGroup className={cn(\"w-auto\", className)}>\n <ComboboxPrimitive.Input\n render={<InputGroupInput disabled={disabled} />}\n {...props}\n />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n render={<ComboboxTrigger />}\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n />\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n return (\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\"group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <CheckIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxLabel({\n className,\n ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return (\n <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n )\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({\n className,\n ...props\n}: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\n className\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <XIcon className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({\n className,\n ...props\n}: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"min-w-16 flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxContent,\n ComboboxList,\n ComboboxItem,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/context-menu.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"@base-ui/react/context-menu\"\nimport { cn } from \"cn\"\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\"\n\nfunction ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n )\n}\n\nfunction ContextMenuTrigger({\n className,\n ...props\n}: ContextMenuPrimitive.Trigger.Props) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n className={cn(\"select-none\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n align = \"start\",\n alignOffset = 4,\n side = \"right\",\n sideOffset = 0,\n ...props\n}: ContextMenuPrimitive.Popup.Props &\n Pick<\n ContextMenuPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <ContextMenuPrimitive.Popup\n data-slot=\"context-menu-content\"\n className={cn(\"z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </ContextMenuPrimitive.Positioner>\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: ContextMenuPrimitive.GroupLabel.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.GroupLabel\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: ContextMenuPrimitive.Item.Props & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props) {\n return (\n <ContextMenuPrimitive.SubmenuRoot data-slot=\"context-menu-sub\" {...props} />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ContextMenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubmenuTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubmenuTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n ...props\n}: React.ComponentProps<typeof ContextMenuContent>) {\n return (\n <ContextMenuContent\n data-slot=\"context-menu-sub-content\"\n className=\"shadow-lg\"\n side=\"right\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: ContextMenuPrimitive.CheckboxItem.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.CheckboxItemIndicator>\n <CheckIcon\n />\n </ContextMenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: ContextMenuPrimitive.RadioGroup.Props) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: ContextMenuPrimitive.RadioItem.Props & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.RadioItemIndicator>\n <CheckIcon\n />\n </ContextMenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: ContextMenuPrimitive.Separator.Props) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/dialog.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Dialog({ ...props }: DialogPrimitive.Root.Props) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({ ...props }: DialogPrimitive.Close.Props) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: DialogPrimitive.Backdrop.Props) {\n return (\n <DialogPrimitive.Backdrop\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: DialogPrimitive.Popup.Props & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Popup\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n render={\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 right-2\"\n size=\"icon-sm\"\n />\n }\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close render={<Button variant=\"outline\" />}>\n Close\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/direction.tsx\",\n template: `\"use client\"\n\nexport {\n DirectionProvider,\n useDirection,\n} from \"@base-ui/react/direction-provider\"\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/drawer.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"@base-ui/react/drawer\"\nimport { cn } from \"cn\"\n\ntype DrawerContextProps = {\n hasSnapPoints: boolean\n modal: DrawerPrimitive.Root.Props[\"modal\"]\n showSwipeHandle: boolean\n swipeDirection: NonNullable<DrawerPrimitive.Root.Props[\"swipeDirection\"]>\n}\n\nconst DrawerContext = React.createContext<DrawerContextProps | null>(null)\n\nfunction useDrawer() {\n const context = React.useContext(DrawerContext)\n\n if (!context) {\n throw new Error(\"useDrawer must be used within a Drawer.\")\n }\n\n return context\n}\n\nfunction Drawer({\n modal = true,\n showSwipeHandle = false,\n snapPoints,\n swipeDirection = \"down\",\n ...props\n}: DrawerPrimitive.Root.Props & {\n showSwipeHandle?: boolean\n}) {\n const hasSnapPoints = snapPoints != null && snapPoints.length > 0\n const contextValue = React.useMemo(\n () => ({ hasSnapPoints, modal, showSwipeHandle, swipeDirection }),\n [hasSnapPoints, modal, showSwipeHandle, swipeDirection]\n )\n\n return (\n <DrawerContext.Provider value={contextValue}>\n <DrawerPrimitive.Root\n data-slot=\"drawer\"\n modal={modal}\n snapPoints={snapPoints}\n swipeDirection={swipeDirection}\n {...props}\n />\n </DrawerContext.Provider>\n )\n}\n\nfunction DrawerTrigger({ ...props }: DrawerPrimitive.Trigger.Props) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\n}\n\nfunction DrawerPortal({ ...props }: DrawerPrimitive.Portal.Props) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\n}\n\nfunction DrawerClose({ ...props }: DrawerPrimitive.Close.Props) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: DrawerPrimitive.Backdrop.Props) {\n return (\n <DrawerPrimitive.Backdrop\n data-slot=\"drawer-overlay\"\n className={cn(\n \"fixed inset-0 z-50 min-h-dvh bg-black/10 opacity-[max(var(--drawer-overlay-min-opacity,0),calc(1-var(--drawer-swipe-progress)))] transition-opacity duration-450 ease-[cubic-bezier(0.32,0.72,0,1)] select-none data-ending-style:pointer-events-none data-ending-style:opacity-0 data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-snap-points:[--drawer-overlay-min-opacity:0.5] data-starting-style:opacity-0 data-swiping:duration-0 supports-backdrop-filter:backdrop-blur-xs supports-[-webkit-touch-callout:none]:absolute\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerSwipeHandle({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-swipe-handle\"\n aria-hidden=\"true\"\n className={cn(\n \"relative z-10 flex shrink-0 cursor-grab transition-opacity duration-200 group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-[swipe-axis=x]/drawer-popup:h-full group-data-[swipe-axis=x]/drawer-popup:w-3 group-data-[swipe-axis=x]/drawer-popup:items-center group-data-[swipe-axis=y]/drawer-popup:h-3 group-data-[swipe-axis=y]/drawer-popup:w-full group-data-[swipe-axis=y]/drawer-popup:justify-center group-data-[swipe-direction=down]/drawer-popup:items-end group-data-[swipe-direction=left]/drawer-popup:order-last group-data-[swipe-direction=left]/drawer-popup:justify-start group-data-[swipe-direction=right]/drawer-popup:justify-end group-data-[swipe-direction=up]/drawer-popup:order-last group-data-[swipe-direction=up]/drawer-popup:items-start after:block after:shrink-0 after:rounded-full after:bg-muted group-data-[swipe-axis=x]/drawer-popup:after:h-24 group-data-[swipe-axis=x]/drawer-popup:after:w-1 group-data-[swipe-axis=y]/drawer-popup:after:h-1 group-data-[swipe-axis=y]/drawer-popup:after:w-24 active:cursor-grabbing\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: DrawerPrimitive.Popup.Props) {\n const { hasSnapPoints, modal, showSwipeHandle, swipeDirection } = useDrawer()\n const swipeAxis =\n swipeDirection === \"down\" || swipeDirection === \"up\" ? \"y\" : \"x\"\n\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n {modal === true && (\n <DrawerOverlay data-snap-points={hasSnapPoints ? \"\" : undefined} />\n )}\n <DrawerPrimitive.Viewport\n data-slot=\"drawer-viewport\"\n data-modal={modal}\n className=\"pointer-events-none fixed inset-0 z-50 select-none data-[modal=true]:pointer-events-auto\"\n >\n <DrawerPrimitive.Popup\n data-slot=\"drawer-popup\"\n data-swipe-axis={swipeAxis}\n data-snap-points={hasSnapPoints ? \"\" : undefined}\n className={cn(\n // Base.\n \"group/drawer-popup pointer-events-auto fixed z-50 m-(--drawer-inset,0px) flex h-(--drawer-content-height) max-h-(--drawer-content-max-height,none) min-h-0 w-(--drawer-content-width,auto) transform-[translate3d(var(--translate-x,0px),var(--translate-y,0px),0)_scale(var(--stack-scale))] flex-col bg-popover text-sm text-popover-foreground transition-[transform,height,opacity,filter] duration-450 ease-[cubic-bezier(0.22,1,0.36,1)] will-change-transform outline-none select-none [interpolate-size:allow-keywords] data-[swipe-direction=down]:rounded-t-xl data-[swipe-direction=down]:border-t data-[swipe-direction=left]:rounded-r-xl data-[swipe-direction=left]:border-r data-[swipe-direction=right]:rounded-l-xl data-[swipe-direction=right]:border-l data-[swipe-direction=up]:rounded-b-xl data-[swipe-direction=up]:border-b\",\n // Nested.\n \"data-nested-drawer-open:overflow-hidden data-nested-drawer-open:brightness-95\",\n // Bleed.\n \"after:pointer-events-none after:absolute after:bg-(--drawer-bleed-background,var(--color-popover)) data-[swipe-axis=x]:after:inset-y-0 data-[swipe-axis=x]:after:w-(--bleed) data-[swipe-axis=y]:after:inset-x-0 data-[swipe-axis=y]:after:h-(--bleed) data-[swipe-direction=down]:after:top-full data-[swipe-direction=left]:after:right-full data-[swipe-direction=right]:after:left-full data-[swipe-direction=up]:after:bottom-full\",\n // Sizing.\n \"[--drawer-content-height:var(--drawer-height,auto)] data-[swipe-axis=x]:[--drawer-content-width:75%] data-[swipe-axis=y]:[--drawer-content-max-height:calc(100dvh-6rem)] data-[swipe-axis=y]:data-snap-points:[--drawer-content-height:100dvh] data-[swipe-axis=x]:sm:[--drawer-content-width:24rem]\",\n // Stack.\n \"[--bleed:3rem] [--peek:1rem] [--stack-height:var(--drawer-frontmost-height,var(--drawer-height,0px))] [--stack-peek-offset:max(0px,calc((var(--nested-drawers)-var(--stack-progress))*var(--peek)))] [--stack-progress:clamp(0,var(--drawer-swipe-progress),1)] [--stack-scale-base:max(0,calc(1-(var(--nested-drawers)*var(--stack-step))))] [--stack-scale:clamp(0,calc(var(--stack-scale-base)+(var(--stack-step)*var(--stack-progress))),1)] [--stack-shrink:calc(1-var(--stack-scale))] [--stack-step:0.05]\",\n // Transitions.\n \"data-ending-style:transform-(--closed-transform) data-ending-style:opacity-[0.9999] data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-nested-drawer-swiping:duration-0 data-ending-style:data-nested-drawer-swiping:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-starting-style:transform-(--closed-transform) data-swiping:duration-0 data-ending-style:data-swiping:duration-[calc(var(--drawer-swipe-strength)*400ms)]\",\n // Axis: y.\n \"data-[swipe-axis=y]:inset-x-0 data-[swipe-axis=y]:data-nested-drawer-open:h-(--stack-height)\",\n // Axis: x.\n \"data-[swipe-axis=x]:inset-y-0 data-[swipe-axis=x]:flex-row\",\n // Direction: down.\n \"data-[swipe-direction=down]:bottom-0 data-[swipe-direction=down]:origin-bottom data-[swipe-direction=down]:[--closed-transform:translate3d(0,calc(100%+var(--drawer-inset,0px)+2px),0)] data-[swipe-direction=down]:[--translate-y:calc(var(--drawer-snap-point-offset,0px)+var(--drawer-swipe-movement-y)-var(--stack-peek-offset)-(var(--stack-shrink)*var(--stack-height)))]\",\n // Direction: up.\n \"data-[swipe-direction=up]:top-0 data-[swipe-direction=up]:origin-top data-[swipe-direction=up]:[--closed-transform:translate3d(0,calc(-100%-var(--drawer-inset,0px)-2px),0)] data-[swipe-direction=up]:[--translate-y:calc(var(--drawer-snap-point-offset,0px)+var(--drawer-swipe-movement-y)+var(--stack-peek-offset)+(var(--stack-shrink)*var(--stack-height)))]\",\n // Direction: left.\n \"data-[swipe-direction=left]:left-0 data-[swipe-direction=left]:origin-left data-[swipe-direction=left]:[--closed-transform:translate3d(calc(-100%-var(--drawer-inset,0px)-2px),0,0)] data-[swipe-direction=left]:[--translate-x:calc(var(--drawer-swipe-movement-x)+var(--stack-peek-offset)+(var(--stack-shrink)*100%))]\",\n // Direction: right.\n \"data-[swipe-direction=right]:right-0 data-[swipe-direction=right]:origin-right data-[swipe-direction=right]:[--closed-transform:translate3d(calc(100%+var(--drawer-inset,0px)+2px),0,0)] data-[swipe-direction=right]:[--translate-x:calc(var(--drawer-swipe-movement-x)-var(--stack-peek-offset)-(var(--stack-shrink)*100%))]\",\n className\n )}\n {...props}\n >\n {showSwipeHandle && <DrawerSwipeHandle />}\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col overflow-hidden overscroll-contain rounded-[inherit] transition-opacity duration-300 ease-[cubic-bezier(0.45,1.005,0,1.005)] select-text group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-swiping/drawer-popup:select-none\"\n )}\n >\n {children}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Popup>\n </DrawerPrimitive.Viewport>\n </DrawerPortal>\n )\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n \"flex shrink-0 flex-col gap-0.5 p-4 pb-0 group-data-[swipe-axis=y]/drawer-popup:text-center md:gap-0.5 md:text-left\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex shrink-0 flex-col gap-2 p-4 pt-0\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerTitle({ className, ...props }: DrawerPrimitive.Title.Props) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: DrawerPrimitive.Description.Props) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-sm text-balance text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerSwipeHandle,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/dropdown-menu.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\"\nimport { cn } from \"cn\"\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\"\n\nfunction DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {\n return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n}\n\nfunction DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />\n}\n\nfunction DropdownMenuContent({\n align = \"start\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n className,\n ...props\n}: MenuPrimitive.Popup.Props &\n Pick<\n MenuPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-content\"\n className={cn(\"z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.GroupLabel\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <MenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.SubmenuTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-popup-open:bg-accent data-popup-open:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </MenuPrimitive.SubmenuTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n align = \"start\",\n alignOffset = -3,\n side = \"right\",\n sideOffset = 0,\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n return (\n <DropdownMenuContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\"w-auto min-w-[96px] rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <MenuPrimitive.CheckboxItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {\n return (\n <MenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: MenuPrimitive.RadioItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/empty.tsx\",\n template: `import { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty\"\n className={cn(\n \"flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-header\"\n className={cn(\"flex max-w-sm flex-col items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nconst emptyMediaVariants = cva(\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction EmptyMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n return (\n <div\n data-slot=\"empty-icon\"\n data-variant={variant}\n className={cn(emptyMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-title\"\n className={cn(\n \"text-sm font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn(\n \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-content\"\n className={cn(\n \"flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Empty,\n EmptyHeader,\n EmptyTitle,\n EmptyDescription,\n EmptyContent,\n EmptyMedia,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/field.tsx\",\n template: `\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Label } from \"@<%= projectName %>/ui/components/label\"\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-2 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col *:w-full [&>.sr-only]:w-auto\",\n horizontal:\n \"flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n responsive:\n \"flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-0.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border has-[>[data-slot=field]]:not-has-[:disabled,[data-disabled]]:hover:bg-muted/50 has-[>[data-slot=field]]:has-[:focus-visible]:border-ring has-[>[data-slot=field]]:has-[:focus-visible]:ring-3 has-[>[data-slot=field]]:has-[:focus-visible]:ring-ring/50 *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5\",\n \"last:mt-0 nth-last-2:-mt-1\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/hover-card.tsx\",\n template: `\"use client\"\n\nimport { PreviewCard as PreviewCardPrimitive } from \"@base-ui/react/preview-card\"\nimport { cn } from \"cn\"\n\nfunction HoverCard({ ...props }: PreviewCardPrimitive.Root.Props) {\n return <PreviewCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({ ...props }: PreviewCardPrimitive.Trigger.Props) {\n return (\n <PreviewCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 4,\n ...props\n}: PreviewCardPrimitive.Popup.Props &\n Pick<\n PreviewCardPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <PreviewCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <PreviewCardPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <PreviewCardPrimitive.Popup\n data-slot=\"hover-card-content\"\n className={cn(\n \"z-50 w-64 origin-(--transform-origin) rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PreviewCardPrimitive.Positioner>\n </PreviewCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/button-group.tsx\",\n template: `import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"*:data-slot:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-lg! [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0\",\n vertical:\n \"flex-col *:data-slot:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-lg! [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"button-group-text\",\n },\n })\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"relative self-stretch bg-input data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/input-group.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { Input } from \"@<%= projectName %>/ui/components/input\"\nimport { Textarea } from \"@<%= projectName %>/ui/components/textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\"\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/item.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-2\", className)}\n {...props}\n />\n )\n}\n\nconst itemVariants = cva(\n \"group/item flex w-full flex-wrap items-center rounded-lg border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"border-transparent bg-muted/50\",\n },\n size: {\n default: \"gap-2.5 px-3 py-2.5\",\n sm: \"gap-2.5 px-3 py-2.5\",\n xs: \"gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & VariantProps<typeof itemVariants>) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(itemVariants({ variant, size, className })),\n },\n props\n ),\n render,\n state: {\n slot: \"item\",\n variant,\n size,\n },\n })\n}\n\nconst itemMediaVariants = cva(\n \"flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-actions\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\n \"flex basis-full items-center justify-between gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/kbd.tsx\",\n template: `import { cn } from \"cn\"\n\nfunction Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n \"pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <kbd\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/native-select.tsx\",\n template: `import * as React from \"react\"\nimport { cn } from \"cn\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\ntype NativeSelectProps = Omit<React.ComponentProps<\"select\">, \"size\"> & {\n size?: \"sm\" | \"default\"\n}\n\nfunction NativeSelect({\n className,\n size = \"default\",\n ...props\n}: NativeSelectProps) {\n return (\n <div\n className={cn(\n \"group/native-select relative w-fit has-[select:disabled]:opacity-50\",\n className\n )}\n data-slot=\"native-select-wrapper\"\n data-size={size}\n >\n <select\n data-slot=\"native-select\"\n data-size={size}\n className=\"h-8 w-full min-w-0 appearance-none rounded-lg border border-input bg-transparent py-1 pr-8 pl-2.5 text-sm transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-[size=sm]:py-0.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\"\n {...props}\n />\n <ChevronDownIcon className=\"pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none\" aria-hidden=\"true\" data-slot=\"native-select-icon\" />\n </div>\n )\n}\n\nfunction NativeSelectOption({\n className,\n ...props\n}: React.ComponentProps<\"option\">) {\n return (\n <option\n data-slot=\"native-select-option\"\n className={cn(\"bg-[Canvas] text-[CanvasText]\", className)}\n {...props}\n />\n )\n}\n\nfunction NativeSelectOptGroup({\n className,\n ...props\n}: React.ComponentProps<\"optgroup\">) {\n return (\n <optgroup\n data-slot=\"native-select-optgroup\"\n className={cn(\"bg-[Canvas] text-[CanvasText]\", className)}\n {...props}\n />\n )\n}\n\nexport { NativeSelect, NativeSelectOptGroup, NativeSelectOption }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/spinner.tsx\",\n template: `import { cn } from \"cn\"\nimport { Loader2Icon } from \"lucide-react\"\n\nfunction Spinner({ className, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon data-slot=\"spinner\" role=\"status\" aria-label=\"Loading\" className={cn(\"size-4 animate-spin\", className)} {...props} />\n )\n}\n\nexport { Spinner }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/input-otp.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"cn-input-otp flex items-center has-disabled:opacity-50\",\n containerClassName\n )}\n spellCheck={false}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\n \"flex items-center rounded-lg has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"relative flex size-8 items-center justify-center border-y border-r border-input text-sm transition-all outline-none first:rounded-l-lg first:border-l last:rounded-r-lg aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-3 data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-separator\"\n className=\"flex items-center [&_svg:not([class*='size-'])]:size-4\"\n role=\"separator\"\n {...props}\n >\n <MinusIcon\n />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/input.tsx\",\n template: `import * as React from \"react\"\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\nimport { cn } from \"cn\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/label.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Label({ className, ...props }: React.ComponentProps<\"label\">) {\n return (\n <label\n data-slot=\"label\"\n className={cn(\n \"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\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/menubar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\"\nimport { Menubar as MenubarPrimitive } from \"@base-ui/react/menubar\"\nimport { cn } from \"cn\"\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"@<%= projectName %>/ui/components/dropdown-menu\"\nimport { CheckIcon } from \"lucide-react\"\n\nfunction Menubar({ className, ...props }: MenubarPrimitive.Props) {\n return (\n <MenubarPrimitive\n data-slot=\"menubar\"\n className={cn(\n \"flex h-8 items-center gap-0.5 rounded-lg border p-[3px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarMenu({ ...props }: React.ComponentProps<typeof DropdownMenu>) {\n return <DropdownMenu data-slot=\"menubar-menu\" {...props} />\n}\n\nfunction MenubarGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuGroup>) {\n return <DropdownMenuGroup data-slot=\"menubar-group\" {...props} />\n}\n\nfunction MenubarPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPortal>) {\n return <DropdownMenuPortal data-slot=\"menubar-portal\" {...props} />\n}\n\nfunction MenubarTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuTrigger>) {\n return (\n <DropdownMenuTrigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n return (\n <DropdownMenuContent\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\"min-w-36 rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95\", className )}\n {...props}\n />\n )\n}\n\nfunction MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuItem>) {\n return (\n <DropdownMenuItem\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/menubar-item gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4\">\n <MenuPrimitive.CheckboxItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n )\n}\n\nfunction MenubarRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuRadioGroup>) {\n return <DropdownMenuRadioGroup data-slot=\"menubar-radio-group\" {...props} />\n}\n\nfunction MenubarRadioItem({\n className,\n children,\n inset,\n ...props\n}: MenuPrimitive.RadioItem.Props & {\n inset?: boolean\n}) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-1.5 flex size-4 items-center justify-center [&_svg:not([class*='size-'])]:size-4\">\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon\n />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n )\n}\n\nfunction MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuLabel> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuLabel\n data-slot=\"menubar-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-sm font-medium data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuSeparator>) {\n return (\n <DropdownMenuSeparator\n data-slot=\"menubar-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction MenubarShortcut({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuShortcut>) {\n return (\n <DropdownMenuShortcut\n data-slot=\"menubar-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuSub>) {\n return <DropdownMenuSub data-slot=\"menubar-sub\" {...props} />\n}\n\nfunction MenubarSubTrigger({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuSubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuSubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuSubContent>) {\n return (\n <DropdownMenuSubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\"min-w-32 rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n />\n )\n}\n\nexport {\n Menubar,\n MenubarPortal,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarSeparator,\n MenubarLabel,\n MenubarItem,\n MenubarShortcut,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/navigation-menu.tsx\",\n template: `import { NavigationMenu as NavigationMenuPrimitive } from \"@base-ui/react/navigation-menu\"\nimport { cva } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nfunction NavigationMenu({\n align = \"start\",\n className,\n children,\n ...props\n}: NavigationMenuPrimitive.Root.Props &\n Pick<NavigationMenuPrimitive.Positioner.Props, \"align\">) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n {...props}\n >\n {children}\n <NavigationMenuPositioner align={align} />\n </NavigationMenuPrimitive.Root>\n )\n}\n\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\n \"group flex flex-1 list-none items-center justify-center gap-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n )\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted\"\n)\n\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: NavigationMenuPrimitive.Trigger.Props) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDownIcon className=\"relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180\" aria-hidden=\"true\" />\n </NavigationMenuPrimitive.Trigger>\n )\n}\n\nfunction NavigationMenuContent({\n className,\n ...props\n}: NavigationMenuPrimitive.Content.Props) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"data-ending-style:data-activation-direction=left:translate-x-[50%] data-ending-style:data-activation-direction=right:translate-x-[-50%] data-starting-style:data-activation-direction=left:translate-x-[-50%] data-starting-style:data-activation-direction=right:translate-x-[50%] h-full w-auto p-1 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:opacity-0 data-starting-style:opacity-0 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuPositioner({\n className,\n side = \"bottom\",\n sideOffset = 8,\n align = \"start\",\n alignOffset = 0,\n ...props\n}: NavigationMenuPrimitive.Positioner.Props) {\n return (\n <NavigationMenuPrimitive.Portal>\n <NavigationMenuPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n className={cn(\n \"isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-instant:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0\",\n className\n )}\n {...props}\n >\n <NavigationMenuPrimitive.Popup className=\"data-[ending-style]:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0\">\n <NavigationMenuPrimitive.Viewport className=\"relative size-full overflow-hidden\" />\n </NavigationMenuPrimitive.Popup>\n </NavigationMenuPrimitive.Positioner>\n </NavigationMenuPrimitive.Portal>\n )\n}\n\nfunction NavigationMenuLink({\n className,\n ...props\n}: NavigationMenuPrimitive.Link.Props) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Icon>) {\n return (\n <NavigationMenuPrimitive.Icon\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in\",\n className\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Icon>\n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuIndicator,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n NavigationMenuPositioner,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/pagination.tsx\",\n template: `import * as React from \"react\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\"\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex items-center gap-0.5\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <Button\n variant={isActive ? \"outline\" : \"ghost\"}\n size={size}\n className={cn(className)}\n nativeButton={false}\n render={\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n {...props}\n />\n }\n />\n )\n}\n\nfunction PaginationPrevious({\n className,\n text = \"Previous\",\n ...props\n}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"pl-1.5!\", className)}\n {...props}\n >\n <ChevronLeftIcon data-icon=\"inline-start\" />\n <span className=\"hidden sm:block\">{text}</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({\n className,\n text = \"Next\",\n ...props\n}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"pr-1.5!\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">{text}</span>\n <ChevronRightIcon data-icon=\"inline-end\" />\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\n \"flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon\n />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/popover.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\"\nimport { cn } from \"cn\"\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n ...props\n}: PopoverPrimitive.Popup.Props &\n Pick<\n PopoverPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n \"z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-0.5 text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n data-slot=\"popover-title\"\n className={cn(\"font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Popover,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/progress.tsx\",\n template: `\"use client\"\n\nimport { Progress as ProgressPrimitive } from \"@base-ui/react/progress\"\nimport { cn } from \"cn\"\n\nfunction Progress({\n className,\n children,\n value,\n ...props\n}: ProgressPrimitive.Root.Props) {\n return (\n <ProgressPrimitive.Root\n value={value}\n data-slot=\"progress\"\n className={cn(\"flex flex-wrap gap-3\", className)}\n {...props}\n >\n {children}\n <ProgressTrack>\n <ProgressIndicator />\n </ProgressTrack>\n </ProgressPrimitive.Root>\n )\n}\n\nfunction ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props) {\n return (\n <ProgressPrimitive.Track\n className={cn(\n \"relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted\",\n className\n )}\n data-slot=\"progress-track\"\n {...props}\n />\n )\n}\n\nfunction ProgressIndicator({\n className,\n ...props\n}: ProgressPrimitive.Indicator.Props) {\n return (\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\"h-full bg-primary transition-all\", className)}\n {...props}\n />\n )\n}\n\nfunction ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props) {\n return (\n <ProgressPrimitive.Label\n className={cn(\"text-sm font-medium\", className)}\n data-slot=\"progress-label\"\n {...props}\n />\n )\n}\n\nfunction ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) {\n return (\n <ProgressPrimitive.Value\n className={cn(\n \"ml-auto text-sm text-muted-foreground tabular-nums\",\n className\n )}\n data-slot=\"progress-value\"\n {...props}\n />\n )\n}\n\nexport {\n Progress,\n ProgressTrack,\n ProgressIndicator,\n ProgressLabel,\n ProgressValue,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/radio-group.tsx\",\n template: `\"use client\"\n\nimport { Radio as RadioPrimitive } from \"@base-ui/react/radio\"\nimport { RadioGroup as RadioGroupPrimitive } from \"@base-ui/react/radio-group\"\nimport { cn } from \"cn\"\n\nfunction RadioGroup({ className, ...props }: RadioGroupPrimitive.Props) {\n return (\n <RadioGroupPrimitive\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({ className, ...props }: RadioPrimitive.Root.Props) {\n return (\n <RadioPrimitive.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary\",\n className\n )}\n {...props}\n >\n <RadioPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"flex size-4 items-center justify-center\"\n >\n <span className=\"absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground\" />\n </RadioPrimitive.Indicator>\n </RadioPrimitive.Root>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/resizable.tsx\",\n template: `\"use client\"\n\nimport { cn } from \"cn\"\nimport * as ResizablePrimitive from \"react-resizable-panels\"\n\nfunction ResizablePanelGroup({\n className,\n ...props\n}: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full aria-[orientation=vertical]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90\",\n className\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border\" />\n )}\n </ResizablePrimitive.Separator>\n )\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/scroll-area.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\"\nimport { cn } from \"cn\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: ScrollAreaPrimitive.Root.Props) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border\"\n />\n </ScrollAreaPrimitive.Scrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/select.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\"\nimport { cn } from \"cn\"\nimport { ChevronDownIcon, CheckIcon, ChevronUpIcon } from \"lucide-react\"\n\nconst Select = SelectPrimitive.Root\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\"flex flex-1 text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n render={\n <ChevronDownIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n }\n />\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props &\n Pick<\n SelectPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\" | \"alignItemWithTrigger\"\n >) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n data-align-trigger={alignItemWithTrigger}\n className={cn(\"relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.List>{children}</SelectPrimitive.List>\n <SelectScrollDownButton />\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText className=\"flex flex-1 shrink-0 gap-2 whitespace-nowrap\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <CheckIcon className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {\n return (\n <SelectPrimitive.ScrollUpArrow\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon\n />\n </SelectPrimitive.ScrollUpArrow>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {\n return (\n <SelectPrimitive.ScrollDownArrow\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon\n />\n </SelectPrimitive.ScrollDownArrow>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/separator.tsx\",\n template: `\"use client\"\n\nimport { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\"\nimport { cn } from \"cn\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/sheet.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"@base-ui/react/dialog\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Sheet({ ...props }: SheetPrimitive.Root.Props) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({ ...props }: SheetPrimitive.Close.Props) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n return (\n <SheetPrimitive.Backdrop\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: SheetPrimitive.Popup.Props & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Popup\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close\n data-slot=\"sheet-close\"\n render={\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 right-3\"\n size=\"icon-sm\"\n />\n }\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Popup>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: SheetPrimitive.Description.Props) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/sidebar.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { useIsMobile } from \"@<%= projectName %>/ui/hooks/use-mobile\"\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { Input } from \"@<%= projectName %>/ui/components/input\"\nimport { Separator } from \"@<%= projectName %>/ui/components/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@<%= projectName %>/ui/components/sheet\"\nimport { Skeleton } from \"@<%= projectName %>/ui/components/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@<%= projectName %>/ui/components/tooltip\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = \\`\\${SIDEBAR_COOKIE_NAME}=\\${openState}; path=/; max-age=\\${SIDEBAR_COOKIE_MAX_AGE}\\`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & React.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-group-label\",\n sidebar: \"group-label\",\n },\n })\n}\n\nfunction SidebarGroupAction({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"button\"> & React.ComponentProps<\"button\">) {\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n className: cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-group-action\",\n sidebar: \"group-action\",\n },\n })\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n render,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: useRender.ComponentProps<\"button\"> &\n React.ComponentProps<\"button\"> & {\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n } & VariantProps<typeof sidebarMenuButtonVariants>) {\n const { isMobile, state } = useSidebar()\n const comp = useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n className: cn(sidebarMenuButtonVariants({ variant, size }), className),\n },\n props\n ),\n render: !tooltip ? render : <TooltipTrigger render={render} />,\n state: {\n slot: \"sidebar-menu-button\",\n sidebar: \"menu-button\",\n size,\n active: isActive,\n },\n })\n\n if (!tooltip) {\n return comp\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n {comp}\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n render,\n showOnHover = false,\n ...props\n}: useRender.ComponentProps<\"button\"> &\n React.ComponentProps<\"button\"> & {\n showOnHover?: boolean\n }) {\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n className: cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-menu-action\",\n sidebar: \"menu-action\",\n },\n })\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return \\`\\${Math.floor(Math.random() * 40) + 50}%\\`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n render,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: useRender.ComponentProps<\"a\"> &\n React.ComponentProps<\"a\"> & {\n size?: \"sm\" | \"md\"\n isActive?: boolean\n }) {\n return useRender({\n defaultTagName: \"a\",\n props: mergeProps<\"a\">(\n {\n className: cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"sidebar-menu-sub-button\",\n sidebar: \"menu-sub-button\",\n size,\n active: isActive,\n },\n })\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/skeleton.tsx\",\n template: `import { cn } from \"cn\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/slider.tsx\",\n template: `import { Slider as SliderPrimitive } from \"@base-ui/react/slider\"\nimport { cn } from \"cn\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: SliderPrimitive.Root.Props) {\n const _values = Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max]\n\n return (\n <SliderPrimitive.Root\n className={cn(\"data-horizontal:w-full data-vertical:h-full\", className)}\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n thumbAlignment=\"edge\"\n {...props}\n >\n <SliderPrimitive.Control className=\"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col\">\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted select-none data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1\"\n >\n <SliderPrimitive.Indicator\n data-slot=\"slider-range\"\n className=\"bg-primary select-none data-horizontal:h-full data-vertical:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden active:ring-3 disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Control>\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/sonner.tsx\",\n template: `\"use client\"\n\nimport { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\nimport { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from \"lucide-react\"\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n icons={{\n success: (\n <CircleCheckIcon className=\"size-4\" />\n ),\n info: (\n <InfoIcon className=\"size-4\" />\n ),\n warning: (\n <TriangleAlertIcon className=\"size-4\" />\n ),\n error: (\n <OctagonXIcon className=\"size-4\" />\n ),\n loading: (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ),\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/switch.tsx\",\n template: `\"use client\"\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\nimport { cn } from \"cn\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: SwitchPrimitive.Root.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none group-has-[:focus-visible]/field-label:border-transparent group-has-[:focus-visible]/field-label:ring-0 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/table.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/tabs.tsx\",\n template: `\"use client\"\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/textarea.tsx\",\n template: `import * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/toggle-group.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"@base-ui/react/toggle-group\"\nimport { type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { toggleVariants } from \"@<%= projectName %>/ui/components/toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 2,\n orientation: \"horizontal\",\n})\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 2,\n orientation = \"horizontal\",\n children,\n ...props\n}: ToggleGroupPrimitive.Props &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }) {\n return (\n <ToggleGroupPrimitive\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n data-orientation={orientation}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider\n value={{ variant, size, spacing, orientation }}\n >\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant = \"default\",\n size = \"default\",\n ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <TogglePrimitive\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n \"shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t\",\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </TogglePrimitive>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/toggle.tsx\",\n template: `\"use client\"\n\nimport { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nconst toggleVariants = cva(\n \"group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline: \"border border-input bg-transparent hover:bg-muted\",\n },\n size: {\n default:\n \"h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n sm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/tooltip.tsx\",\n template: `\"use client\"\n\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\nimport { cn } from \"cn\"\n\nfunction TooltipProvider({\n delay = 0,\n ...props\n}: TooltipPrimitive.Provider.Props) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n )\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n children,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<\n TooltipPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n >) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5\" />\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/mode-toggle.tsx\",\n template: `'use client';\n\nimport { Moon, Sun } from 'lucide-react';\nimport { useTheme } from 'next-themes';\nimport { Button } from '@<%= projectName %>/ui/button';\n\nexport function ModeToggle() {\n const { resolvedTheme, setTheme } = useTheme();\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')}\n >\n <Sun className=\"hidden dark:block\" />\n <Moon className=\"block dark:hidden\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n );\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/attachment.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\n\nconst attachmentVariants = cva(\n \"group/attachment relative flex w-fit max-w-full min-w-0 shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:ring-1 focus-within:ring-ring/50 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed\",\n {\n variants: {\n size: {\n default:\n \"gap-2 text-sm has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2\",\n sm: \"gap-2.5 text-xs has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5\",\n xs: \"gap-1.5 rounded-lg text-xs has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1\",\n },\n orientation: {\n horizontal: \"min-w-40 items-center\",\n vertical: \"w-24 flex-col has-data-[slot=attachment-content]:w-30\",\n },\n },\n }\n)\n\nfunction Attachment({\n className,\n state = \"done\",\n size = \"default\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof attachmentVariants> & {\n state?: \"idle\" | \"uploading\" | \"processing\" | \"error\" | \"done\"\n }) {\n return (\n <div\n data-slot=\"attachment\"\n data-state={state}\n data-size={size}\n data-orientation={orientation}\n className={cn(attachmentVariants({ size, orientation }), className)}\n {...props}\n />\n )\n}\n\nconst attachmentMediaVariants = cva(\n \"relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5\",\n {\n variants: {\n variant: {\n icon: \"\",\n image:\n \"opacity-60 group-data-[state=done]/attachment:opacity-100 group-data-[state=idle]/attachment:opacity-100 *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"icon\",\n },\n }\n)\n\nfunction AttachmentMedia({\n className,\n variant = \"icon\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof attachmentMediaVariants>) {\n return (\n <div\n data-slot=\"attachment-media\"\n data-variant={variant}\n className={cn(attachmentMediaVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AttachmentContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-content\"\n className={cn(\n \"max-w-full min-w-0 flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentTitle({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-title\"\n className={cn(\n \"block max-w-full min-w-0 truncate font-medium group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentDescription({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-description\"\n className={cn(\n \"mt-0.5 block min-w-0 truncate text-xs text-muted-foreground group-data-[state=error]/attachment:text-destructive/80\",\n \"max-w-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentActions({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-actions\"\n className={cn(\n \"relative z-20 flex shrink-0 items-center group-data-[orientation=vertical]/attachment:absolute group-data-[orientation=vertical]/attachment:top-3 group-data-[orientation=vertical]/attachment:right-3 group-data-[orientation=vertical]/attachment:gap-1\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AttachmentAction({\n className,\n variant,\n size = \"icon-xs\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n return (\n <Button\n data-slot=\"attachment-action\"\n variant={variant ?? \"ghost\"}\n size={size}\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction AttachmentTrigger({\n className,\n render,\n type,\n ...props\n}: useRender.ComponentProps<\"button\">) {\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(\n {\n type: render ? type : (type ?? \"button\"),\n className: cn(\"absolute inset-0 z-10 outline-none\", className),\n },\n props\n ),\n render,\n state: {\n slot: \"attachment-trigger\",\n },\n })\n}\n\nfunction AttachmentGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-group\"\n className={cn(\n \"flex min-w-0 scroll-fade-x snap-x snap-mandatory scroll-px-1 scrollbar-none gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Attachment,\n AttachmentGroup,\n AttachmentMedia,\n AttachmentContent,\n AttachmentTitle,\n AttachmentDescription,\n AttachmentActions,\n AttachmentAction,\n AttachmentTrigger,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/bubble.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nfunction BubbleGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bubble-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nconst bubbleVariants = cva(\n \"group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full\",\n {\n variants: {\n variant: {\n default:\n \"*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80\",\n secondary:\n \"*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]\",\n muted:\n \"*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]\",\n tinted:\n \"*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)] *:data-[slot=bubble-content]:text-foreground dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)] [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)] dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]\",\n outline:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30\",\n ghost:\n \"border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50\",\n destructive:\n \"*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Bubble({\n variant = \"default\",\n align = \"start\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof bubbleVariants> & {\n align?: \"start\" | \"end\"\n }) {\n return (\n <div\n data-slot=\"bubble\"\n data-variant={variant}\n data-align={align}\n className={cn(bubbleVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction BubbleContent({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"w-fit max-w-full min-w-0 overflow-hidden rounded-xl border border-transparent px-3 py-2 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-ring [button,a]:focus-visible:ring-3 [button,a]:focus-visible:ring-ring/50\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"bubble-content\",\n },\n })\n}\n\nconst bubbleReactionsVariants = cva(\n \"absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0\",\n {\n variants: {\n side: {\n top: \"top-0 -translate-y-3/4\",\n bottom: \"bottom-0 translate-y-3/4\",\n },\n align: {\n start: \"left-3\",\n end: \"right-3\",\n },\n },\n defaultVariants: {\n side: \"bottom\",\n align: \"end\",\n },\n }\n)\n\nfunction BubbleReactions({\n side = \"bottom\",\n align = \"end\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\"\n side?: \"top\" | \"bottom\"\n}) {\n return (\n <div\n data-slot=\"bubble-reactions\"\n data-align={align}\n data-side={side}\n className={cn(bubbleReactionsVariants({ side, align }), className)}\n {...props}\n />\n )\n}\n\nexport { BubbleGroup, Bubble, BubbleContent, BubbleReactions }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/marker.tsx\",\n template: `import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nconst markerVariants = cva(\n \"group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground\",\n {\n variants: {\n variant: {\n default: \"\",\n separator:\n \"before:mr-1 before:h-px before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-px after:min-w-0 after:flex-1 after:bg-border\",\n border: \"border-b border-border pb-2\",\n },\n },\n }\n)\n\nfunction Marker({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & VariantProps<typeof markerVariants>) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(markerVariants({ variant, className })),\n },\n props\n ),\n render,\n state: {\n slot: \"marker\",\n variant,\n },\n })\n}\n\nfunction MarkerIcon({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-icon\"\n aria-hidden=\"true\"\n className={cn(\n \"size-4 shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MarkerContent({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-content\"\n className={cn(\n \"min-w-0 wrap-break-word group-data-[variant=separator]/marker:flex-none group-data-[variant=separator]/marker:text-center *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Marker, MarkerIcon, MarkerContent, markerVariants }\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/message.tsx\",\n template: `import * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction MessageGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction Message({\n className,\n align = \"start\",\n ...props\n}: React.ComponentProps<\"div\"> & { align?: \"start\" | \"end\" }) {\n return (\n <div\n data-slot=\"message\"\n data-align={align}\n className={cn(\n \"group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageAvatar({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-avatar\"\n className={cn(\n \"flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-content\"\n className={cn(\n \"flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-header\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-footer\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n MessageGroup,\n Message,\n MessageAvatar,\n MessageContent,\n MessageFooter,\n MessageHeader,\n}\n`,\n};\n","export default {\n filename: \"packages/ui/src/components/message-scroller.tsx\",\n template: `\"use client\"\n\nimport * as React from \"react\"\nimport {\n MessageScroller as MessageScrollerPrimitive,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@<%= projectName %>/ui/components/button\"\nimport { ArrowDownIcon } from \"lucide-react\"\n\nfunction MessageScrollerProvider(\n props: React.ComponentProps<typeof MessageScrollerPrimitive.Provider>\n) {\n return <MessageScrollerPrimitive.Provider {...props} />\n}\n\nfunction MessageScroller({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Root>) {\n return (\n <MessageScrollerPrimitive.Root\n data-slot=\"message-scroller\"\n className={cn(\n \"group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerViewport({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Viewport>) {\n return (\n <MessageScrollerPrimitive.Viewport\n data-slot=\"message-scroller-viewport\"\n className={cn(\n \"size-full min-h-0 min-w-0 scroll-fade-b scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent data-pending-scroll:invisible\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerContent({\n className,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Content>) {\n return (\n <MessageScrollerPrimitive.Content\n data-slot=\"message-scroller-content\"\n className={cn(\"flex h-max min-h-full flex-col gap-6\", className)}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerItem({\n className,\n scrollAnchor = false,\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Item>) {\n return (\n <MessageScrollerPrimitive.Item\n data-slot=\"message-scroller-item\"\n scrollAnchor={scrollAnchor}\n className={cn(\n \"min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MessageScrollerButton({\n direction = \"end\",\n className,\n children,\n render,\n variant = \"secondary\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps<typeof MessageScrollerPrimitive.Button> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <MessageScrollerPrimitive.Button\n data-slot=\"message-scroller-button\"\n data-direction={direction}\n data-variant={variant}\n data-size={size}\n direction={direction}\n className={cn(\n \"absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180\",\n className\n )}\n render={render ?? <Button variant={variant} size={size} />}\n {...props}\n >\n {children ?? (\n <>\n <ArrowDownIcon\n />\n <span className=\"sr-only\">\n {direction === \"end\" ? \"Scroll to end\" : \"Scroll to start\"}\n </span>\n </>\n )}\n </MessageScrollerPrimitive.Button>\n )\n}\n\nexport {\n MessageScrollerProvider,\n MessageScroller,\n MessageScrollerViewport,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerButton,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n}\n`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport componentsJson from \"./templates/components-json\";\nimport webComponentsJson from \"./templates/web-components-json\";\nimport packageJson from \"./templates/package-json\";\nimport utils from \"./templates/utils\";\nimport useMobile from \"./templates/use-mobile\";\nimport globalsCss from \"./templates/globals-css\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport tsconfig from \"./templates/tsconfig\";\nimport link from \"./templates/link\";\nimport logo from \"./templates/logo\";\nimport layout from \"./templates/layout\";\nimport page from \"./templates/page\";\nimport providers from \"./templates/providers\";\nimport authForm from \"./templates/auth-form\";\nimport accordion from \"./templates/accordion\";\nimport alertDialog from \"./templates/alert-dialog\";\nimport alert from \"./templates/alert\";\nimport aspectRatio from \"./templates/aspect-ratio\";\nimport avatar from \"./templates/avatar\";\nimport badge from \"./templates/badge\";\nimport breadcrumb from \"./templates/breadcrumb\";\nimport button from \"./templates/button\";\nimport calendar from \"./templates/calendar\";\nimport card from \"./templates/card\";\nimport carousel from \"./templates/carousel\";\nimport chart from \"./templates/chart\";\nimport checkbox from \"./templates/checkbox\";\nimport collapsible from \"./templates/collapsible\";\nimport command from \"./templates/command\";\nimport combobox from \"./templates/combobox\";\nimport contextMenu from \"./templates/context-menu\";\nimport dialog from \"./templates/dialog\";\nimport direction from \"./templates/direction\";\nimport drawer from \"./templates/drawer\";\nimport dropdownMenu from \"./templates/dropdown-menu\";\nimport empty from \"./templates/empty\";\nimport field from \"./templates/field\";\nimport hoverCard from \"./templates/hover-card\";\nimport buttonGroup from \"./templates/button-group\";\nimport inputGroup from \"./templates/input-group\";\nimport item from \"./templates/item\";\nimport kbd from \"./templates/kbd\";\nimport nativeSelect from \"./templates/native-select\";\nimport spinner from \"./templates/spinner\";\nimport inputOtp from \"./templates/input-otp\";\nimport input from \"./templates/input\";\nimport label from \"./templates/label\";\nimport menubar from \"./templates/menubar\";\nimport navigationMenu from \"./templates/navigation-menu\";\nimport pagination from \"./templates/pagination\";\nimport popover from \"./templates/popover\";\nimport progress from \"./templates/progress\";\nimport radioGroup from \"./templates/radio-group\";\nimport resizable from \"./templates/resizable\";\nimport scrollArea from \"./templates/scroll-area\";\nimport select from \"./templates/select\";\nimport separator from \"./templates/separator\";\nimport sheet from \"./templates/sheet\";\nimport sidebar from \"./templates/sidebar\";\nimport skeleton from \"./templates/skeleton\";\nimport slider from \"./templates/slider\";\nimport sonner from \"./templates/sonner\";\nimport switchComp from \"./templates/switch\";\nimport table from \"./templates/table\";\nimport tabs from \"./templates/tabs\";\nimport textarea from \"./templates/textarea\";\nimport toggleGroup from \"./templates/toggle-group\";\nimport toggle from \"./templates/toggle\";\nimport tooltip from \"./templates/tooltip\";\nimport modeToggle from \"./templates/mode-toggle\";\nimport attachment from \"./templates/attachment\";\nimport bubble from \"./templates/bubble\";\nimport marker from \"./templates/marker\";\nimport message from \"./templates/message\";\nimport messageScroller from \"./templates/message-scroller\";\n\nconst shadcnUi: Module = {\n templates: [\n packageJson,\n utils,\n useMobile,\n globalsCss,\n postcssConfig,\n tsconfig,\n link,\n logo,\n layout,\n page,\n providers,\n authForm,\n accordion,\n alertDialog,\n alert,\n aspectRatio,\n avatar,\n badge,\n breadcrumb,\n button,\n calendar,\n card,\n carousel,\n chart,\n checkbox,\n collapsible,\n command,\n combobox,\n contextMenu,\n dialog,\n direction,\n drawer,\n dropdownMenu,\n empty,\n field,\n hoverCard,\n buttonGroup,\n inputGroup,\n item,\n kbd,\n nativeSelect,\n spinner,\n inputOtp,\n input,\n label,\n menubar,\n navigationMenu,\n pagination,\n popover,\n progress,\n radioGroup,\n resizable,\n scrollArea,\n select,\n separator,\n sheet,\n sidebar,\n skeleton,\n slider,\n sonner,\n switchComp,\n table,\n tabs,\n textarea,\n toggleGroup,\n toggle,\n tooltip,\n modeToggle,\n attachment,\n bubble,\n marker,\n message,\n messageScroller,\n componentsJson,\n webComponentsJson,\n ],\n packages: [\n {\n package: \"next-themes\",\n module: \"apps/web\",\n version: versions[\"next-themes\"],\n },\n { package: \"sonner\", module: \"apps/web\", version: versions.sonner },\n ],\n};\n\nexport default shadcnUi;\n","export default {\n filename: \"packages/ui/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/ui\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"exports\": {\n \"./globals.css\": \"./src/globals.css\",\n \"./tokens.stylex\": \"./src/tokens.stylex.ts\",\n \"./*\": \"./src/*.tsx\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.0.0\",\n \"react\": \">=19.0.0\",\n \"react-dom\": \">=19.0.0\"\n },\n \"dependencies\": {\n \"@stylexjs/stylex\": \"<%= versions[\"@stylexjs/stylex\"] %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/ui/src/tokens.stylex.ts\",\n template: `import * as stylex from \"@stylexjs/stylex\";\n\nexport const colors = stylex.defineVars({\n background: \"oklch(0.145 0 0)\",\n foreground: \"oklch(0.985 0 0)\",\n muted: \"oklch(0.269 0 0)\",\n mutedForeground: \"oklch(0.708 0 0)\",\n border: \"oklch(0.469 0 0)\",\n accent: \"oklch(0.985 0 0)\",\n accentForeground: \"oklch(0.205 0 0)\",\n danger: \"oklch(0.637 0.237 25.331)\",\n});\n\nexport const fonts = stylex.defineVars({\n sans: \"var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif\",\n mono: \"var(--font-geist-mono), ui-monospace, monospace\",\n});\n\nexport const radii = stylex.defineVars({\n sm: \"6px\",\n md: \"8px\",\n lg: \"12px\",\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/button.tsx\",\n template: `\"use client\";\n\nimport { ReactNode } from \"react\";\nimport * as stylex from \"@stylexjs/stylex\";\nimport type { StyleXStyles } from \"@stylexjs/stylex\";\nimport { colors, fonts, radii } from \"./tokens.stylex\";\n\ninterface ButtonProps {\n children: ReactNode;\n onClick?: () => void;\n type?: \"button\" | \"submit\" | \"reset\";\n disabled?: boolean;\n style?: StyleXStyles;\n}\n\nexport const Button = ({ children, onClick, type = \"button\", disabled, style }: ButtonProps) => {\n return (\n <button\n type={type}\n onClick={onClick}\n disabled={disabled}\n {...stylex.props(styles.base, disabled && styles.disabled, style)}\n >\n {children}\n </button>\n );\n};\n\nconst styles = stylex.create({\n base: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n height: 36,\n paddingBlock: 0,\n paddingInline: 16,\n fontFamily: fonts.sans,\n fontSize: 14,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n color: colors.accentForeground,\n backgroundColor: {\n default: colors.accent,\n \":hover\": \"oklch(0.922 0 0)\",\n },\n borderStyle: \"none\",\n borderRadius: radii.sm,\n boxShadow: \"0 1px 2px rgba(0, 0, 0, 0.3)\",\n cursor: \"pointer\",\n transitionProperty: \"background-color\",\n transitionDuration: \"150ms\",\n outlineColor: \"rgba(255, 255, 255, 0.5)\",\n outlineOffset: 2,\n outlineStyle: {\n default: \"none\",\n \":focus-visible\": \"solid\",\n },\n outlineWidth: 2,\n },\n disabled: {\n opacity: 0.5,\n pointerEvents: \"none\",\n },\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/link.tsx\",\n template: `import NextLink, { type LinkProps } from \"next/link\";\nimport { type PropsWithChildren } from \"react\";\nimport * as stylex from \"@stylexjs/stylex\";\nimport type { StyleXStyles } from \"@stylexjs/stylex\";\nimport { colors } from \"./tokens.stylex\";\n\nexport function Link({\n href,\n children,\n style,\n ...rest\n}: PropsWithChildren<LinkProps & { style?: StyleXStyles }>) {\n return (\n <NextLink href={href} {...rest} {...stylex.props(styles.link, style)}>\n {children}\n </NextLink>\n );\n}\n\nconst styles = stylex.create({\n link: {\n color: \"inherit\",\n textDecorationLine: \"underline\",\n textDecorationColor: {\n default: colors.mutedForeground,\n \":hover\": colors.foreground,\n },\n transitionProperty: \"text-decoration-color\",\n transitionDuration: \"150ms\",\n },\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/logo.tsx\",\n template: `import * as stylex from \"@stylexjs/stylex\";\nimport type { StyleXStyles } from \"@stylexjs/stylex\";\nimport { colors } from \"./tokens.stylex\";\n\ninterface LogoProps {\n style?: StyleXStyles;\n}\n\nexport function Logo({ style }: LogoProps) {\n return (\n <svg\n width=\"196\"\n height=\"138\"\n viewBox=\"0 0 196 138\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...stylex.props(styles.logo, style)}\n >\n <path\n d=\"M98 35C102.665 35 107.243 35.2232 111.707 35.6514C111.243 38.1972 111 40.8202 111 43.5C111 67.5244 130.476 87 154.5 87C165.156 87 174.914 83.1658 182.478 76.8057C183.476 79.9455 184 83.186 184 86.5C184 114.943 145.496 138 98 138C50.5035 138 12 114.943 12 86.5C12 83.1861 12.5228 79.9454 13.5215 76.8057C21.0851 83.1661 30.8441 87 41.5 87C65.5244 87 85 67.5244 85 43.5C85 40.8202 84.7559 38.1973 84.292 35.6514C88.7559 35.2232 93.3345 35 98 35ZM38.5 0C59.763 0 77 17.237 77 38.5C77 59.763 59.763 77 38.5 77C17.237 77 0 59.763 0 38.5C0 17.237 17.237 0 38.5 0ZM157.5 0C178.763 0 196 17.237 196 38.5C196 59.763 178.763 77 157.5 77C136.237 77 119 59.763 119 38.5C119 17.237 136.237 0 157.5 0Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nconst styles = stylex.create({\n logo: {\n color: colors.foreground,\n },\n});\n`,\n};\n","export default {\n filename: \"packages/ui/src/globals.css\",\n template: `@layer resets {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n * {\n margin: 0;\n padding: 0;\n }\n\n html,\n body {\n height: 100%;\n }\n\n html {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n}\n\n@stylex;\n`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"di-only\",\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\",\n \"typecheck\": \"next typegen && tsc --noEmit\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@stylexjs/stylex\": \"<%= versions[\"@stylexjs/stylex\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@stylexjs/babel-plugin\": \"<%= versions[\"@stylexjs/babel-plugin\"] %>\",\n \"@stylexjs/postcss-plugin\": \"<%= versions[\"@stylexjs/postcss-plugin\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\",\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/api\": \"workspace:*\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"@stylexjs/stylex\": \"<%= versions[\"@stylexjs/stylex\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@babel/plugin-proposal-decorators\": \"<%= versions[\"@babel/plugin-proposal-decorators\"] %>\",\n \"@babel/plugin-transform-class-properties\": \"<%= versions[\"@babel/plugin-transform-class-properties\"] %>\",\n \"babel-plugin-transform-typescript-metadata\": \"<%= versions[\"babel-plugin-transform-typescript-metadata\"] %>\",\n \"@stylexjs/babel-plugin\": \"<%= versions[\"@stylexjs/babel-plugin\"] %>\",\n \"@stylexjs/postcss-plugin\": \"<%= versions[\"@stylexjs/postcss-plugin\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/web/babel.config.js\",\n template: `import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst config = {\n presets: [\"next/babel\"],\n plugins: [\n<% if (nest === 'di-only') { %> \"babel-plugin-transform-typescript-metadata\",\n [\"@babel/plugin-proposal-decorators\", { version: \"legacy\" }],\n [\"@babel/plugin-transform-class-properties\", { loose: true }],\n<% } %> [\n \"@stylexjs/babel-plugin\",\n {\n dev: process.env.NODE_ENV !== \"production\",\n runtimeInjection: false,\n treeshakeCompensation: true,\n unstable_moduleResolution: {\n type: \"commonJS\",\n rootDir: path.join(dirname, \"../..\"),\n },\n },\n ],\n ],\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"apps/web/postcss.config.mjs\",\n template: `import babelConfig from \"./babel.config.js\";\n\nconst config = {\n plugins: {\n \"@stylexjs/postcss-plugin\": {\n include: [\n \"app/**/*.{js,jsx,ts,tsx}\",\n \"../../packages/ui/src/**/*.{js,jsx,ts,tsx}\",\n ],\n babelConfig: {\n babelrc: false,\n parserOpts: { plugins: [\"typescript\", \"jsx\"] },\n plugins: babelConfig.plugins,\n },\n useCSSLayers: true,\n },\n },\n};\n\nexport default config;`,\n};\n","export default {\n filename: \"apps/web/app/layout.tsx\",\n template: `import type { Metadata } from \"next\";\nimport localFont from \"next/font/local\";\nimport * as stylex from \"@stylexjs/stylex\";\nimport Providers from \"@/app/providers\";\nimport { colors, fonts } from \"@<%= projectName %>/ui/tokens.stylex\";\nimport \"@<%= projectName %>/ui/globals.css\";\n\nconst geistSans = localFont({\n src: \"./fonts/GeistVF.woff\",\n variable: \"--font-geist-sans\",\n});\nconst geistMono = localFont({\n src: \"./fonts/GeistMonoVF.woff\",\n variable: \"--font-geist-mono\",\n});\n\nexport const metadata: Metadata = {\n title: \"<%= projectName %>\",\n description: \"Next + Nest = Newt\",\n icons: {\n icon: [\n { url: \"/icon0.svg\", type: \"image/svg+xml\" },\n { url: \"/icon1.png\", type: \"image/png\" },\n ],\n apple: \"/apple-icon.png\",\n },\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\" className={\\`\\${geistSans.variable} \\${geistMono.variable}\\`}>\n <body {...stylex.props(styles.body)}>\n <Providers>{children}</Providers>\n </body>\n </html>\n );\n}\n\nconst styles = stylex.create({\n body: {\n backgroundColor: colors.background,\n color: colors.foreground,\n fontFamily: fonts.sans,\n },\n});\n`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { colors, fonts, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello', session?.user.id],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main {...stylex.props(styles.main)}>\n <div {...stylex.props(styles.header)}>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/page.tsx</p>\n <p {...stylex.props(styles.muted)}>Delete me to get started!</p>\n </div>\n\n <div {...stylex.props(styles.titleRow)}>\n <Logo style={styles.logo} />\n <div>\n <h1 {...stylex.props(styles.h1)}><%= projectName %></h1>\n <p {...stylex.props(styles.muted, styles.tagline)}>\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>next.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/layout.tsx</p>\n <p {...stylex.props(styles.muted)}>Next.js rendering</p>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>nest.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>GET /api/hello</p>\n <pre {...stylex.props(styles.pre)}>\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow, styles.eyebrowSpaced)}>better-auth</p>\n {isPending ? (\n <p {...stylex.props(styles.muted)}>Loading…</p>\n ) : session ? (\n <div {...stylex.props(styles.signedIn)}>\n <p>Signed in as {session.user.name}</p>\n <Button onClick={() => void authClient.signOut()}>\n Sign out\n </Button>\n </div>\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div {...stylex.props(styles.footer)}>\n <p {...stylex.props(styles.muted)}>Learn more</p>\n <ul {...stylex.props(styles.list)}>\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}\n\nconst styles = stylex.create({\n main: {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n maxWidth: '32rem',\n minHeight: '100%',\n marginInline: 'auto',\n paddingBlock: '2rem',\n paddingInline: '1rem',\n fontSize: '0.875rem',\n },\n header: {\n paddingBottom: '1rem',\n borderBottomColor: colors.border,\n borderBottomStyle: 'solid',\n borderBottomWidth: 1,\n },\n titleRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n paddingBlock: '0.5rem',\n },\n logo: {\n width: '2.5rem',\n height: 'auto',\n },\n h1: {\n fontSize: '2.25rem',\n fontWeight: 900,\n letterSpacing: '-0.025em',\n },\n tagline: {\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n },\n card: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n padding: '1.5rem',\n borderColor: colors.border,\n borderRadius: radii.lg,\n borderStyle: 'solid',\n borderWidth: 1,\n },\n eyebrow: {\n fontFamily: fonts.mono,\n fontSize: '0.75rem',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n color: colors.mutedForeground,\n },\n eyebrowSpaced: {\n marginBottom: '0.75rem',\n },\n pre: {\n marginTop: '0.5rem',\n padding: '0.75rem',\n fontFamily: fonts.mono,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: colors.border,\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n overflowX: 'auto',\n },\n signedIn: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: '0.75rem',\n },\n footer: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n paddingBlock: '1rem',\n paddingInline: '0.5rem',\n },\n list: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n listStylePosition: 'inside',\n listStyleType: 'disc',\n },\n mono: {\n fontFamily: fonts.mono,\n },\n muted: {\n color: colors.mutedForeground,\n },\n});\n`,\n};\n","export default {\n filename: \"apps/web/app/auth-form.tsx\",\n template: `'use client';\n\nimport { useForm } from '@tanstack/react-form';\nimport { useState } from 'react';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { colors, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\nexport function AuthForm() {\n const [tab, setTab] = useState<'signin' | 'signup'>('signup');\n const [error, setError] = useState('');\n\n const form = useForm({\n defaultValues: { name: '', email: '', password: '' },\n onSubmit: async ({ value }) => {\n setError('');\n if (tab === 'signin') {\n const { error } = await authClient.signIn.email(value);\n if (error) setError(error.message ?? 'Sign in failed');\n } else {\n const { error } = await authClient.signUp.email(value);\n if (error) setError(error.message ?? 'Sign up failed');\n }\n },\n });\n\n return (\n <>\n <div {...stylex.props(styles.tabs)}>\n <button\n onClick={() => setTab('signup')}\n {...stylex.props(styles.tab, tab === 'signup' && styles.tabActive)}\n >\n Sign up\n </button>\n <span {...stylex.props(styles.divider)}>|</span>\n <button\n onClick={() => setTab('signin')}\n {...stylex.props(styles.tab, tab === 'signin' && styles.tabActive)}\n >\n Sign in\n </button>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n {...stylex.props(styles.form)}\n >\n {tab === 'signup' && (\n <form.Field name=\"name\">\n {(field) => (\n <div {...stylex.props(styles.field)}>\n <label {...stylex.props(styles.label)}>Name</label>\n <input\n type=\"text\"\n autoComplete=\"name\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n {...stylex.props(styles.input)}\n />\n </div>\n )}\n </form.Field>\n )}\n\n <form.Field name=\"email\">\n {(field) => (\n <div {...stylex.props(styles.field)}>\n <label {...stylex.props(styles.label)}>Email</label>\n <input\n type=\"email\"\n autoComplete=\"email\"\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n {...stylex.props(styles.input)}\n />\n </div>\n )}\n </form.Field>\n\n <form.Field name=\"password\">\n {(field) => (\n <div {...stylex.props(styles.field)}>\n <label {...stylex.props(styles.label)}>Password</label>\n <input\n type=\"password\"\n autoComplete={\n tab === 'signin' ? 'current-password' : 'new-password'\n }\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n required\n minLength={8}\n {...stylex.props(styles.input)}\n />\n </div>\n )}\n </form.Field>\n\n {error && <p {...stylex.props(styles.error)}>{error}</p>}\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting} style={styles.submit}>\n {isSubmitting\n ? 'Loading…'\n : tab === 'signin'\n ? 'Sign in'\n : 'Create account'}\n </Button>\n )}\n </form.Subscribe>\n </form>\n </>\n );\n}\n\nconst styles = stylex.create({\n tabs: {\n display: 'flex',\n gap: '0.5rem',\n marginBottom: '1.5rem',\n fontSize: '0.875rem',\n },\n tab: {\n color: {\n default: colors.mutedForeground,\n ':hover': colors.foreground,\n },\n backgroundColor: 'transparent',\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n fontFamily: 'inherit',\n fontSize: 'inherit',\n },\n tabActive: {\n color: colors.foreground,\n fontWeight: 600,\n },\n divider: {\n color: colors.border,\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n },\n field: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n },\n label: {\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n input: {\n width: '100%',\n height: 36,\n paddingBlock: '0.25rem',\n paddingInline: '0.75rem',\n fontFamily: 'inherit',\n fontSize: '0.875rem',\n color: colors.foreground,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: {\n default: colors.border,\n ':focus-visible': colors.mutedForeground,\n },\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n outlineStyle: 'none',\n transitionProperty: 'border-color',\n transitionDuration: '150ms',\n },\n error: {\n fontSize: '0.875rem',\n color: colors.danger,\n },\n submit: {\n width: '100%',\n },\n});\n`,\n};\n","import type { Module } from \"../types\";\nimport tsconfig from \"../ui/templates/tsconfig\";\nimport packageJson from \"./templates/package-json\";\nimport tokens from \"./templates/tokens\";\nimport button from \"./templates/button\";\nimport link from \"./templates/link\";\nimport logo from \"./templates/logo\";\nimport globalsCss from \"./templates/globals-css\";\nimport webPackageJson from \"./templates/web-package-json\";\nimport webPackageJsonDi from \"./templates/web-package-json-di\";\nimport babelConfig from \"./templates/babel-config\";\nimport postcssConfig from \"./templates/postcss-config\";\nimport layout from \"./templates/layout\";\nimport page from \"./templates/page\";\nimport authForm from \"./templates/auth-form\";\n\n// StyleX compiles styles out of the source that authors them, so the app owns\n// the babel and postcss config: the include globs have to reach back into\n// packages/ui, and Next's babel loader only reads a config next to the app.\nconst stylexUi: Module = {\n templates: [\n packageJson,\n tokens,\n button,\n link,\n logo,\n globalsCss,\n tsconfig,\n webPackageJson,\n webPackageJsonDi,\n babelConfig,\n postcssConfig,\n layout,\n page,\n authForm,\n ],\n};\n\nexport default stylexUi;\n","export default {\n filename: \"packages/eslint-config/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/eslint-config\",\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"private\": true,\n \"exports\": {\n \"./base\": \"./base.js\",\n \"./next-js\": \"./next.js\",\n \"./react-internal\": \"./react-internal.js\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"<%= versions[\"@eslint/js\"] %>\",\n \"@next/eslint-plugin-next\": \"<%= versions[\"@next/eslint-plugin-next\"] %>\",<% if (shadcn) { %>\n \"@shadcn/lint\": \"<%= versions[\"@shadcn/lint\"] %>\",<% } %>\n \"eslint\": \"<%= versions.eslint %>\",\n \"eslint-config-prettier\": \"<%= versions[\"eslint-config-prettier\"] %>\",\n \"eslint-plugin-only-warn\": \"<%= versions[\"eslint-plugin-only-warn\"] %>\",\n \"eslint-plugin-react\": \"<%= versions[\"eslint-plugin-react\"] %>\",\n \"eslint-plugin-react-hooks\": \"<%= versions[\"eslint-plugin-react-hooks\"] %>\",\n \"eslint-plugin-turbo\": \"<%= versions[\"eslint-plugin-turbo\"] %>\",\n \"globals\": \"<%= versions.globals %>\",\n \"typescript\": \"<%= versions.typescript %>\",\n \"typescript-eslint\": \"<%= versions[\"typescript-eslint\"] %>\"\n }\n}`,\n};\n","export default {\n filename: \"packages/eslint-config/base.js\",\n template: `import js from \"@eslint/js\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\nimport turboPlugin from \"eslint-plugin-turbo\";\nimport tseslint from \"typescript-eslint\";\nimport onlyWarn from \"eslint-plugin-only-warn\";\n\n/**\n * A shared ESLint configuration for the repository.\n *\n * @type {import(\"eslint\").Linter.Config[]}\n * */\nexport const config = [\n js.configs.recommended,\n eslintConfigPrettier,\n ...tseslint.configs.recommended,\n {\n plugins: {\n turbo: turboPlugin,\n },\n rules: {\n \"turbo/no-undeclared-env-vars\": \"warn\",\n },\n },\n {\n plugins: {\n onlyWarn,\n },\n },\n {\n ignores: [\"dist/**\"],\n },\n];`,\n};\n","export default {\n filename: \"packages/eslint-config/next.js\",\n template: `import js from \"@eslint/js\";\nimport { globalIgnores } from \"eslint/config\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\nimport tseslint from \"typescript-eslint\";\nimport pluginReactHooks from \"eslint-plugin-react-hooks\";\nimport pluginReact from \"eslint-plugin-react\";\nimport globals from \"globals\";\nimport pluginNext from \"@next/eslint-plugin-next\";\nimport { config as baseConfig } from \"./base.js\";<% if (shadcn) { %>\nimport { plugin as shadcn } from \"@shadcn/lint\";<% } %>\n\n/**\n * A custom ESLint configuration for libraries that use Next.js.\n *\n * @type {import(\"eslint\").Linter.Config[]}\n * */\nexport const nextJsConfig = [\n ...baseConfig,\n js.configs.recommended,\n eslintConfigPrettier,\n ...tseslint.configs.recommended,\n globalIgnores([\n // Default ignores of eslint-config-next:\n \".next/**\",\n \"out/**\",\n \"build/**\",\n \"next-env.d.ts\",\n ]),\n {\n ...pluginReact.configs.flat.recommended,\n languageOptions: {\n ...pluginReact.configs.flat.recommended.languageOptions,\n globals: {\n ...globals.serviceworker,\n ...globals.node,\n },\n },\n },\n {\n plugins: {\n \"@next/next\": pluginNext,\n },\n rules: {\n ...pluginNext.configs.recommended.rules,\n ...pluginNext.configs[\"core-web-vitals\"].rules,\n },\n },\n {\n plugins: {\n \"react-hooks\": pluginReactHooks,\n },\n settings: { react: { version: \"detect\" } },\n rules: {\n ...pluginReactHooks.configs.recommended.rules,\n // React scope no longer necessary with new JSX transform.\n \"react/react-in-jsx-scope\": \"off\",\n },\n },<% if (shadcn) { %>\n {\n plugins: { shadcn },\n rules: {\n \"shadcn/no-restyle\": [\"error\", { allow: [\"layout\"] }],\n \"shadcn/no-raw-colors\": \"error\",\n \"shadcn/no-arbitrary-values\": [\"error\", { allow: [\"layout\"] }],\n \"shadcn/require-static-classes\": \"error\",\n },\n },<% } %>\n];`,\n};\n","export default {\n filename: \"packages/eslint-config/react-internal.js\",\n template: `import js from \"@eslint/js\";\nimport eslintConfigPrettier from \"eslint-config-prettier\";\nimport tseslint from \"typescript-eslint\";\nimport pluginReactHooks from \"eslint-plugin-react-hooks\";\nimport pluginReact from \"eslint-plugin-react\";\nimport globals from \"globals\";\nimport { config as baseConfig } from \"./base.js\";<% if (shadcn) { %>\nimport { plugin as shadcn } from \"@shadcn/lint\";<% } %>\n\n/**\n * A custom ESLint configuration for libraries that use React.\n *\n * @type {import(\"eslint\").Linter.Config[]} */\nexport const config = [\n ...baseConfig,\n js.configs.recommended,\n eslintConfigPrettier,\n ...tseslint.configs.recommended,\n pluginReact.configs.flat.recommended,\n {\n languageOptions: {\n ...pluginReact.configs.flat.recommended.languageOptions,\n globals: {\n ...globals.serviceworker,\n ...globals.browser,\n },\n },\n },\n {\n plugins: {\n \"react-hooks\": pluginReactHooks,\n },\n settings: { react: { version: \"detect\" } },\n rules: {\n ...pluginReactHooks.configs.recommended.rules,\n // React scope no longer necessary with new JSX transform.\n \"react/react-in-jsx-scope\": \"off\",\n \"react/prop-types\": \"off\",\n },\n },<% if (shadcn) { %>\n {\n plugins: { shadcn },\n rules: {\n \"shadcn/no-restyle\": [\"error\", { allow: [\"layout\"] }],\n \"shadcn/no-raw-colors\": \"error\",\n \"shadcn/no-arbitrary-values\": [\"error\", { allow: [\"layout\"] }],\n \"shadcn/require-static-classes\": \"error\",\n },\n },\n {\n files: [\"src/components/**\"],\n rules: {\n \"shadcn/no-restyle\": \"off\",\n \"shadcn/no-arbitrary-values\": \"off\",\n \"shadcn/require-static-classes\": \"off\",\n },\n },<% } %>\n];`,\n};\n","export default {\n filename: \"apps/web/eslint.config.js\",\n template: `import { nextJsConfig } from \"@<%= projectName %>/eslint-config/next-js\";\n\n/** @type {import(\"eslint\").Linter.Config[]} */\nexport default nextJsConfig;`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest !== \"off\",\n filename: \"apps/api/eslint.config.mjs\",\n template: `// @ts-check\nimport eslint from '@eslint/js';\nimport prettierConfig from 'eslint-config-prettier';\nimport globals from 'globals';\nimport tseslint from 'typescript-eslint';\n\nexport default tseslint.config(\n {\n ignores: ['eslint.config.mjs'],\n },\n eslint.configs.recommended,\n ...tseslint.configs.recommendedTypeChecked,\n prettierConfig,\n {\n languageOptions: {\n globals: {\n ...globals.node,\n ...globals.<%= testing %>,\n },\n sourceType: 'commonjs',\n parserOptions: {\n projectService: true,\n tsconfigRootDir: import.meta.dirname,\n },\n },\n },\n {\n rules: {\n '@typescript-eslint/no-explicit-any': 'off',\n '@typescript-eslint/no-floating-promises': 'warn',\n '@typescript-eslint/no-unsafe-argument': 'warn',\n },\n },\n);`,\n};\n","export default {\n filename: \"packages/ui/eslint.config.mjs\",\n template: `import { config } from \"@<%= projectName %>/eslint-config/react-internal\";\n\n/** @type {import(\"eslint\").Linter.Config} */\nexport default config;`,\n};\n","export default {\n filename: \".prettierrc\",\n template: `{}`,\n};\n","export default {\n filename: \".prettierignore\",\n template: `pnpm-lock.yaml\n`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport packageJson from \"./templates/package-json\";\nimport base from \"./templates/base\";\nimport next from \"./templates/next\";\nimport reactInternal from \"./templates/react-internal\";\nimport webConfig from \"../web/templates/eslint-config\";\nimport apiConfig from \"../api/templates/eslint-config\";\nimport uiConfig from \"../ui/templates/eslint-config\";\nimport prettierrc from \"../root/templates/prettierrc\";\nimport prettierignore from \"../root/templates/prettierignore\";\n\nconst web = \"apps/web\";\nconst api = \"apps/api\";\nconst ui = \"packages/ui\";\nconst root = \"\";\n\nconst eslintConfig: Module = {\n templates: [\n packageJson,\n base,\n next,\n reactInternal,\n webConfig,\n apiConfig,\n uiConfig,\n prettierrc,\n prettierignore,\n ],\n packages: [\n { package: \"eslint\", module: web, version: versions.eslint, dev: true },\n {\n package: \"@<%= projectName %>/eslint-config\",\n module: web,\n version: \"workspace:*\",\n dev: true,\n },\n {\n package: \"@eslint/js\",\n module: api,\n version: versions[\"@eslint/js\"],\n dev: true,\n },\n { package: \"eslint\", module: api, version: versions.eslint, dev: true },\n {\n package: \"eslint-config-prettier\",\n module: api,\n version: versions[\"eslint-config-prettier\"],\n dev: true,\n },\n { package: \"globals\", module: api, version: versions.globals, dev: true },\n {\n package: \"typescript-eslint\",\n module: api,\n version: versions[\"typescript-eslint\"],\n dev: true,\n },\n { package: \"eslint\", module: ui, version: versions.eslint, dev: true },\n {\n package: \"@<%= projectName %>/eslint-config\",\n module: ui,\n version: \"workspace:*\",\n dev: true,\n },\n {\n package: \"prettier\",\n module: root,\n version: versions.prettier,\n dev: true,\n },\n ],\n scripts: [\n {\n module: web,\n name: \"lint\",\n script: \"eslint --fix && next typegen && tsc --noEmit\",\n },\n {\n module: web,\n name: \"lint:check\",\n script: \"eslint --max-warnings 0 && next typegen && tsc --noEmit\",\n },\n { module: api, name: \"lint\", script: `eslint \"src/**/*.ts\" --fix` },\n { module: api, name: \"lint:check\", script: `eslint \"src/**/*.ts\" --max-warnings 0` },\n { module: ui, name: \"lint\", script: \"eslint . --fix\" },\n { module: ui, name: \"lint:check\", script: \"eslint . --max-warnings 0\" },\n { module: root, name: \"lint:check\", script: \"turbo run lint:check\" },\n {\n module: root,\n name: \"format\",\n script: `prettier --write \"**/*.{ts,tsx,js,jsx,json,md,yaml,yml}\"`,\n },\n {\n module: root,\n name: \"format:check\",\n script: `prettier --check \"**/*.{ts,tsx,js,jsx,json,md,yaml,yml}\"`,\n },\n ],\n};\n\nexport default eslintConfig;\n","export default {\n filename: \".oxlintrc.json\",\n template: `{\n \"$schema\": \"https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json\",\n \"categories\": {\n \"correctness\": \"error\"\n }<% if (antiSlop) { %>,\n \"ignorePatterns\": [\"tools/oxlint/anti-slop/**\"]<% } %><% if (antiSlop || shadcn) { %>,\n \"jsPlugins\": [<% if (antiSlop) { %>{ \"name\": \"anti-slop\", \"specifier\": \"./tools/oxlint/anti-slop/index.ts\" }<% } %><% if (antiSlop && shadcn) { %>, <% } %><% if (shadcn) { %>\"@shadcn/lint\"<% } %>],\n \"rules\": {<% if (antiSlop) { %>\n \"anti-slop/no-chained-type-assertions\": \"error\",\n \"anti-slop/no-conditional-empty-object-spread\": \"error\",\n \"anti-slop/no-known-value-widening\": \"error\",\n \"anti-slop/no-module-mocking\": \"error\",\n \"anti-slop/no-object-parameters\": \"error\",\n \"anti-slop/no-reflect-apply\": \"error\",\n \"anti-slop/no-reflect-get\": \"error\",\n \"anti-slop/no-runtime-typeof\": \"error\",\n \"anti-slop/no-shape-in-symbol-names\": \"error\",\n \"anti-slop/no-unknown-parameters\": \"error\",\n \"anti-slop/no-unknown-returns\": \"error\",\n \"anti-slop/no-unknown-type-aliases\": \"error\",\n \"anti-slop/no-unsafe-dictionary-type\": \"error\",\n \"anti-slop/no-widen-then-assert\": \"error\",\n \"anti-slop/require-safety-comment-for-type-assertion\": \"error\"<% if (shadcn) { %>,<% } %><% } %><% if (shadcn) { %>\n \"shadcn/no-restyle\": [\"error\", { \"allow\": [\"layout\"] }],\n \"shadcn/no-raw-colors\": \"error\",\n \"shadcn/no-arbitrary-values\": [\"error\", { \"allow\": [\"layout\"] }],\n \"shadcn/require-static-classes\": \"error\"<% } %>\n }<% } %><% if (shadcn) { %>,\n \"overrides\": [\n {\n \"files\": [\"packages/ui/src/components/**\"],\n \"rules\": {<% if (antiSlop) { %>\n \"anti-slop/no-chained-type-assertions\": \"off\",\n \"anti-slop/no-conditional-empty-object-spread\": \"off\",\n \"anti-slop/no-known-value-widening\": \"off\",\n \"anti-slop/no-module-mocking\": \"off\",\n \"anti-slop/no-object-parameters\": \"off\",\n \"anti-slop/no-reflect-apply\": \"off\",\n \"anti-slop/no-reflect-get\": \"off\",\n \"anti-slop/no-runtime-typeof\": \"off\",\n \"anti-slop/no-shape-in-symbol-names\": \"off\",\n \"anti-slop/no-unknown-parameters\": \"off\",\n \"anti-slop/no-unknown-returns\": \"off\",\n \"anti-slop/no-unknown-type-aliases\": \"off\",\n \"anti-slop/no-unsafe-dictionary-type\": \"off\",\n \"anti-slop/no-widen-then-assert\": \"off\",\n \"anti-slop/require-safety-comment-for-type-assertion\": \"off\",<% } %>\n \"shadcn/no-restyle\": \"off\",\n \"shadcn/no-arbitrary-values\": \"off\",\n \"shadcn/require-static-classes\": \"off\"\n }\n }\n ]<% } %>\n}`,\n};\n","export default {\n filename: \".oxfmtrc.json\",\n template: `{\n \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n \"ignorePatterns\": [<% if (antiSlop) { %>\"tools/oxlint/anti-slop/\"<% } %>]\n}`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport oxlintrc from \"./templates/oxlintrc\";\nimport oxfmtrc from \"./templates/oxfmtrc\";\n\nconst root = \"\";\n\n// oxlint reads the nearest config per file and covers the whole tree in one\n// pass, so it runs once from the root rather than as a task per workspace.\nconst oxc: Module = {\n templates: [oxlintrc, oxfmtrc],\n packages: [\n { package: \"oxlint\", module: root, version: versions.oxlint, dev: true },\n { package: \"oxfmt\", module: root, version: versions.oxfmt, dev: true },\n ],\n scripts: [\n { module: root, name: \"lint\", script: \"oxlint --fix\" },\n { module: root, name: \"lint:check\", script: \"oxlint\" },\n { module: root, name: \"format\", script: \"oxfmt\" },\n { module: root, name: \"format:check\", script: \"oxfmt --check\" },\n ],\n};\n\nexport default oxc;\n","export default {\n filename: \"tools/oxlint/anti-slop/package.json\",\n template: `{\n \"type\": \"module\"\n}`,\n};\n","export default {\n filename: \"tools/oxlint/anti-slop/README.md\",\n template: `# anti-slop\n\nOxlint rules that reject low-evidence TypeScript patterns, vendored from\n[dmmulroy/anti-slop](https://github.com/dmmulroy/anti-slop) at \\`6d538555cb15\\` (MIT, see LICENSE).\n\nUpstream ships these to be vendored rather than depended on, so these files are\nyours: read them, change the messages, delete the rules you disagree with.\n\n\\`.oxlintrc.json\\` registers the plugin and turns every rule on as an error.\nTurn one off there:\n\n\\`\\`\\`json\n{\n \"rules\": {\n \"anti-slop/no-runtime-typeof\": \"off\"\n }\n}\n\\`\\`\\`\n\nVendored shadcn components under \\`packages/ui/src/components\\` are exempt, since\nthey are upstream code you re-pull rather than write.\n`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport pluginPackageJson from \"./templates/plugin-package-json\";\nimport pluginReadme from \"./templates/plugin-readme\";\n\nconst plugin = \"tools/oxlint/anti-slop\";\n\n// Upstream publishes nothing to npm, and oxlint needs the directory marked ESM.\nconst antiSlop: Module = {\n templates: [pluginPackageJson, pluginReadme],\n staticFiles: [\n { src: \"anti-slop/static/LICENSE\", filename: `${plugin}/LICENSE` },\n { src: \"anti-slop/static/index.ts\", filename: `${plugin}/index.ts` },\n {\n src: \"anti-slop/static/rules/no-chained-type-assertions.ts\",\n filename: `${plugin}/rules/no-chained-type-assertions.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-conditional-empty-object-spread.ts\",\n filename: `${plugin}/rules/no-conditional-empty-object-spread.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-known-value-widening.ts\",\n filename: `${plugin}/rules/no-known-value-widening.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-module-mocking.ts\",\n filename: `${plugin}/rules/no-module-mocking.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-object-parameters.ts\",\n filename: `${plugin}/rules/no-object-parameters.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-reflect-apply.ts\",\n filename: `${plugin}/rules/no-reflect-apply.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-reflect-get.ts\",\n filename: `${plugin}/rules/no-reflect-get.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-runtime-typeof.ts\",\n filename: `${plugin}/rules/no-runtime-typeof.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-shape-in-symbol-names.ts\",\n filename: `${plugin}/rules/no-shape-in-symbol-names.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unknown-parameters.ts\",\n filename: `${plugin}/rules/no-unknown-parameters.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unknown-returns.ts\",\n filename: `${plugin}/rules/no-unknown-returns.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unknown-type-aliases.ts\",\n filename: `${plugin}/rules/no-unknown-type-aliases.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-unsafe-dictionary-type.ts\",\n filename: `${plugin}/rules/no-unsafe-dictionary-type.ts`,\n },\n {\n src: \"anti-slop/static/rules/no-widen-then-assert.ts\",\n filename: `${plugin}/rules/no-widen-then-assert.ts`,\n },\n {\n src: \"anti-slop/static/rules/require-safety-comment-for-type-assertion.ts\",\n filename: `${plugin}/rules/require-safety-comment-for-type-assertion.ts`,\n },\n {\n src: \"anti-slop/static/shared/dictionary-types.ts\",\n filename: `${plugin}/shared/dictionary-types.ts`,\n },\n {\n src: \"anti-slop/static/shared/lexical-type-parameters.ts\",\n filename: `${plugin}/shared/lexical-type-parameters.ts`,\n },\n {\n src: \"anti-slop/static/shared/reflect-method.ts\",\n filename: `${plugin}/shared/reflect-method.ts`,\n },\n ],\n packages: [\n {\n package: \"@oxlint/plugins\",\n module: \"\",\n version: versions[\"@oxlint/plugins\"],\n dev: true,\n },\n ],\n};\n\nexport default antiSlop;\n","export default {\n filename: \"packages/typescript-config/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/typescript-config\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"license\": \"MIT\",\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}`,\n};\n","export default {\n filename: \"packages/typescript-config/base.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/tsconfig\",\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"esModuleInterop\": true,\n \"incremental\": false,\n \"isolatedModules\": true,\n \"lib\": [\"es2022\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"NodeNext\",\n \"moduleDetection\": \"force\",\n \"moduleResolution\": \"NodeNext\",\n \"noUncheckedIndexedAccess\": true,\n \"resolveJsonModule\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\"\n }\n}`,\n};\n","export default {\n filename: \"packages/typescript-config/nextjs.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/tsconfig\",\n \"extends\": \"./base.json\",\n \"compilerOptions\": {\n \"plugins\": [{ \"name\": \"next\" }],\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"allowJs\": true,\n \"jsx\": \"preserve\",\n \"noEmit\": true\n }\n}`,\n};\n","export default {\n filename: \"packages/typescript-config/react-library.json\",\n template: `{\n \"$schema\": \"https://json.schemastore.org/tsconfig\",\n \"extends\": \"./base.json\",\n \"compilerOptions\": {\n \"jsx\": \"react-jsx\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\"\n }\n}`,\n};\n","import type { Module } from \"../types\";\nimport packageJson from \"./templates/package-json\";\nimport base from \"./templates/base\";\nimport nextjs from \"./templates/nextjs\";\nimport reactLibrary from \"./templates/react-library\";\n\nconst typescriptConfig: Module = {\n templates: [packageJson, base, nextjs, reactLibrary],\n};\n\nexport default typescriptConfig;\n","export default {\n filename: \"apps/api/jest.config.ts\",\n template: `import type { Config } from 'jest';\n\nexport default {\n moduleFileExtensions: ['js', 'json', 'ts'],\n rootDir: 'src',\n testRegex: '.*\\\\\\\\.spec\\\\\\\\.ts$',\n transform: {\n // Under nodenext ts-jest follows each package's \"type\", so it would emit\n // packages/db as ESM, which jest's CommonJS runtime can't require\n '^.+\\\\\\\\.(t|j)s$': ['ts-jest', { tsconfig: { module: 'commonjs' } }],\n },\n collectCoverageFrom: ['**/*.(t|j)s'],\n coverageDirectory: '../coverage',\n testEnvironment: 'node',\n moduleNameMapper: {\n '^@thallesp/nestjs-better-auth$': '<rootDir>/../__mocks__/@thallesp/nestjs-better-auth.js',\n },\n} satisfies Config;`,\n};\n","export default {\n filename: \"apps/api/test/jest-e2e.json\",\n template: `{\n \"moduleFileExtensions\": [\"js\", \"mjs\", \"json\", \"ts\"],\n \"rootDir\": \".\",\n \"testEnvironment\": \"node\",\n \"testRegex\": \".e2e-spec.ts$\",\n \"extensionsToTreatAsEsm\": [\".ts\"],\n \"transform\": {\n \"^.+\\\\\\\\.ts$\": [\"ts-jest\", { \"useESM\": true, \"tsconfig\": { \"module\": \"esnext\" } }]\n },\n \"transformIgnorePatterns\": [\"node_modules/(?!.*\\\\\\\\.mjs$)\"]\n}`,\n};\n","export default {\n filename: \"apps/api/test/app.e2e-spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { INestApplication } from '@nestjs/common';\nimport request from 'supertest';\nimport { App } from 'supertest/types';\nimport { AppModule } from './../src/app.module';\n\ndescribe('AppController (e2e)', () => {\n let app: INestApplication<App>;\n\n beforeEach(async () => {\n const moduleFixture: TestingModule = await Test.createTestingModule({\n imports: [AppModule],\n }).compile();\n\n app = moduleFixture.createNestApplication();\n await app.init();\n });\n\n it('/hello (GET)', () => {\n return request(app.getHttpServer())\n .get('/hello')\n .expect(200)\n .expect({ message: 'Hello from Nest' });\n });\n});`,\n};\n","export default {\n filename: \"apps/api/__mocks__/@thallesp/nestjs-better-auth.js\",\n template: `// Mock for @thallesp/nestjs-better-auth — ESM-only package, incompatible with ts-jest CJS mode\nconst noop = () => () => {};\n\nmodule.exports = {\n AllowAnonymous: noop,\n RequireAuth: noop,\n Session: noop,\n AuthGuard: class AuthGuard {},\n BetterAuthModule: { forRoot: noop, forRootAsync: noop },\n};\n`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport jestConfig from \"./templates/jest-config\";\nimport jestE2eConfig from \"./templates/jest-e2e-config\";\nimport e2eSpec from \"./templates/e2e-spec\";\nimport nestjsBetterAuthMock from \"./templates/nestjs-better-auth-mock\";\n\nconst testingJest: Module = {\n templates: [jestConfig, jestE2eConfig, e2eSpec, nestjsBetterAuthMock],\n packages: [\n { package: \"jest\", module: \"apps/api\", version: versions.jest, dev: true },\n {\n package: \"ts-jest\",\n module: \"apps/api\",\n version: versions[\"ts-jest\"],\n dev: true,\n },\n {\n package: \"@types/jest\",\n module: \"apps/api\",\n version: versions[\"@types/jest\"],\n dev: true,\n },\n ],\n scripts: [\n { module: \"apps/api\", name: \"test\", script: \"jest\" },\n { module: \"apps/api\", name: \"test:watch\", script: \"jest --watch\" },\n { module: \"apps/api\", name: \"test:cov\", script: \"jest --coverage\" },\n {\n module: \"apps/api\",\n name: \"test:debug\",\n script: \"node --inspect-brk node_modules/.bin/jest --runInBand\",\n },\n {\n module: \"apps/api\",\n name: \"test:e2e\",\n script: \"NODE_OPTIONS=--experimental-vm-modules jest --config ./test/jest-e2e.json\",\n },\n ],\n};\n\nexport default testingJest;\n","export default {\n filename: \"apps/api/vitest.config.mts\",\n template: `import swc from 'unplugin-swc';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n test: {\n globals: true,\n root: './',\n },\n plugins: [\n swc.vite({\n module: { type: 'es6' },\n }),\n ],\n});`,\n};\n","export default {\n filename: \"apps/api/vitest.config.e2e.mts\",\n template: `import swc from 'unplugin-swc';\nimport { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n test: {\n include: ['**/*.e2e-spec.ts'],\n globals: true,\n root: './',\n },\n plugins: [swc.vite()],\n});`,\n};\n","export default {\n filename: \"apps/api/test/app.e2e-spec.ts\",\n template: `import { describe, it, beforeEach } from 'vitest';\nimport { Test, TestingModule } from '@nestjs/testing';\nimport { INestApplication } from '@nestjs/common';\nimport request from 'supertest';\nimport { App } from 'supertest/types';\nimport { AppModule } from './../src/app.module';\n\ndescribe('AppController (e2e)', () => {\n let app: INestApplication<App>;\n\n beforeEach(async () => {\n const moduleFixture: TestingModule = await Test.createTestingModule({\n imports: [AppModule],\n }).compile();\n\n app = moduleFixture.createNestApplication();\n await app.init();\n });\n\n it('/hello (GET)', () => {\n return request(app.getHttpServer())\n .get('/hello')\n .expect(200)\n .expect({ message: 'Hello from Nest' });\n });\n});`,\n};\n","import type { Module } from \"../types\";\nimport { versions } from \"../versions\";\nimport vitestConfig from \"./templates/vitest-config\";\nimport vitestConfigE2e from \"./templates/vitest-config-e2e\";\nimport e2eSpec from \"./templates/e2e-spec\";\n\nconst testingVitest: Module = {\n templates: [vitestConfig, vitestConfigE2e, e2eSpec],\n packages: [\n {\n package: \"vitest\",\n module: \"apps/api\",\n version: versions.vitest,\n dev: true,\n },\n {\n package: \"@vitest/coverage-v8\",\n module: \"apps/api\",\n version: versions[\"@vitest/coverage-v8\"],\n dev: true,\n },\n {\n package: \"unplugin-swc\",\n module: \"apps/api\",\n version: versions[\"unplugin-swc\"],\n dev: true,\n },\n {\n package: \"@swc/core\",\n module: \"apps/api\",\n version: versions[\"@swc/core\"],\n dev: true,\n },\n ],\n scripts: [\n { module: \"apps/api\", name: \"test\", script: \"vitest run\" },\n { module: \"apps/api\", name: \"test:watch\", script: \"vitest\" },\n { module: \"apps/api\", name: \"test:cov\", script: \"vitest run --coverage\" },\n {\n module: \"apps/api\",\n name: \"test:debug\",\n script: \"vitest --inspect-brk --inspect --logHeapUsage --threads=false\",\n },\n {\n module: \"apps/api\",\n name: \"test:e2e\",\n script: \"vitest run --config ./vitest.config.e2e.mts\",\n },\n ],\n};\n\nexport default testingVitest;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"Dockerfile\",\n template: `FROM node:24-alpine AS base\nENV PNPM_HOME=\"/pnpm\"\nENV PATH=\"$PNPM_HOME:$PATH\"\nRUN corepack enable\n\nFROM base AS build\nWORKDIR /app\nCOPY . .\nRUN pnpm install --frozen-lockfile\nARG API_HOST=localhost\nENV API_HOST=$API_HOST\nRUN pnpm build --filter=web --filter=api --filter=@<%= projectName %>/auth\n\n# --- web ---\nFROM base AS web\nWORKDIR /app\nENV NODE_ENV=production\nCOPY --from=build /app/apps/web/.next/standalone ./\nCOPY --from=build /app/apps/web/.next/static ./apps/web/.next/static\nCOPY --from=build /app/apps/web/public ./apps/web/public\nEXPOSE 3000\nCMD [\"node\", \"apps/web/server.js\"]\n\n# --- api ---\nFROM build AS api\nWORKDIR /app/apps/api\nENV NODE_ENV=production\nEXPOSE 3001\nCMD [\"node\", \"dist/main\"]\n\n# --- migrate ---\nFROM build AS migrate\nWORKDIR /app\nCMD [\"pnpm\", \"db:migrate\"]`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"docker-compose.yml\",\n template: `x-app-env: &app-env\n BETTER_AUTH_SECRET: \\${BETTER_AUTH_SECRET}\n # Better Auth trusts this origin; without it every deployment falls back to\n # localhost:3000 and rejects requests from the real one.\n BETTER_AUTH_URL: \\${BETTER_AUTH_URL:-http://localhost:3000}\n<% if (database === 'postgres') { %> DATABASE_URL: postgresql://postgres:\\${POSTGRES_PASSWORD:-postgres}@db:5432/postgres\n<% } else { %> DATABASE_URL: /data/app.db\n<% } %>\nservices:\n web:\n build:\n context: .\n target: web\n args:\n - API_HOST=api\n ports:\n - \"3000:3000\"\n environment:\n <<: *app-env\n<% if (database === 'sqlite') { %> volumes:\n - db_data:/data\n<% } -%>\n depends_on:\n - api\n\n migrate:\n build:\n context: .\n target: migrate\n environment:\n <<: *app-env\n<% if (database === 'postgres') { %> depends_on:\n db:\n condition: service_healthy\n<% } else { %> volumes:\n - db_data:/data\n<% } -%>\n restart: \"no\"\n\n api:\n build:\n context: .\n target: api\n ports:\n - \"3001:3001\"\n environment:\n <<: *app-env\n<% if (database === 'sqlite') { %> volumes:\n - db_data:/data\n<% } -%>\n depends_on:\n<% if (database === 'postgres') { %> db:\n condition: service_healthy\n<% } -%>\n migrate:\n condition: service_completed_successfully\n\n<% if (database === 'postgres') { %> db:\n image: postgres:17-alpine\n ports:\n - \"5432:5432\"\n environment:\n - POSTGRES_PASSWORD=\\${POSTGRES_PASSWORD:-postgres}\n volumes:\n - db_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n<% } -%>\nvolumes:\n db_data:`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n output: \"standalone\",\n async rewrites() {\n return [\n {\n source: '/api/:path*',\n destination: \\`http://\\${process.env.API_HOST ?? 'localhost'}:3001/api/:path*\\`,\n },\n ];\n },\n};\n\nexport default nextConfig;`,\n};\n","export default {\n filename: \"turbo.json\",\n template: `{\n \"$schema\": \"https://turborepo.dev/schema.json\",\n \"ui\": \"tui\",\n \"tasks\": {\n \"build\": {\n \"dependsOn\": [\"^build\"],\n \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n \"env\": [\"API_HOST\", \"DATABASE_URL\"],\n \"outputs\": [\".next/**\", \"!.next/cache/**\", \"dist/**\"]\n },\n \"typecheck\": {\n \"dependsOn\": [\"^build\"]\n },<% if (linter !== \"oxc\") { %>\n \"lint\": {\n \"dependsOn\": [\"^lint\"],\n \"env\": [\"NODE_ENV\"]\n },\n \"lint:check\": {\n \"dependsOn\": [\"^lint:check\"],\n \"env\": [\"NODE_ENV\"]\n },<% } %>\n \"test\": {\n \"dependsOn\": [\"^build\"]\n },\n \"dev\": {\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false,\n \"persistent\": true\n },\n \"migrate\": {\n \"env\": [\"DATABASE_URL\"],\n \"dependsOn\": [\"^migrate\"],\n \"cache\": false\n },\n \"generate\": {\n \"env\": [\"DATABASE_URL\"],\n \"cache\": false\n }\n }\n}`,\n};\n","import type { Module } from \"../types\";\nimport dockerfile from \"./templates/dockerfile\";\nimport dockerCompose from \"./templates/docker-compose\";\nimport nextConfig from \"./templates/next-config\";\nimport turboJson from \"./templates/turbo-json\";\n\nconst deploymentStandalone: Module = {\n templates: [dockerfile, dockerCompose, nextConfig, turboJson],\n};\n\nexport default deploymentStandalone;\n","export default {\n filename: \"apps/api/package.json\",\n template: `{\n \"name\": \"api\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"scripts\": {\n \"build\": \"nest build\",\n \"start\": \"nest start\",\n \"dev\": \"nest start --watch\",\n \"start:debug\": \"nest start --debug --watch\",\n \"start:prod\": \"node dist/main\"\n },\n \"dependencies\": {\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"@nestjs/platform-express\": \"<%= versions[\"@nestjs/platform-express\"] %>\",\n \"@nestjs/serve-static\": \"<%= versions[\"@nestjs/serve-static\"] %>\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@thallesp/nestjs-better-auth\": \"<%= versions[\"@thallesp/nestjs-better-auth\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"rxjs\": \"<%= versions.rxjs %>\"\n },\n \"devDependencies\": {\n \"@nestjs/cli\": \"<%= versions[\"@nestjs/cli\"] %>\",\n \"@nestjs/schematics\": \"<%= versions[\"@nestjs/schematics\"] %>\",\n \"@nestjs/testing\": \"<%= versions[\"@nestjs/testing\"] %>\",\n \"@types/express\": \"<%= versions[\"@types/express\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/supertest\": \"<%= versions[\"@types/supertest\"] %>\",\n \"supertest\": \"<%= versions.supertest %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\nconst isProduction = process.env.NODE_ENV === 'production';\n\n// Static export in production — served by NestJS via ServeStaticModule.\n// rewrites() is incompatible with output: \"export\", so dev uses the proxy\n// and production uses the static files.\n/** @type {import('next').NextConfig} */\nconst nextConfig = isProduction\n ? { output: 'export' }\n : {\n async rewrites() {\n return [\n {\n source: '/api/:path*',\n destination: 'http://localhost:3001/api/:path*',\n },\n ];\n },\n };\n\nexport default nextConfig;`,\n};\n","import type { Module } from \"../types\";\nimport apiPackageJson from \"./templates/api-package-json\";\nimport webNextConfig from \"./templates/web-next-config\";\n\n// app.module.ts is not templated here: api-controllers and todo-example both\n// write that file and land after this module, so anything emitted here is\n// overwritten. Those templates add ServeStaticModule when deployment is 'spa'.\nconst singleProcessStaticExport: Module = {\n templates: [apiPackageJson, webNextConfig],\n};\n\nexport default singleProcessStaticExport;\n","export default {\n filename: \"apps/api/package.json\",\n template: `{\n \"name\": \"@<%= projectName %>/api\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"exports\": {\n \".\": \"./src/index.ts\"\n },\n \"scripts\": {\n \"build\": \"nest build\"\n },\n \"dependencies\": {\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@thallesp/nestjs-better-auth\": \"<%= versions[\"@thallesp/nestjs-better-auth\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"rxjs\": \"<%= versions.rxjs %>\"\n },\n \"devDependencies\": {\n \"@nestjs/cli\": \"<%= versions[\"@nestjs/cli\"] %>\",\n \"@nestjs/schematics\": \"<%= versions[\"@nestjs/schematics\"] %>\",\n \"@nestjs/testing\": \"<%= versions[\"@nestjs/testing\"] %>\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","export default {\n filename: \"apps/api/tsconfig.json\",\n template: `{\n \"compilerOptions\": {\n \"module\": \"nodenext\",\n \"moduleResolution\": \"nodenext\",\n \"resolvePackageJsonExports\": true,\n \"esModuleInterop\": true,\n \"isolatedModules\": true,\n \"declaration\": true,\n \"removeComments\": true,\n \"emitDecoratorMetadata\": true,\n \"experimentalDecorators\": true,\n \"allowSyntheticDefaultImports\": true,\n \"target\": \"ES2023\",\n \"sourceMap\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"skipLibCheck\": true,\n \"strict\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noFallthroughCasesInSwitch\": false,\n \"types\": [<% if (testing === 'jest') { %>\"jest\", <% } %><% if (testing === 'vitest') { %>\"vitest/globals\", <% } %>\"node\"]\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.todoExample,\n filename: \"apps/api/src/index.ts\",\n template: `export { AppModule } from './app.module';\nexport { AppService } from './app.service';`,\n};\n","export default {\n filename: \"apps/web/lib/nest.ts\",\n template: `import 'reflect-metadata';\nimport { NestFactory } from '@nestjs/core';\nimport { AppModule } from '@<%= projectName %>/api';\nimport type { INestApplicationContext, Type, Abstract } from '@nestjs/common';\n\nlet context: INestApplicationContext | null = null;\n\nexport async function getContext(): Promise<INestApplicationContext> {\n if (!context) {\n context = await NestFactory.createApplicationContext(AppModule, {\n logger: false,\n });\n }\n return context;\n}\n\nexport async function inject<T>(token: Type<T> | Abstract<T> | string | symbol): Promise<T> {\n const ctx = await getContext();\n return ctx.get<T>(token);\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => !s.stylex,\n filename: \"apps/web/package.json\",\n template: `{\n \"name\": \"web\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --port 3000\",\n \"build\": \"next build\",\n \"start\": \"next start\"\n },\n \"dependencies\": {\n \"@<%= projectName %>/api\": \"workspace:*\",\n \"@<%= projectName %>/auth\": \"workspace:*\",\n \"@<%= projectName %>/db\": \"workspace:*\",\n \"@<%= projectName %>/ui\": \"workspace:*\",\n \"@nestjs/common\": \"<%= versions[\"@nestjs/common\"] %>\",\n \"@nestjs/core\": \"<%= versions[\"@nestjs/core\"] %>\",\n \"reflect-metadata\": \"<%= versions[\"reflect-metadata\"] %>\",\n \"@tailwindcss/postcss\": \"<%= versions[\"@tailwindcss/postcss\"] %>\",\n \"dotenv\": \"<%= versions.dotenv %>\",\n \"@tanstack/react-form\": \"<%= versions[\"@tanstack/react-form\"] %>\",\n \"@tanstack/react-query\": \"<%= versions[\"@tanstack/react-query\"] %>\",\n \"better-auth\": \"<%= versions[\"better-auth\"] %>\",\n \"next\": \"<%= versions.next %>\",\n \"react\": \"<%= versions.react %>\",\n \"react-dom\": \"<%= versions[\"react-dom\"] %>\",\n \"tailwindcss\": \"<%= versions.tailwindcss %>\"\n },\n \"devDependencies\": {\n \"@<%= projectName %>/typescript-config\": \"workspace:*\",\n \"@types/node\": \"<%= versions[\"@types/node\"] %>\",\n \"@types/react\": \"<%= versions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= versions[\"@types/react-dom\"] %>\",\n \"typescript\": \"<%= versions.typescript %>\"\n }\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment !== \"standalone\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n serverExternalPackages: [\n '@<%= projectName %>/api',\n '@<%= projectName %>/db',\n '@nestjs/core',\n '@nestjs/common',\n '@nestjs/microservices',\n '@nestjs/websockets',\n '@thallesp/nestjs-better-auth',\n 'reflect-metadata',\n 'express',\n ],\n};\n\nexport default nextConfig;`,\n};\n","export default {\n filename: \"apps/web/tsconfig.json\",\n template: `{\n \"extends\": \"@<%= projectName %>/typescript-config/nextjs.json\",\n \"compilerOptions\": {\n \"plugins\": [\n {\n \"name\": \"next\"\n }\n ],\n \"strictNullChecks\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true,\n \"paths\": {\n \"@/*\": [\"./*\"]\n }\n },\n \"include\": [\n \"**/*.ts\",\n \"**/*.tsx\",\n \"next-env.d.ts\",\n \"next.config.js\",\n \".next/types/**/*.ts\"\n ],\n \"exclude\": [\"node_modules\"]\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/hello/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { inject } from '@/lib/nest';\nimport { AppService } from '@<%= projectName %>/api';\n\nexport async function GET() {\n const appService = await inject(AppService);\n return NextResponse.json({ message: appService.getHello() });\n}`,\n};\n","import type { Module } from \"../types\";\nimport apiPackageJson from \"./templates/api-package-json\";\nimport apiTsconfig from \"./templates/api-tsconfig\";\nimport apiIndex from \"./templates/api-index\";\nimport webNestContext from \"./templates/web-nest-context\";\nimport webPackageJson from \"./templates/web-package-json\";\nimport webNextConfig from \"./templates/web-next-config\";\nimport webTsconfig from \"./templates/web-tsconfig\";\nimport webHelloRoute from \"./templates/web-hello-route\";\nconst nestDiOnly: Module = {\n templates: [\n apiPackageJson,\n apiTsconfig,\n apiIndex,\n webNestContext,\n webHelloRoute,\n webPackageJson,\n webNextConfig,\n webTsconfig,\n ],\n};\n\nexport default nestDiOnly;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.deployment === \"none\",\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n// No /api rewrite: there is no second process, so Next serves /api itself.\n/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nexport default nextConfig;`,\n};\n","export default {\n filename: \"apps/web/app/api/hello/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { auth } from '@<%= projectName %>/auth';\n\nexport async function GET() {\n const session = await auth.api.getSession({ headers: await headers() });\n return NextResponse.json({\n message: session?.user.name ? \\`Hello \\${session.user.name}\\` : 'Hello from Next',\n });\n}`,\n};\n","import type { Module } from \"../types\";\nimport webNextConfig from \"./templates/web-next-config\";\nimport webHelloRoute from \"./templates/web-hello-route\";\n\n// Everything apps/api used to supply, written straight into apps/web: the\n// /api/hello handler and a next.config with nothing to proxy to.\nconst nestOff: Module = {\n templates: [webNextConfig, webHelloRoute],\n};\n\nexport default nestOff;\n","export default {\n filename: \"Dockerfile\",\n template: `FROM node:24-alpine AS base\nENV PNPM_HOME=\"/pnpm\"\nENV PATH=\"$PNPM_HOME:$PATH\"\nRUN corepack enable\n\nFROM base AS build\nWORKDIR /app\nCOPY . .\nRUN pnpm install --frozen-lockfile\nRUN pnpm build --filter=web<% if (nest === 'di-only') { %> --filter=@<%= projectName %>/api<% } %> --filter=@<%= projectName %>/auth\n\n# --- web ---\n# One image: <% if (nest === 'di-only') { %>Nest is wired into the Next.js server rather than bootstrapped\n# on its own port<% } else { %>Next.js serves /api itself<% } %>, so there is no separate api stage.\nFROM base AS web\nWORKDIR /app\nENV NODE_ENV=production\nCOPY --from=build /app/apps/web/.next/standalone ./\nCOPY --from=build /app/apps/web/.next/static ./apps/web/.next/static\nCOPY --from=build /app/apps/web/public ./apps/web/public\nEXPOSE 3000\nCMD [\"node\", \"apps/web/server.js\"]\n\n# --- migrate ---\nFROM build AS migrate\nWORKDIR /app\nCMD [\"pnpm\", \"db:migrate\"]`,\n};\n","export default {\n filename: \"docker-compose.yml\",\n template: `x-app-env: &app-env\n BETTER_AUTH_SECRET: \\${BETTER_AUTH_SECRET}\n # Better Auth trusts this origin; without it every deployment falls back to\n # localhost:3000 and rejects requests from the real one.\n BETTER_AUTH_URL: \\${BETTER_AUTH_URL:-http://localhost:3000}\n<% if (database === 'postgres') { %> DATABASE_URL: postgresql://postgres:\\${POSTGRES_PASSWORD:-postgres}@db:5432/postgres\n<% } else { %> DATABASE_URL: /data/app.db\n<% } %>\nservices:\n web:\n build:\n context: .\n target: web\n ports:\n - \"3000:3000\"\n environment:\n <<: *app-env\n<% if (database === 'sqlite') { %> volumes:\n - db_data:/data\n<% } -%>\n depends_on:\n<% if (database === 'postgres') { %> db:\n condition: service_healthy\n<% } -%>\n migrate:\n condition: service_completed_successfully\n\n migrate:\n build:\n context: .\n target: migrate\n environment:\n <<: *app-env\n<% if (database === 'postgres') { %> depends_on:\n db:\n condition: service_healthy\n<% } else { %> volumes:\n - db_data:/data\n<% } -%>\n restart: \"no\"\n\n<% if (database === 'postgres') { %> db:\n image: postgres:17-alpine\n ports:\n - \"5432:5432\"\n environment:\n - POSTGRES_PASSWORD=\\${POSTGRES_PASSWORD:-postgres}\n volumes:\n - db_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n<% } -%>\nvolumes:\n db_data:`,\n};\n","export default {\n filename: \"apps/web/next.config.js\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\n// No /api rewrite: Next serves /api itself, so there is no api container to\n// proxy to.\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n output: \"standalone\",<% if (nest === 'di-only') { %>\n serverExternalPackages: [\n '@<%= projectName %>/api',\n '@<%= projectName %>/db',\n '@nestjs/core',\n '@nestjs/common',\n '@nestjs/microservices',\n '@nestjs/websockets',\n '@thallesp/nestjs-better-auth',\n 'reflect-metadata',\n 'express',\n ],<% } %>\n};\n\nexport default nextConfig;`,\n};\n","import type { Module } from \"../types\";\nimport dockerfile from \"./templates/dockerfile\";\nimport dockerCompose from \"./templates/docker-compose\";\nimport nextConfig from \"./templates/next-config\";\n\n// The standalone deployment for the two modes with no api container: di-only\n// runs Nest inside the Next.js process and off has no Nest at all. Composed\n// after nest-di-only and nest-off, which otherwise overwrite the standalone\n// next.config.js and drop `output: \"standalone\"`.\nconst deploymentStandaloneWeb: Module = {\n templates: [dockerfile, dockerCompose, nextConfig],\n};\n\nexport default deploymentStandaloneWeb;\n","export default {\n filename: \"apps/api/src/app.controller.ts\",\n template: `import { Controller, Get } from '@nestjs/common';\nimport {\n AllowAnonymous,\n Session,\n UserSession,\n} from '@thallesp/nestjs-better-auth';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @AllowAnonymous()\n @Get('hello')\n getHello(@Session() session: UserSession | null) {\n if (session?.user.name) {\n return { message: \\`Hello \\${session.user.name}\\` };\n }\n\n return { message: this.appService.getHello() };\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/app.controller.spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\ndescribe('AppController', () => {\n let appController: AppController;\n\n beforeEach(async () => {\n const app: TestingModule = await Test.createTestingModule({\n controllers: [AppController],\n providers: [AppService],\n }).compile();\n\n appController = app.get<AppController>(AppController);\n });\n\n it('should be defined', () => {\n expect(appController).toBeDefined();\n });\n});`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\" && !s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `<% if (deployment === 'spa') { %>import { join } from 'path';\n<% } %>import { Module } from '@nestjs/common';\n<% if (deployment === 'spa') { %>import { ServeStaticModule } from '@nestjs/serve-static';\n<% } %>import { AuthModule } from '@thallesp/nestjs-better-auth';\nimport { auth } from '@<%= projectName %>/auth';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\n@Module({\n<% if (deployment === 'spa') { %> imports: [\n // serves apps/web's static export; the api runs from apps/api\n ServeStaticModule.forRoot({\n rootPath: join(process.cwd(), '../web/out'),\n exclude: ['/api/{*splat}', '/{*path}.:ext'],\n }),\n AuthModule.forRoot({ auth }),\n ],\n<% } else { %> imports: [AuthModule.forRoot({ auth })],\n<% } -%>\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","export default {\n filename: \"apps/api/src/main.ts\",\n template: `import dotenv from 'dotenv';\nimport { resolve } from 'path';\n\n// Load root .env first, then local .env (local takes precedence)\ndotenv.config({ path: resolve(process.cwd(), '../../.env') });\ndotenv.config({ path: resolve(process.cwd(), '.env') });\n\nimport { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.create(AppModule, { bodyParser: false });\n app.setGlobalPrefix('api');\n app.enableCors({\n origin: process.env.CORS_ORIGIN ?? 'http://localhost:3000',\n credentials: true,\n });\n await app.listen(process.env.PORT ?? 3001);\n}\nvoid bootstrap();`,\n};\n","import type { Module } from \"../types\";\nimport appController from \"./templates/app-controller\";\nimport appControllerSpec from \"./templates/app-controller-spec\";\nimport appModule from \"./templates/app-module\";\nimport main from \"../api/templates/main\";\n\nconst apiControllers: Module = {\n templates: [appController, appControllerSpec, appModule, main],\n};\n\nexport default apiControllers;\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\",\n filename: \"apps/api/src/todos/todos.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { TodosService } from './todos.service';\n\n@Module({\n providers: [TodosService],\n exports: [TodosService],\n})\nexport class TodosModule {}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.service.ts\",\n template: `import { Injectable, NotFoundException } from '@nestjs/common';\nimport { randomUUID } from 'node:crypto';\nimport { db } from '@<%= projectName %>/db';\n\nexport interface Todo {\n id: string;\n title: string;\n done: boolean;\n createdAt: string;\n}\n\nconst columns = ['id', 'title', 'done', 'createdAt'] as const;\n\n@Injectable()\nexport class TodosService {\n async findAll(userId: string): Promise<Todo[]> {\n const rows = await db\n .selectFrom('todo')\n .select(columns)\n .where('userId', '=', userId)\n .orderBy('createdAt desc')\n .execute();\n return rows.map((row) => ({ ...row, done: Boolean(row.done) }));\n }\n\n async create(userId: string, title: string): Promise<Todo> {\n const id = randomUUID();\n await db.insertInto('todo').values({ id, userId, title }).execute();\n const row = await db\n .selectFrom('todo')\n .select(columns)\n .where('id', '=', id)\n .executeTakeFirstOrThrow();\n return { ...row, done: Boolean(row.done) };\n }\n\n async toggle(userId: string, id: string): Promise<Todo> {\n const current = await db\n .selectFrom('todo')\n .select('done')\n .where('id', '=', id)\n .where('userId', '=', userId)\n .executeTakeFirst();\n if (!current) throw new NotFoundException('Todo ' + id + ' not found');\n await db\n .updateTable('todo')\n .set({ done: current.done ? 0 : 1 })\n .where('id', '=', id)\n .where('userId', '=', userId)\n .execute();\n const row = await db\n .selectFrom('todo')\n .select(columns)\n .where('id', '=', id)\n .executeTakeFirstOrThrow();\n return { ...row, done: Boolean(row.done) };\n }\n\n async remove(userId: string, id: string): Promise<void> {\n const result = await db\n .deleteFrom('todo')\n .where('id', '=', id)\n .where('userId', '=', userId)\n .executeTakeFirst();\n if (!result.numDeletedRows) {\n throw new NotFoundException('Todo ' + id + ' not found');\n }\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.service.spec.ts\",\n template: `import { Test, TestingModule } from '@nestjs/testing';\nimport { TodosService } from './todos.service';\n\ndescribe('TodosService', () => {\n let service: TodosService;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [TodosService],\n }).compile();\n\n service = module.get<TodosService>(TodosService);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n});`,\n};\n","export default {\n filename: \"packages/db/src/schema.ts\",\n template: `import type { Generated } from \"kysely\";\n<% const date = database === 'postgres' ? 'Date' : 'string'; const bool = database === 'postgres' ? 'boolean' : 'number'; -%>\n\nexport interface TodoTable {\n id: string;\n userId: string;\n title: string;\n done: Generated<number>;\n createdAt: Generated<string>;\n}\n\nexport interface UserTable {\n id: string;\n name: string;\n email: string;\n emailVerified: <%= bool %>;\n image: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface SessionTable {\n id: string;\n expiresAt: <%= date %>;\n token: string;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n ipAddress: string | null;\n userAgent: string | null;\n userId: string;\n}\n\nexport interface AccountTable {\n id: string;\n issuer: string;\n accountId: string;\n providerId: string;\n userId: string;\n accessToken: string | null;\n refreshToken: string | null;\n idToken: string | null;\n accessTokenExpiresAt: <%= date %> | null;\n refreshTokenExpiresAt: <%= date %> | null;\n scope: string | null;\n password: string | null;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface VerificationTable {\n id: string;\n identifier: string;\n value: string;\n expiresAt: <%= date %>;\n createdAt: <%= date %>;\n updatedAt: <%= date %>;\n}\n\nexport interface DB {\n account: AccountTable;\n session: SessionTable;\n todo: TodoTable;\n user: UserTable;\n verification: VerificationTable;\n}`,\n};\n","export default {\n filename: \"packages/db/src/migrations/0001_create_todos.ts\",\n template: `import { Kysely, sql } from \"kysely\";\n\nexport async function up(db: Kysely<any>): Promise<void> {\n await db.schema\n .createTable(\"todo\")\n .addColumn(\"id\", \"text\", (c) => c.primaryKey())\n .addColumn(\"userId\", \"text\", (c) => c.notNull())\n .addColumn(\"title\", \"text\", (c) => c.notNull())\n .addColumn(\"done\", \"integer\", (c) => c.notNull().defaultTo(0))\n .addColumn(\"createdAt\", \"text\", (c) =>\n c.notNull().defaultTo(sql\\`CURRENT_TIMESTAMP\\`),\n )\n .execute();\n}\n\nexport async function down(db: Kysely<any>): Promise<void> {\n await db.schema.dropTable(\"todo\").execute();\n}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.controller.ts\",\n template: `import {\n Body,\n Controller,\n Delete,\n Get,\n Param,\n Patch,\n Post,\n} from '@nestjs/common';\nimport { Session } from '@thallesp/nestjs-better-auth';\nimport type { UserSession } from '@thallesp/nestjs-better-auth';\nimport { TodosService } from './todos.service';\n\n@Controller('todos')\nexport class TodosController {\n constructor(private readonly todosService: TodosService) {}\n\n @Get()\n findAll(@Session() session: UserSession) {\n return this.todosService.findAll(session.user.id);\n }\n\n @Post()\n create(@Session() session: UserSession, @Body('title') title: string) {\n return this.todosService.create(session.user.id, title);\n }\n\n @Patch(':id/toggle')\n toggle(@Session() session: UserSession, @Param('id') id: string) {\n return this.todosService.toggle(session.user.id, id);\n }\n\n @Delete(':id')\n remove(@Session() session: UserSession, @Param('id') id: string) {\n return this.todosService.remove(session.user.id, id);\n }\n}`,\n};\n","export default {\n filename: \"apps/api/src/todos/todos.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { TodosController } from './todos.controller';\nimport { TodosService } from './todos.service';\n\n@Module({\n controllers: [TodosController],\n providers: [TodosService],\n})\nexport class TodosModule {}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"on\" && s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `<% if (deployment === 'spa') { %>import { join } from 'path';\n<% } %>import { Module } from '@nestjs/common';\n<% if (deployment === 'spa') { %>import { ServeStaticModule } from '@nestjs/serve-static';\n<% } %>import { AuthModule } from '@thallesp/nestjs-better-auth';\nimport { auth } from '@<%= projectName %>/auth';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport { TodosModule } from './todos/todos.module';\n\n@Module({\n<% if (deployment === 'spa') { %> imports: [\n // serves apps/web's static export; the api runs from apps/api\n ServeStaticModule.forRoot({\n rootPath: join(process.cwd(), '../web/out'),\n exclude: ['/api/{*splat}', '/{*path}.:ext'],\n }),\n AuthModule.forRoot({ auth }),\n TodosModule,\n ],\n<% } else { %> imports: [AuthModule.forRoot({ auth }), TodosModule],\n<% } -%>\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.nest === \"di-only\" && s.todoExample,\n filename: \"apps/api/src/app.module.ts\",\n template: `import { Module } from '@nestjs/common';\nimport { AppService } from './app.service';\nimport { TodosModule } from './todos/todos.module';\n\n@Module({\n imports: [TodosModule],\n providers: [AppService],\n})\nexport class AppModule {}`,\n};\n","export default {\n filename: \"apps/api/src/index.ts\",\n template: `export { AppModule } from './app.module';\nexport { AppService } from './app.service';\nexport { TodosService } from './todos/todos.service';\nexport type { Todo } from './todos/todos.service';`,\n};\n","export default {\n filename: \"apps/web/app/api/todos/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { inject } from '@/lib/nest';\nimport { auth } from '@<%= projectName %>/auth';\nimport { TodosService } from '@<%= projectName %>/api';\n\nexport async function GET() {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const todos = await inject(TodosService);\n return NextResponse.json(await todos.findAll(session.user.id));\n}\n\nexport async function POST(req: Request) {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const { title } = await req.json();\n const todos = await inject(TodosService);\n return NextResponse.json(await todos.create(session.user.id, title), {\n status: 201,\n });\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/todos/[id]/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { inject } from '@/lib/nest';\nimport { auth } from '@<%= projectName %>/auth';\nimport { TodosService } from '@<%= projectName %>/api';\n\nexport async function DELETE(_req: Request, { params }: { params: Promise<{ id: string }> }) {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const { id } = await params;\n const todos = await inject(TodosService);\n await todos.remove(session.user.id, id);\n return new NextResponse(null, { status: 204 });\n}`,\n};\n","export default {\n filename: \"apps/web/app/api/todos/[id]/toggle/route.ts\",\n template: `import { NextResponse } from 'next/server';\nimport { headers } from 'next/headers';\nimport { inject } from '@/lib/nest';\nimport { auth } from '@<%= projectName %>/auth';\nimport { TodosService } from '@<%= projectName %>/api';\n\nexport async function PATCH(_req: Request, { params }: { params: Promise<{ id: string }> }) {\n const session = await auth.api.getSession({ headers: await headers() });\n if (!session) return new NextResponse('Unauthorized', { status: 401 });\n const { id } = await params;\n const todos = await inject(TodosService);\n return NextResponse.json(await todos.toggle(session.user.id, id));\n}`,\n};\n","export default {\n filename: \"apps/web/app/todo-list.tsx\",\n template: `'use client';\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useForm } from '@tanstack/react-form';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\n\ninterface Todo {\n id: string;\n title: string;\n done: boolean;\n}\n\nconst api = {\n getTodos: (): Promise<Todo[]> => fetch('/api/todos').then((r) => r.json()),\n createTodo: (title: string): Promise<Todo> =>\n fetch('/api/todos', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n }).then((r) => r.json()),\n toggleTodo: (id: string): Promise<Todo> =>\n fetch(\\`/api/todos/\\${id}/toggle\\`, { method: 'PATCH' }).then((r) => r.json()),\n deleteTodo: (id: string): Promise<void> =>\n fetch(\\`/api/todos/\\${id}\\`, { method: 'DELETE' }).then(() => undefined),\n};\n\nexport function TodoList({\n session,\n}: {\n session: { user: { email: string } };\n}) {\n const queryClient = useQueryClient();\n\n const { data: todos = [], isPending } = useQuery({\n queryKey: ['todos'],\n queryFn: api.getTodos,\n });\n\n const createMutation = useMutation({\n mutationFn: api.createTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const toggleMutation = useMutation({\n mutationFn: api.toggleTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const deleteMutation = useMutation({\n mutationFn: api.deleteTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const form = useForm({\n defaultValues: { title: '' },\n onSubmit: async ({ value }) => {\n if (!value.title.trim()) return;\n createMutation.mutate(value.title.trim());\n form.reset();\n },\n });\n\n return (\n <>\n <div className=\"flex items-center justify-between mb-8\">\n <h1 className=\"text-2xl font-semibold\">Todos</h1>\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\n <span>{session.user.email}</span>\n <button\n className=\"hover:text-gray-100\"\n onClick={() => authClient.signOut()}\n >\n Sign out\n </button>\n </div>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"flex gap-2 mb-6\"\n >\n <form.Field name=\"title\">\n {(field) => (\n <input\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"New todo…\"\n className=\"flex h-9 flex-1 rounded-md border border-neutral-700 bg-muted/50 px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-neutral-500 focus-visible:border-neutral-500 focus-visible:ring-2 focus-visible:ring-neutral-500/20\"\n />\n )}\n </form.Field>\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting || createMutation.isPending}>\n Add\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : (\n <ul className=\"divide-y divide-neutral-700\">\n {todos.map((todo) => (\n <li key={todo.id} className=\"flex items-center gap-3 py-3\">\n <input\n type=\"checkbox\"\n checked={todo.done}\n onChange={() => toggleMutation.mutate(todo.id)}\n />\n <span\n className={\\`flex-1 text-sm \\${todo.done ? 'line-through text-muted-foreground' : ''}\\`}\n >\n {todo.title}\n </span>\n <button\n onClick={() => deleteMutation.mutate(todo.id)}\n className=\"text-gray-600 hover:text-red-400 text-lg leading-none\"\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {!isPending && todos.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No todos yet.</p>\n )}\n </>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.todoExample && !s.shadcn && !s.stylex,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { TodoList } from '@/app/todo-list';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello', session?.user.id],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b\">\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto text-foreground\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">next.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </div>\n\n <div className=\"rounded-xl border p-6 space-y-1\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">nest.js</p>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 border rounded-md p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div className=\"rounded-xl border p-6\">\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground mb-4\">better-auth</p>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <TodoList session={session} />\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/todo-list.tsx\",\n template: `'use client';\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useForm } from '@tanstack/react-form';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { Input } from '@<%= projectName %>/ui/input';\nimport { Checkbox } from '@<%= projectName %>/ui/checkbox';\n\ninterface Todo {\n id: string;\n title: string;\n done: boolean;\n}\n\nconst api = {\n getTodos: (): Promise<Todo[]> => fetch('/api/todos').then((r) => r.json()),\n createTodo: (title: string): Promise<Todo> =>\n fetch('/api/todos', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n }).then((r) => r.json()),\n toggleTodo: (id: string): Promise<Todo> =>\n fetch(\\`/api/todos/\\${id}/toggle\\`, { method: 'PATCH' }).then((r) => r.json()),\n deleteTodo: (id: string): Promise<void> =>\n fetch(\\`/api/todos/\\${id}\\`, { method: 'DELETE' }).then(() => undefined),\n};\n\nexport function TodoList({\n session,\n}: {\n session: { user: { email: string } };\n}) {\n const queryClient = useQueryClient();\n\n const { data: todos = [], isPending } = useQuery({\n queryKey: ['todos'],\n queryFn: api.getTodos,\n });\n\n const createMutation = useMutation({\n mutationFn: api.createTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const toggleMutation = useMutation({\n mutationFn: api.toggleTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const deleteMutation = useMutation({\n mutationFn: api.deleteTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const form = useForm({\n defaultValues: { title: '' },\n onSubmit: async ({ value }) => {\n if (!value.title.trim()) return;\n createMutation.mutate(value.title.trim());\n form.reset();\n },\n });\n\n return (\n <>\n <div className=\"flex items-center justify-between mb-6\">\n <h1 className=\"text-2xl font-semibold\">Todos</h1>\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\n <span>{session.user.email}</span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => authClient.signOut()}\n >\n Sign out\n </Button>\n </div>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n className=\"flex gap-2 mb-6\"\n >\n <form.Field name=\"title\">\n {(field) => (\n <Input\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"New todo…\"\n className=\"flex-1\"\n />\n )}\n </form.Field>\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting || createMutation.isPending}>\n Add\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : (\n <ul className=\"divide-y divide-border\">\n {todos.map((todo) => (\n <li key={todo.id} className=\"flex items-center gap-3 py-3\">\n <Checkbox\n checked={todo.done}\n onCheckedChange={() => toggleMutation.mutate(todo.id)}\n />\n <span\n className={\\`flex-1 text-sm \\${todo.done ? 'line-through text-muted-foreground' : ''}\\`}\n >\n {todo.title}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => deleteMutation.mutate(todo.id)}\n >\n ×\n </Button>\n </li>\n ))}\n </ul>\n )}\n\n {!isPending && todos.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No todos yet.</p>\n )}\n </>\n );\n}`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.todoExample && s.shadcn,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { TodoList } from '@/app/todo-list';\nimport { ModeToggle } from '@<%= projectName %>/ui/mode-toggle';\nimport { Card, CardContent, CardHeader } from '@<%= projectName %>/ui/card';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello', session?.user.id],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main className=\"max-w-lg mx-auto min-h-full px-4 py-8 space-y-4\">\n <div className=\"pb-4 border-b flex items-start justify-between\">\n <div>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/page.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Delete me to get started!</p>\n </div>\n <ModeToggle />\n </div>\n\n <div className=\"flex items-center gap-3 py-2\">\n <Logo className=\"w-10 h-auto\" />\n <div>\n <h1 className=\"text-4xl font-black tracking-tight\"><%= projectName %></h1>\n <p className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <Card>\n <CardHeader>\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n next.js\n </p>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">apps/web/app/layout.tsx</p>\n <p className=\"text-sm text-muted-foreground\">Next.js rendering</p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n nest.js\n </p>\n </CardHeader>\n <CardContent>\n <p className=\"font-mono text-sm text-muted-foreground\">GET /api/hello</p>\n <pre className=\"mt-2 rounded-md border p-3 text-sm bg-muted/50\">\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <p className=\"text-xs font-mono uppercase tracking-widest text-muted-foreground\">\n better-auth\n </p>\n </CardHeader>\n <CardContent>\n {isPending ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : session ? (\n <TodoList session={session} />\n ) : (\n <AuthForm />\n )}\n </CardContent>\n </Card>\n\n <div className=\"px-2 py-4 text-sm\">\n <p className=\"mb-2 text-muted-foreground\">Learn more</p>\n <ul className=\"list-disc list-inside space-y-2 mt-2\">\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}`,\n};\n","export default {\n filename: \"apps/web/app/todo-list.tsx\",\n template: `'use client';\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useForm } from '@tanstack/react-form';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { Button } from '@<%= projectName %>/ui/button';\nimport { colors, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\ninterface Todo {\n id: string;\n title: string;\n done: boolean;\n}\n\nconst api = {\n getTodos: (): Promise<Todo[]> => fetch('/api/todos').then((r) => r.json()),\n createTodo: (title: string): Promise<Todo> =>\n fetch('/api/todos', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n }).then((r) => r.json()),\n toggleTodo: (id: string): Promise<Todo> =>\n fetch(\\`/api/todos/\\${id}/toggle\\`, { method: 'PATCH' }).then((r) => r.json()),\n deleteTodo: (id: string): Promise<void> =>\n fetch(\\`/api/todos/\\${id}\\`, { method: 'DELETE' }).then(() => undefined),\n};\n\nexport function TodoList({\n session,\n}: {\n session: { user: { email: string } };\n}) {\n const queryClient = useQueryClient();\n\n const { data: todos = [], isPending } = useQuery({\n queryKey: ['todos'],\n queryFn: api.getTodos,\n });\n\n const createMutation = useMutation({\n mutationFn: api.createTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const toggleMutation = useMutation({\n mutationFn: api.toggleTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const deleteMutation = useMutation({\n mutationFn: api.deleteTodo,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n });\n\n const form = useForm({\n defaultValues: { title: '' },\n onSubmit: async ({ value }) => {\n if (!value.title.trim()) return;\n createMutation.mutate(value.title.trim());\n form.reset();\n },\n });\n\n return (\n <>\n <div {...stylex.props(styles.header)}>\n <h1 {...stylex.props(styles.h1)}>Todos</h1>\n <div {...stylex.props(styles.session)}>\n <span>{session.user.email}</span>\n <button\n {...stylex.props(styles.signOut)}\n onClick={() => authClient.signOut()}\n >\n Sign out\n </button>\n </div>\n </div>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n form.handleSubmit();\n }}\n {...stylex.props(styles.form)}\n >\n <form.Field name=\"title\">\n {(field) => (\n <input\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"New todo…\"\n {...stylex.props(styles.input)}\n />\n )}\n </form.Field>\n\n <form.Subscribe selector={(s) => s.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting || createMutation.isPending}>\n Add\n </Button>\n )}\n </form.Subscribe>\n </form>\n\n {isPending ? (\n <p {...stylex.props(styles.muted)}>Loading…</p>\n ) : (\n <ul {...stylex.props(styles.list)}>\n {todos.map((todo) => (\n <li key={todo.id} {...stylex.props(styles.item)}>\n <input\n type=\"checkbox\"\n checked={todo.done}\n onChange={() => toggleMutation.mutate(todo.id)}\n />\n <span {...stylex.props(styles.title, todo.done && styles.titleDone)}>\n {todo.title}\n </span>\n <button\n onClick={() => deleteMutation.mutate(todo.id)}\n {...stylex.props(styles.remove)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {!isPending && todos.length === 0 && (\n <p {...stylex.props(styles.muted)}>No todos yet.</p>\n )}\n </>\n );\n}\n\nconst styles = stylex.create({\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '2rem',\n },\n h1: {\n fontSize: '1.5rem',\n fontWeight: 600,\n },\n session: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n fontSize: '0.875rem',\n color: colors.mutedForeground,\n },\n signOut: {\n color: {\n default: 'inherit',\n ':hover': colors.foreground,\n },\n backgroundColor: 'transparent',\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n fontFamily: 'inherit',\n fontSize: 'inherit',\n },\n form: {\n display: 'flex',\n gap: '0.5rem',\n marginBottom: '1.5rem',\n },\n input: {\n flexGrow: 1,\n height: 36,\n paddingBlock: '0.25rem',\n paddingInline: '0.75rem',\n fontFamily: 'inherit',\n fontSize: '0.875rem',\n color: colors.foreground,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: {\n default: colors.border,\n ':focus-visible': colors.mutedForeground,\n },\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n outlineStyle: 'none',\n transitionProperty: 'border-color',\n transitionDuration: '150ms',\n },\n list: {\n listStyleType: 'none',\n },\n item: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n paddingBlock: '0.75rem',\n borderTopColor: colors.border,\n borderTopStyle: 'solid',\n borderTopWidth: {\n default: 1,\n ':first-child': 0,\n },\n },\n title: {\n flexGrow: 1,\n fontSize: '0.875rem',\n },\n titleDone: {\n color: colors.mutedForeground,\n textDecorationLine: 'line-through',\n },\n remove: {\n color: {\n default: colors.mutedForeground,\n ':hover': colors.danger,\n },\n backgroundColor: 'transparent',\n borderStyle: 'none',\n cursor: 'pointer',\n padding: 0,\n fontSize: '1.125rem',\n lineHeight: 1,\n },\n muted: {\n fontSize: '0.875rem',\n color: colors.mutedForeground,\n },\n});\n`,\n};\n","import type { Selection } from \"../../types\";\nexport default {\n when: (s: Selection) => s.todoExample && s.stylex,\n filename: \"apps/web/app/page.tsx\",\n template: `'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport * as stylex from '@stylexjs/stylex';\nimport { authClient } from '@/lib/auth-client';\nimport { AuthForm } from '@/app/auth-form';\nimport { Link } from '@<%= projectName %>/ui/link';\nimport { Logo } from '@<%= projectName %>/ui/logo';\nimport { TodoList } from '@/app/todo-list';\nimport { colors, fonts, radii } from '@<%= projectName %>/ui/tokens.stylex';\n\nexport default function Home() {\n const { data: session, isPending } = authClient.useSession();\n\n const { data: hello } = useQuery({\n queryKey: ['hello', session?.user.id],\n queryFn: () => fetch('/api/hello').then((r) => r.json()),\n });\n\n return (\n <main {...stylex.props(styles.main)}>\n <div {...stylex.props(styles.header)}>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/page.tsx</p>\n <p {...stylex.props(styles.muted)}>Delete me to get started!</p>\n </div>\n\n <div {...stylex.props(styles.titleRow)}>\n <Logo style={styles.logo} />\n <div>\n <h1 {...stylex.props(styles.h1)}><%= projectName %></h1>\n <p {...stylex.props(styles.muted, styles.tagline)}>\n Next + Nest = Newt 💜\n </p>\n </div>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>next.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>apps/web/app/layout.tsx</p>\n <p {...stylex.props(styles.muted)}>Next.js rendering</p>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow)}>nest.js</p>\n <p {...stylex.props(styles.mono, styles.muted)}>GET /api/hello</p>\n <pre {...stylex.props(styles.pre)}>\n <code>{JSON.stringify(hello, null, 2)}</code>\n </pre>\n </div>\n\n <div {...stylex.props(styles.card)}>\n <p {...stylex.props(styles.eyebrow, styles.eyebrowSpaced)}>better-auth</p>\n {isPending ? (\n <p {...stylex.props(styles.muted)}>Loading…</p>\n ) : session ? (\n <TodoList session={session} />\n ) : (\n <AuthForm />\n )}\n </div>\n\n <div {...stylex.props(styles.footer)}>\n <p {...stylex.props(styles.muted)}>Learn more</p>\n <ul {...stylex.props(styles.list)}>\n <li>\n <Link href=\"https://newt-app.com\">Documentation</Link>\n </li>\n <li>\n <Link href=\"https://github.com/zeevo/newt-app\">GitHub</Link>\n </li>\n <li>\n <Link href=\"https://nextjs.org\">Next.js</Link>\n </li>\n <li>\n <Link href=\"https://nestjs.com\">NestJS</Link>\n </li>\n </ul>\n </div>\n </main>\n );\n}\n\nconst styles = stylex.create({\n main: {\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n maxWidth: '32rem',\n minHeight: '100%',\n marginInline: 'auto',\n paddingBlock: '2rem',\n paddingInline: '1rem',\n fontSize: '0.875rem',\n },\n header: {\n paddingBottom: '1rem',\n borderBottomColor: colors.border,\n borderBottomStyle: 'solid',\n borderBottomWidth: 1,\n },\n titleRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n paddingBlock: '0.5rem',\n },\n logo: {\n width: '2.5rem',\n height: 'auto',\n },\n h1: {\n fontSize: '2.25rem',\n fontWeight: 900,\n letterSpacing: '-0.025em',\n },\n tagline: {\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n },\n card: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n padding: '1.5rem',\n borderColor: colors.border,\n borderRadius: radii.lg,\n borderStyle: 'solid',\n borderWidth: 1,\n },\n eyebrow: {\n fontFamily: fonts.mono,\n fontSize: '0.75rem',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n color: colors.mutedForeground,\n },\n eyebrowSpaced: {\n marginBottom: '0.75rem',\n },\n pre: {\n marginTop: '0.5rem',\n padding: '0.75rem',\n fontFamily: fonts.mono,\n backgroundColor: 'oklch(0.269 0 0 / 0.5)',\n borderColor: colors.border,\n borderRadius: radii.sm,\n borderStyle: 'solid',\n borderWidth: 1,\n overflowX: 'auto',\n },\n footer: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n paddingBlock: '1rem',\n paddingInline: '0.5rem',\n },\n list: {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n listStylePosition: 'inside',\n listStyleType: 'disc',\n },\n mono: {\n fontFamily: fonts.mono,\n },\n muted: {\n color: colors.mutedForeground,\n },\n});\n`,\n};\n","import type { Module } from \"../types\";\nimport todosModule from \"./templates/todos-module\";\nimport todosService from \"./templates/todos-service\";\nimport todosServiceSpec from \"./templates/todos-service-spec\";\nimport dbSchema from \"./templates/db-schema\";\nimport dbMigrationTodos from \"./templates/db-migration-todos\";\nimport todosController from \"./templates/todos-controller\";\nimport todosModuleControllers from \"./templates/todos-module-controllers\";\nimport appModuleControllers from \"./templates/app-module-controllers\";\nimport appModuleDi from \"./templates/app-module-di\";\nimport apiIndex from \"./templates/api-index\";\nimport webTodosRoute from \"./templates/web-todos-route\";\nimport webTodosIdRoute from \"./templates/web-todos-id-route\";\nimport webTodosToggleRoute from \"./templates/web-todos-toggle-route\";\nimport webTodoList from \"./templates/web-todo-list\";\nimport webPage from \"./templates/web-page\";\nimport shadcnTodoList from \"./templates/shadcn-todo-list\";\nimport shadcnPage from \"./templates/shadcn-page\";\nimport stylexTodoList from \"./templates/stylex-todo-list\";\nimport stylexPage from \"./templates/stylex-page\";\n\n// Shared by every mode: the Kysely-backed todos service, its Nest module, and\n// the db schema + migration for the todo table.\nexport const todoExampleApi: Module = {\n templates: [todosModule, todosService, todosServiceSpec, dbSchema, dbMigrationTodos],\n};\n\n// api-controllers mode: REST controller plus app.module wired with TodosModule.\nexport const todoExampleControllers: Module = {\n templates: [todosController, todosModuleControllers, appModuleControllers],\n};\n\n// nest-di-only mode: Next.js route handlers plus app.module wired with TodosModule.\nexport const todoExampleDi: Module = {\n templates: [webTodosRoute, webTodosIdRoute, webTodosToggleRoute, appModuleDi, apiIndex],\n};\n\n// Web UI: TodoList component and the homepage that renders it.\nexport const todoExampleWeb: Module = {\n templates: [webTodoList, webPage],\n};\n\nexport const todoExampleShadcn: Module = {\n templates: [shadcnTodoList, shadcnPage],\n};\n\nexport const todoExampleStylex: Module = {\n templates: [stylexTodoList, stylexPage],\n};\n","import { fileURLToPath } from \"node:url\";\nimport root from \"./root/index\";\nimport web from \"./web/index\";\nimport api from \"./api/index\";\nimport auth from \"./auth/index\";\nimport { dbSqlite, dbPostgres } from \"./db/index\";\nimport ui from \"./ui/index\";\nimport shadcnUi from \"./shadcn-ui/index\";\nimport stylexUi from \"./stylex-ui/index\";\nimport eslintConfig from \"./eslint-config/index\";\nimport oxc from \"./oxc/index\";\nimport antiSlop from \"./anti-slop/index\";\nimport typescriptConfig from \"./typescript-config/index\";\nimport testingJest from \"./testing-jest/index\";\nimport testingVitest from \"./testing-vitest/index\";\nimport deploymentStandalone from \"./deployment-standalone/index\";\nimport deploymentSpa from \"./single-process-static-export/index\";\nimport nestDiOnlyModule from \"./nest-di-only/index\";\nimport nestOff from \"./nest-off/index\";\nimport deploymentStandaloneWeb from \"./deployment-standalone-web/index\";\nimport apiControllers from \"./api-controllers/index\";\nimport {\n todoExampleApi,\n todoExampleControllers,\n todoExampleDi,\n todoExampleWeb,\n todoExampleShadcn,\n todoExampleStylex,\n} from \"./todo-example/index\";\nimport type { Module, ModuleSelection } from \"./types\";\n\nexport * from \"./types\";\n\nexport const staticDir = new URL(\"./static/\", import.meta.url);\n\nexport const staticDirPath = fileURLToPath(staticDir);\n\nexport function getStaticFilePath(name: string): string {\n return fileURLToPath(new URL(`./static/${name}`, import.meta.url));\n}\n\nexport const templates = {\n root,\n web,\n api,\n auth,\n dbSqlite,\n dbPostgres,\n ui,\n shadcnUi,\n stylexUi,\n eslintConfig,\n oxc,\n antiSlop,\n typescriptConfig,\n testingJest,\n testingVitest,\n deploymentStandalone,\n deploymentSpa,\n nestDiOnly: nestDiOnlyModule,\n nestOff,\n deploymentStandaloneWeb,\n apiControllers,\n todoExampleApi,\n todoExampleControllers,\n todoExampleDi,\n todoExampleWeb,\n todoExampleShadcn,\n todoExampleStylex,\n};\n\nconst E2E_FILES = [\n \"apps/api/test/app.e2e-spec.ts\",\n \"apps/api/test/jest-e2e.json\",\n \"apps/api/vitest.config.e2e.mts\",\n];\n\n// The single source of truth for which modules a selection scaffolds. Kept here\n// rather than in the CLI so the render tests exercise the real selection.\nexport function selectModules(selection: ModuleSelection): Module[] {\n const { deployment, nest, todoExample, shadcn, stylex, database, linter, testing, extras } =\n selection;\n\n const deploymentModule =\n deployment === \"standalone\"\n ? deploymentStandalone\n : deployment === \"spa\"\n ? deploymentSpa\n : null;\n\n // In SPA mode NestJS serves Better Auth (AuthModule.forRoot); the Next.js\n // auth handler is redundant and can't be statically exported, so drop it.\n const webModule =\n deployment === \"spa\"\n ? {\n ...web,\n templates: web.templates.filter(\n (t) => t.filename !== \"apps/web/app/api/auth/[...all]/route.ts\",\n ),\n }\n : web;\n\n // Every testing config, script and dev dependency targets apps/api, so `off`\n // gets none of them. DI-only keeps the unit suite but drops the e2e one: its\n // Nest has no controllers of its own, so a suite booting apps/api has\n // nothing to hit.\n const selectedTesting = testing === \"vitest\" ? testingVitest : testingJest;\n const testingModule =\n nest === \"off\"\n ? null\n : nest === \"di-only\"\n ? {\n ...selectedTesting,\n templates: selectedTesting.templates.filter((t) => !E2E_FILES.includes(t.filename)),\n scripts: selectedTesting.scripts?.filter((s) => s.name !== \"test:e2e\"),\n }\n : selectedTesting;\n\n const nestModule =\n nest === \"di-only\" ? nestDiOnlyModule : nest === \"off\" ? nestOff : apiControllers;\n\n return [\n root,\n webModule,\n ...(nest === \"off\" ? [] : [api]),\n database === \"postgres\" ? dbPostgres : dbSqlite,\n auth,\n shadcn ? shadcnUi : stylex ? stylexUi : ui,\n linter === \"oxc\" ? oxc : eslintConfig,\n ...(extras.includes(\"anti-slop\") ? [antiSlop] : []),\n typescriptConfig,\n ...(testingModule ? [testingModule] : []),\n ...(deploymentModule ? [deploymentModule] : []),\n nestModule,\n // nest-di-only and nest-off both overwrite the standalone next.config.js\n // and leave the Dockerfile pointing at an api entrypoint neither emits\n ...(nest !== \"on\" && deployment === \"standalone\" ? [deploymentStandaloneWeb] : []),\n ...(todoExample\n ? [\n todoExampleApi,\n ...(nest === \"di-only\" ? [todoExampleDi] : [todoExampleControllers]),\n shadcn ? todoExampleShadcn : stylex ? todoExampleStylex : todoExampleWeb,\n ]\n : []),\n ];\n}\n","import ejs from \"ejs\";\nimport { existsSync, promises } from \"fs\";\nimport path from \"path\";\nimport type { Module, Package, Script, Selection, TemplateData } from \"./types.js\";\nimport { getStaticFilePath } from \"./templates\";\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\nfunction isMissingFile(cause: unknown): boolean {\n return cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\";\n}\n\nexport async function updatePackageJson(\n destDir: string,\n packages: Package[],\n templateData: TemplateData,\n) {\n for (const pkg of packages) {\n const renderedPackage = ejs.render(pkg.package, templateData);\n const packageJsonPath = path.join(destDir, pkg.module, \"package.json\");\n let packageJsonContent: string;\n\n try {\n packageJsonContent = await promises.readFile(packageJsonPath, \"utf8\");\n } catch (err: unknown) {\n if (isMissingFile(err)) {\n continue;\n }\n throw err;\n }\n\n const packageJson = JSON.parse(packageJsonContent);\n\n const dependencyKey = pkg.dev ? \"devDependencies\" : \"dependencies\";\n\n if (!packageJson[dependencyKey]) {\n packageJson[dependencyKey] = {};\n }\n\n packageJson[dependencyKey][renderedPackage] = pkg.version;\n\n await promises.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n}\n\nexport async function updateScripts(\n destDir: string,\n scripts: Script[],\n templateData: TemplateData,\n) {\n for (const script of scripts) {\n const renderedScript = ejs.render(script.script, templateData);\n\n const packageJsonPath = path.join(destDir, script.module, \"package.json\");\n\n let packageJsonContent: string;\n\n try {\n packageJsonContent = await promises.readFile(packageJsonPath, \"utf8\");\n } catch (err: unknown) {\n if (isMissingFile(err)) {\n continue;\n }\n throw err;\n }\n\n const packageJson = JSON.parse(packageJsonContent);\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n packageJson.scripts[script.name] = renderedScript;\n\n await promises.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n}\n\nexport async function renderTemplatesToDisk(\n basePackages: Module[],\n destDir: string,\n templateData: TemplateData,\n selection: Selection,\n) {\n await promises.mkdir(destDir, { recursive: true });\n\n await basePackages.reduce(async (prev, pkg) => {\n await prev;\n\n // `when` decides which template owns a file for these options; templates\n // that don't apply are skipped rather than overwritten by a later one.\n const applicable = pkg.templates.filter((template) => template.when?.(selection) ?? true);\n\n await applicable.reduce(async (prev, template) => {\n await prev;\n\n const destPath = path.join(destDir, template.filename);\n await promises.mkdir(path.dirname(destPath), { recursive: true });\n\n const output = await ejs.render(template.template, templateData);\n\n await promises.writeFile(destPath, output, \"utf8\");\n }, Promise.resolve());\n\n if (pkg.staticFiles) {\n await pkg.staticFiles.reduce(async (prev, staticFile) => {\n await prev;\n\n const destPath = path.join(destDir, staticFile.filename);\n const destDirPath = path.dirname(destPath);\n\n await promises.mkdir(destDirPath, { recursive: true });\n\n await promises.copyFile(getStaticFilePath(staticFile.src), destPath);\n }, Promise.resolve());\n }\n }, Promise.resolve());\n}\n\nconst DEP_FIELDS = [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"optionalDependencies\"];\n\nfunction sortByKey<T>(obj: Record<string, T>): Record<string, T> {\n return Object.fromEntries(\n Object.keys(obj)\n .sort()\n .map((key) => [key, obj[key]]),\n );\n}\n\n// Alphabetize scripts and dependency fields in every scaffolded package.json.\n// Module injection appends deps/scripts to the end, so without this they land\n// out of order.\nexport async function sortPackageJsons(destDir: string) {\n const nested = await Promise.all(\n [\"apps\", \"packages\"].map(async (base) => {\n const dir = path.join(destDir, base);\n try {\n const entries = await promises.readdir(dir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(dir, entry.name, \"package.json\"));\n } catch {\n return [];\n }\n }),\n );\n const files = [path.join(destDir, \"package.json\")].concat(...nested);\n\n await Promise.all(\n files.map(async (file) => {\n if (!existsSync(file)) return;\n const pkg = JSON.parse(await promises.readFile(file, \"utf8\"));\n if (pkg.scripts) pkg.scripts = sortByKey(pkg.scripts);\n DEP_FIELDS.forEach((field) => {\n if (pkg[field]) pkg[field] = sortByKey(pkg[field]);\n });\n await promises.writeFile(file, JSON.stringify(pkg, null, 2) + \"\\n\");\n }),\n );\n}\n\nexport function validateFlagValue(\n flag: string,\n value: string,\n allowed: readonly string[],\n): ValidationResult {\n if (allowed.includes(value)) {\n return { valid: true };\n }\n\n return {\n valid: false,\n error: `Invalid value \"${value}\" for ${flag}. Valid choices: ${allowed.join(\", \")}.`,\n };\n}\n\nexport function validateExtrasCombo(extras: readonly string[], linter: string): ValidationResult {\n if (extras.includes(\"anti-slop\") && linter !== \"oxc\") {\n return {\n valid: false,\n error:\n \"--extras anti-slop needs --linter oxc.\\n\" +\n \"anti-slop is a set of oxlint rules, and the eslint option installs neither oxlint\\n\" +\n \"nor a config to register them in. Add --linter oxc, or drop the extra.\",\n };\n }\n\n return { valid: true };\n}\n\nexport function validateStylingCombo(shadcn: boolean, stylex: boolean): ValidationResult {\n if (shadcn && stylex) {\n return {\n valid: false,\n error:\n \"--shadcn cannot be combined with --stylex.\\n\" +\n \"shadcn/ui components are written in Tailwind utility classes, which StyleX does\\n\" +\n \"not compile. Pick one styling system: drop --stylex for shadcn/ui, or drop\\n\" +\n \"--shadcn for StyleX.\",\n };\n }\n\n return { valid: true };\n}\n\nexport function validateDeploymentCombo(deployment: string, nest: string): ValidationResult {\n if (deployment === \"spa\" && nest === \"di-only\") {\n return {\n valid: false,\n error:\n \"--deployment spa cannot be combined with --nest di-only.\\n\" +\n \"SPA mode statically exports Next.js (output: 'export'), which cannot include the\\n\" +\n \"API route handlers that di-only mode depends on. Pick one: --nest on to get SPA\\n\" +\n \"mode with NestJS controllers, or drop --deployment spa.\",\n };\n }\n\n if (deployment === \"spa\" && nest === \"off\") {\n return {\n valid: false,\n error:\n \"--deployment spa cannot be combined with --nest off.\\n\" +\n \"SPA mode statically exports Next.js and hands the output to NestJS to serve, so\\n\" +\n \"there is nothing left to serve it. Pick one: --nest on, or drop --deployment spa.\",\n };\n }\n\n return { valid: true };\n}\n\nexport function validateExampleCombo(todoExample: boolean, nest: string): ValidationResult {\n if (todoExample && nest === \"off\") {\n return {\n valid: false,\n error:\n \"--include-example cannot be combined with --nest off.\\n\" +\n \"The todo example is a Nest module: an @Injectable service plus either a controller\\n\" +\n \"or a Next.js route handler that resolves it. Pick one: --nest on or --nest di-only,\\n\" +\n \"or drop --include-example.\",\n };\n }\n\n return { valid: true };\n}\n\nconst TOOL_HINTS = {\n pnpm: \"Install it with `npm install -g pnpm`, or run `corepack enable`.\",\n git: \"Install it from https://git-scm.com/downloads, or pass --no-git.\",\n} satisfies Record<string, string>;\n\n// Only the tools this run will actually shell out to: --no-install never\n// invokes pnpm and --no-git never invokes git, so requiring them there would\n// reject a scaffold that was going to succeed.\nexport async function checkRequiredTools(\n needs: { install: boolean; git: boolean },\n hasCommand: (command: string) => Promise<boolean>,\n): Promise<ValidationResult> {\n const required = [\n ...(needs.install ? ([\"pnpm\"] as const) : []),\n ...(needs.git ? ([\"git\"] as const) : []),\n ];\n\n const missing = (\n await Promise.all(required.map(async (tool) => ((await hasCommand(tool)) ? null : tool)))\n ).filter((tool) => tool !== null);\n\n if (missing.length === 0) return { valid: true };\n\n return {\n valid: false,\n error: missing.map((tool) => `${tool} was not found on PATH. ${TOOL_HINTS[tool]}`).join(\"\\n\"),\n };\n}\n\nexport function validateNodeVersion(current: string, requirement: string): ValidationResult {\n const parse = (value: string) => (value.match(/\\d+/g) ?? []).slice(0, 3).map(Number);\n const [major = 0, minor = 0, patch = 0] = parse(current);\n const [minMajor = 0, minMinor = 0, minPatch = 0] = parse(requirement);\n\n const satisfied =\n major !== minMajor\n ? major > minMajor\n : minor !== minMinor\n ? minor > minMinor\n : patch >= minPatch;\n\n if (satisfied) return { valid: true };\n\n return {\n valid: false,\n error: `Node ${requirement} is required, but this is ${current}.\\nUpgrade Node, or switch versions with a manager such as nvm or fnm.`,\n };\n}\n\n// The project name becomes the npm scope for every workspace package\n// (@name/db, @name/auth, @name/ui), so anything npm rejects breaks pnpm install.\n// Whatever is typed gets bent into that shape rather than refused.\nexport function normalizeProjectName(projectName: string): string {\n return projectName\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9\\-._~]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-._]+/, \"\")\n .replace(/-+$/, \"\")\n .slice(0, 214);\n}\n\nexport function validateProjectName(projectName: string): ValidationResult {\n if (!projectName) {\n return { valid: false, error: \"Project name is required\" };\n }\n\n const normalized = normalizeProjectName(projectName);\n\n if (!normalized) {\n return {\n valid: false,\n error: `\"${projectName}\" has nothing left after normalizing. Include a letter or a digit.`,\n };\n }\n\n const targetPath = path.resolve(process.cwd(), normalized);\n\n if (existsSync(targetPath)) {\n return { valid: false, error: `Directory \"${normalized}\" already exists` };\n }\n\n return { valid: true };\n}\n","import { randomBytes } from \"node:crypto\";\nimport { execa } from \"execa\";\nimport type { Module, Selection, TemplateData } from \"./templates\";\nimport { versions } from \"./templates/versions.js\";\nimport {\n renderTemplatesToDisk,\n sortPackageJsons,\n updatePackageJson,\n updateScripts,\n validateProjectName,\n} from \"./utils.js\";\n\nexport async function scaffold(\n modules: Module[],\n options: {\n name: string;\n testing: \"jest\" | \"vitest\";\n database: \"sqlite\" | \"postgres\";\n deployment: TemplateData[\"deployment\"];\n linter: TemplateData[\"linter\"];\n antiSlop: boolean;\n selection: Selection;\n },\n) {\n const validation = validateProjectName(options.name);\n if (!validation.valid) {\n console.error(`Error: ${validation.error}`);\n process.exit(1);\n }\n\n const templateData: TemplateData = {\n projectName: options.name,\n nest: options.selection.nest,\n testing: options.testing,\n database: options.database,\n deployment: options.deployment,\n linter: options.linter,\n antiSlop: options.antiSlop,\n shadcn: options.selection.shadcn,\n authSecret: randomBytes(32).toString(\"base64url\"),\n versions,\n };\n\n await renderTemplatesToDisk(modules, options.name, templateData, options.selection);\n\n const packages = modules\n .map((mod) => mod.packages)\n .filter((ele) => ele !== undefined)\n .flat();\n\n if (packages.length > 0) {\n await updatePackageJson(options.name, packages, templateData);\n }\n\n const scripts = modules\n .map((mod) => mod.scripts)\n .filter((ele) => ele !== undefined)\n .flat();\n\n if (scripts.length > 0) {\n await updateScripts(options.name, scripts, templateData);\n }\n\n await sortPackageJsons(options.name);\n}\n\n// execa throws ENOENT when the binary is not on PATH. Every tool we shell out\n// to answers --version, so this doubles as a liveness check.\nexport async function hasCommand(command: string) {\n try {\n await execa(command, [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function pnpmInstall(cwd: string) {\n return await execa(\"pnpm\", [\"install\"], {\n cwd,\n });\n}\n\nexport async function pnpmFormat(cwd: string) {\n return await execa(\"pnpm\", [\"format\"], {\n cwd,\n });\n}\n\nexport async function initGit(cwd: string) {\n await execa(\"git\", [\"init\"], {\n cwd,\n });\n\n await execa(\"git\", [\"add\", \".\"], {\n cwd,\n });\n\n await execa(\"git\", [\"commit\", \"-m\", \"Initial commit\"], {\n cwd,\n });\n}\n","import https from \"node:https\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport type { ModuleSelection } from \"./templates\";\n\n// Inlined by tsdown, and empty in every build but a release, so nothing else\n// can report a scaffold even if the opt-out logic were wrong.\n// turbo.json must list this under the build task or turbo strips it.\nconst ENDPOINT = process.env.NEWT_TELEMETRY_URL ?? \"\";\n\n// A real round trip to the edge measures ~110ms, and DNS or refused failures\n// return in about that too. Only a firewall that drops packets waits out the\n// full budget, and it does so on every run, so this is deliberately tight.\nconst SEND_TIMEOUT_MS = 1000;\n\nexport type TelemetryMode = \"interactive\" | \"flags\";\n\nexport type RunReport = {\n mode: TelemetryMode;\n explicitFlags: readonly string[];\n selection: ModuleSelection;\n};\n\nconst CI_PROVIDERS = [\n [\"GITHUB_ACTIONS\", \"github-actions\"],\n [\"GITLAB_CI\", \"gitlab-ci\"],\n [\"CIRCLECI\", \"circleci\"],\n [\"TRAVIS\", \"travis\"],\n [\"BUILDKITE\", \"buildkite\"],\n [\"JENKINS_URL\", \"jenkins\"],\n [\"TEAMCITY_VERSION\", \"teamcity\"],\n [\"CODEBUILD_BUILD_ID\", \"codebuild\"],\n [\"VERCEL\", \"vercel\"],\n [\"NETLIFY\", \"netlify\"],\n] as const;\n\nexport function detectCi(env: NodeJS.ProcessEnv = process.env): string {\n const named = CI_PROVIDERS.find(([key]) => env[key]);\n if (named) return named[1];\n return env.CI ? \"unknown\" : \"none\";\n}\n\n// DO_NOT_TRACK is the cross-tool convention from consoledonottrack.com, and is\n// checked first so the project-specific switches cannot re-enable past it.\nexport function isOptedOut(env: NodeJS.ProcessEnv = process.env): boolean {\n if (env.DO_NOT_TRACK === \"1\" || env.DO_NOT_TRACK?.toLowerCase() === \"true\") return true;\n if (env.NEWT_TELEMETRY_DISABLED === \"1\") return true;\n if (env.NEWT_TELEMETRY !== undefined) return env.NEWT_TELEMETRY !== \"1\";\n return false;\n}\n\nexport function isEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return Boolean(ENDPOINT) && !isOptedOut(env);\n}\n\nexport function nodeMajor(version: string = process.version): string {\n const match = /^v?(\\d+)/.exec(version);\n return match ? `v${match[1]}` : \"other\";\n}\n\nexport function buildPayload(report: RunReport) {\n const { selection } = report;\n return {\n cliVersion: pkg.version,\n nodeMajor: nodeMajor(),\n platform: process.platform,\n mode: report.mode,\n ci: detectCi(),\n // Sorted, so one set of flags is one value and not one per ordering.\n explicitFlags: [...report.explicitFlags].sort().join(\",\"),\n shadcn: selection.shadcn,\n stylex: selection.stylex,\n testing: selection.testing,\n database: selection.database,\n linter: selection.linter,\n deployment: selection.deployment,\n nest: selection.nest,\n todoExample: selection.todoExample,\n antiSlop: selection.extras.includes(\"anti-slop\"),\n };\n}\n\n// node:https rather than fetch: fetch's connect timeout cannot be configured\n// without pulling in undici, and its 10s default outlives an AbortSignal. On a\n// firewall that DROPs packets that leaves the CLI sitting there for nine\n// seconds after it has already printed \"Next steps\".\nfunction post(body: string): Promise<void> {\n return new Promise((resolve) => {\n try {\n const req = https.request(ENDPOINT, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"content-length\": Buffer.byteLength(body),\n },\n timeout: SEND_TIMEOUT_MS,\n });\n\n // Never unref this socket: an awaited promise does not hold the event\n // loop open, so the process would exit before the request completes.\n req.on(\"response\", (res) => {\n res.resume();\n res.on(\"end\", () => resolve());\n });\n req.on(\"timeout\", () => {\n req.destroy();\n resolve();\n });\n req.on(\"error\", () => resolve());\n req.end(body);\n } catch {\n resolve();\n }\n });\n}\n\n// Never rejects. Call only after the project exists, so a cancelled run sends nothing.\nexport async function reportRun(report: RunReport): Promise<void> {\n if (!isEnabled()) return;\n await post(JSON.stringify(buildPayload(report)));\n}\n","#!/usr/bin/env node\nimport { intro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport { selectModules, type Extra, type ModuleSelection, type Nest } from \"./templates\";\nimport { hasCommand, initGit, pnpmFormat, pnpmInstall, scaffold } from \"./tasks.js\";\nimport { reportRun } from \"./telemetry.js\";\nimport {\n checkRequiredTools,\n normalizeProjectName,\n validateDeploymentCombo,\n validateExampleCombo,\n validateExtrasCombo,\n validateStylingCombo,\n validateFlagValue,\n validateNodeVersion,\n validateProjectName,\n} from \"./utils.js\";\n\nconst TESTING_CHOICES = [\"jest\", \"vitest\"] as const;\nconst DATABASE_CHOICES = [\"sqlite\", \"postgres\"] as const;\nconst LINTER_CHOICES = [\"eslint\", \"oxc\"] as const;\nconst DEPLOYMENT_CHOICES = [\"none\", \"standalone\", \"spa\"] as const;\nconst NEST_CHOICES = [\"on\", \"off\", \"di-only\"] as const satisfies readonly Nest[];\nconst EXTRAS_CHOICES = [\"anti-slop\"] as const satisfies readonly Extra[];\n\ntype Testing = (typeof TESTING_CHOICES)[number];\ntype Database = (typeof DATABASE_CHOICES)[number];\ntype Linter = (typeof LINTER_CHOICES)[number];\ntype Deployment = (typeof DEPLOYMENT_CHOICES)[number];\n\ntype Answers = {\n name?: string;\n shadcn?: boolean;\n stylex?: boolean;\n testing?: Testing;\n database?: Database;\n linter?: Linter;\n deployment?: Deployment;\n nest?: Nest;\n todoExample?: boolean;\n extras?: Extra[];\n};\n\ntype Options = {\n name?: string;\n install: boolean;\n git: boolean;\n nonInteractive: boolean;\n shadcn: boolean;\n stylex: boolean;\n testing: Testing;\n database: Database;\n linter: Linter;\n deployment: Deployment;\n nest: Nest;\n includeExample: boolean;\n extras: readonly Extra[];\n explicitFlags: readonly string[];\n};\n\nclass TaskBuilder {\n tasks: p.Task[] = [];\n\n add(task: p.Task) {\n this.tasks.push(task);\n }\n}\n\nexport async function doInit(options: Options) {\n const groupOpts = {\n ...(!options.name && {\n name: () =>\n p.text({\n message: \"What is your project name?\",\n placeholder: \"my-newt-app\",\n validate: (value) => validateProjectName(value).error,\n }),\n }),\n ...(!options.nonInteractive && {\n shadcn: () =>\n p.confirm({\n message: \"Use shadcn/ui?\",\n initialValue: true,\n }),\n stylex: ({ results }) =>\n results.shadcn\n ? undefined\n : p.confirm({\n message: \"Use StyleX instead of Tailwind?\",\n initialValue: false,\n }),\n nest: () =>\n p.select<Nest>({\n message: \"NestJS?\",\n options: [\n { value: \"on\", label: \"On\", hint: \"apps/api on port 3001\" },\n {\n value: \"di-only\",\n label: \"DI only\",\n hint: \"no HTTP server; Next.js route handlers inject its services\",\n },\n { value: \"off\", label: \"Off\", hint: \"no apps/api; Next.js owns the backend\" },\n ],\n initialValue: \"on\",\n }),\n // Every testing config, script and dev dependency lands in apps/api,\n // which `off` never scaffolds.\n testing: ({ results }) =>\n results.nest === \"off\"\n ? undefined\n : p.select<Testing>({\n message: \"Testing framework?\",\n options: [\n { value: \"jest\", label: \"Jest\" },\n { value: \"vitest\", label: \"Vitest\" },\n ],\n initialValue: \"jest\",\n }),\n database: () =>\n p.select<Database>({\n message: \"Database?\",\n options: [\n { value: \"sqlite\", label: \"SQLite\" },\n { value: \"postgres\", label: \"Postgres\" },\n ],\n initialValue: \"sqlite\",\n }),\n linter: () =>\n p.select<Linter>({\n message: \"Linter and formatter?\",\n options: [\n { value: \"eslint\", label: \"ESLint + Prettier\" },\n { value: \"oxc\", label: \"oxlint + oxfmt\" },\n ],\n initialValue: \"eslint\",\n }),\n extras: ({ results }) =>\n results.linter === \"oxc\"\n ? p.multiselect<Extra>({\n message: \"Extras?\",\n options: [\n {\n value: \"anti-slop\",\n label: \"anti-slop\",\n hint: \"oxlint rules that reject low-evidence TypeScript\",\n },\n ],\n required: false,\n })\n : undefined,\n // The example is a Nest module either way: a service behind a controller,\n // or behind a route handler that injects it.\n todoExample: ({ results }) =>\n results.nest === \"off\"\n ? undefined\n : p.confirm({\n message: \"Include the todo example?\",\n initialValue: true,\n }),\n deployment: ({ results }) =>\n p.select<Deployment>({\n message: \"Deployment?\",\n options: [\n { value: \"none\", label: \"None\", hint: \"skip\" },\n {\n value: \"standalone\",\n label: \"Standalone + Dockerfile\",\n hint: \"Dockerfiles + docker-compose.yml\",\n },\n // SPA hands a static export to NestJS to serve, so it needs a Nest\n // with its own HTTP server: di-only has none, and off has no Nest\n ...(results.nest === \"on\"\n ? [\n {\n value: \"spa\" as const,\n label: \"SPA Mode\",\n hint: \"static export served by NestJS\",\n },\n ]\n : []),\n ],\n initialValue: \"none\",\n }),\n }),\n };\n\n try {\n // Before the prompts, and before anything is written: a missing tool used\n // to surface as a spawn error partway through, leaving a half-scaffolded\n // directory that the next run then refuses to overwrite.\n const preflight = [\n validateNodeVersion(process.version, pkg.engines.node),\n ...(options.name ? [validateProjectName(options.name)] : []),\n await checkRequiredTools({ install: options.install, git: options.git }, hasCommand),\n ].find((result) => !result.valid);\n\n if (preflight) {\n throw new Error(preflight.error);\n }\n\n const answers: Answers = await p.group(groupOpts, {\n onCancel: () => {\n console.log(\"Exiting.\");\n process.exit(0);\n },\n });\n\n const useShadcn = options.nonInteractive ? options.shadcn : (answers.shadcn ?? true);\n const useStylex = options.nonInteractive ? options.stylex : (answers.stylex ?? false);\n const testing: Testing = options.nonInteractive ? options.testing : (answers.testing ?? \"jest\");\n const database: Database = options.nonInteractive\n ? options.database\n : (answers.database ?? \"sqlite\");\n const linter: Linter = options.nonInteractive ? options.linter : (answers.linter ?? \"eslint\");\n const deployment: Deployment = options.nonInteractive\n ? options.deployment\n : (answers.deployment ?? \"none\");\n const nest: Nest = options.nonInteractive ? options.nest : (answers.nest ?? \"on\");\n const todoExample = options.nonInteractive\n ? options.includeExample\n : nest !== \"off\" && (answers.todoExample ?? true);\n const extras: readonly Extra[] = options.nonInteractive\n ? options.extras\n : (answers.extras ?? []);\n\n const stylingCombo = validateStylingCombo(useShadcn, useStylex);\n if (!stylingCombo.valid) {\n throw new Error(stylingCombo.error);\n }\n\n const deploymentCombo = validateDeploymentCombo(deployment, nest);\n if (!deploymentCombo.valid) {\n throw new Error(deploymentCombo.error);\n }\n\n const exampleCombo = validateExampleCombo(todoExample, nest);\n if (!exampleCombo.valid) {\n throw new Error(exampleCombo.error);\n }\n\n const extrasCombo = validateExtrasCombo(extras, linter);\n if (!extrasCombo.valid) {\n throw new Error(extrasCombo.error);\n }\n\n const selection: ModuleSelection = {\n deployment,\n nest,\n todoExample,\n shadcn: useShadcn,\n stylex: useStylex,\n database,\n linter,\n testing,\n extras,\n };\n\n const allModules = selectModules(selection);\n\n const rawName = answers.name ?? options.name ?? \"\";\n\n const nameCheck = validateProjectName(rawName);\n if (!nameCheck.valid) {\n throw new Error(nameCheck.error);\n }\n\n // Normalized here, not inside scaffold, so the directory, the package scope\n // and the \"cd\" line below can never disagree.\n const name = normalizeProjectName(rawName);\n\n const taskBuilder = new TaskBuilder();\n\n taskBuilder.add({\n title: \"Scaffolding project\",\n task: async () => {\n await scaffold(allModules, {\n name,\n testing,\n database,\n deployment,\n linter,\n antiSlop: extras.includes(\"anti-slop\"),\n selection,\n });\n return \"Scaffolded.\";\n },\n });\n\n if (options.install) {\n taskBuilder.add({\n title: \"Installing with pnpm\",\n task: async () => {\n await pnpmInstall(name);\n return \"Installed.\";\n },\n });\n\n taskBuilder.add({\n title: \"Formatting\",\n task: async () => {\n await pnpmFormat(name);\n return \"Formatted.\";\n },\n });\n }\n\n if (options.git) {\n taskBuilder.add({\n title: \"Initializing git\",\n task: async () => {\n await initGit(name);\n return \"Initialized git.\";\n },\n });\n }\n\n await p.tasks(taskBuilder.tasks);\n\n p.outro(`Done!`);\n\n console.log(\"Next steps:\");\n console.log();\n console.log(chalk.blue(` cd ${name}`));\n if (!options.install) {\n console.log(chalk.blue(` pnpm install`));\n console.log(chalk.blue(` pnpm format`));\n }\n console.log(chalk.blue(` pnpm dev`));\n console.log();\n\n await reportRun({\n mode: options.nonInteractive ? \"flags\" : \"interactive\",\n explicitFlags: options.explicitFlags,\n selection,\n });\n\n // A DNS lookup that never answers sits on the libuv threadpool, where\n // unref cannot reach it, so an unreachable endpoint would otherwise hold\n // the process open after the user already has their project.\n process.exit(0);\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n process.exit(1);\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"create-newt-app\")\n .version(pkg.version)\n .description(\"Create a new newt-app monorepo\")\n .argument(\"[name]\")\n .option(\"-ni, --no-install\", \"Skip pnpm install\", true)\n .option(\"-ng, --no-git\", \"Skip git initialization\", true)\n .option(\"--shadcn\", \"Include shadcn/ui\", false)\n .option(\"--stylex\", \"Use StyleX instead of Tailwind\", false)\n .option(\"--testing <framework>\", \"Testing framework: vitest or jest\", \"jest\")\n .option(\"--database <database>\", \"Database: sqlite or postgres\", \"sqlite\")\n .option(\"--linter <linter>\", \"Linter: eslint or oxc\", \"eslint\")\n .option(\"--deployment <strategy>\", \"Deployment: none, standalone, or spa\", \"none\")\n .option(\"--nest <mode>\", \"NestJS: on, off, or di-only\", \"on\")\n .option(\"--include-example\", \"Include the todo example\", false)\n .option(\"--extras <list>\", \"Extras, comma-separated: anti-slop\", \"\")\n .action(\n async (\n name: string,\n options: {\n install: boolean;\n git: boolean;\n shadcn: boolean;\n stylex: boolean;\n testing: string;\n database: string;\n linter: string;\n deployment: string;\n nest: string;\n includeExample: boolean;\n extras: string;\n },\n command: Command,\n ) => {\n intro(`Create a ${chalk.blue(\"newt\")} app.`);\n\n // Any explicitly passed config flag skips the prompts.\n const CONFIG_FLAGS = {\n shadcn: \"--shadcn\",\n stylex: \"--stylex\",\n testing: \"--testing\",\n database: \"--database\",\n linter: \"--linter\",\n deployment: \"--deployment\",\n nest: \"--nest\",\n includeExample: \"--include-example\",\n extras: \"--extras\",\n } as const;\n\n const explicitFlags = Object.entries(CONFIG_FLAGS)\n .filter(([option]) => command.getOptionValueSource(option) === \"cli\")\n .map(([, flag]) => flag);\n\n const nonInteractive = explicitFlags.length > 0;\n\n const extras = options.extras\n .split(\",\")\n .map((extra) => extra.trim())\n .filter(Boolean);\n\n // Reject typos instead of silently falling back to a default.\n const choices = [\n { flag: \"--testing\", value: options.testing, allowed: TESTING_CHOICES },\n {\n flag: \"--database\",\n value: options.database,\n allowed: DATABASE_CHOICES,\n },\n { flag: \"--linter\", value: options.linter, allowed: LINTER_CHOICES },\n {\n flag: \"--deployment\",\n value: options.deployment,\n allowed: DEPLOYMENT_CHOICES,\n },\n { flag: \"--nest\", value: options.nest, allowed: NEST_CHOICES },\n ...extras.map((extra) => ({\n flag: \"--extras\",\n value: extra,\n allowed: EXTRAS_CHOICES,\n })),\n ];\n\n const invalid = choices\n .map(({ flag, value, allowed }) => validateFlagValue(flag, value, allowed))\n .find((result) => !result.valid);\n\n if (invalid) {\n console.error(`Error: ${invalid.error}`);\n process.exit(1);\n }\n\n // SAFETY: validateFlagValue above rejected any value outside these choice\n // lists and exited, so each string is a member of its union.\n await doInit({\n name,\n install: options.install,\n git: options.git,\n nonInteractive,\n shadcn: options.shadcn,\n stylex: options.stylex,\n testing: options.testing as Testing,\n database: options.database as Database,\n linter: options.linter as Linter,\n deployment: options.deployment as Deployment,\n nest: options.nest as Nest,\n includeExample: options.includeExample,\n extras: extras as Extra[],\n explicitFlags,\n });\n },\n );\n\nprogram.parse();\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;EgEqFRA;EACAC;G/DzFF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;E+DwFRA;EACAC;G9D1FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E8DyFRA;EACAC;G7D3FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E6D0FRA;EACAC;G5D5FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E4D2FRA;EACAC;G3D7FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E2D4FRA;EACAC;G1D9FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;E0D6FRA;EACAC;GzD/FF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EyD8FRA;EACAC;GxDhGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EwD+FRA;EACAC;GvDjGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EuDgGRA;EACAC;GtDlGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EsDiGRA;EACAC;GrDnGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EqDkGRA;EACAC;GpDpGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EoDmGRA;EACAC;GnDrGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EmDoGRA;EACAC;GlDtGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EkDqGRA;EACAC;GjDvGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EiDsGRA;EACAC;GhDxGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;EgDuGRA;EACAC;G/CzGF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E+CwGRA;EACAC;G9C1GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E8CyGRA;EACAC;G7C3GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E6C0GRA;EACAC;G5C5GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E4C2GRA;EACAC;G3C7GF,UAAU;GACV,UAAU;;;;;;;E2C4GRA;EACAC;G1C9GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E0C6GRA;EACAC;GzC/GF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EyC8GRA;EACAC;GxChHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EwC+GRA;EACAC;GvCjHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EuCgHRA;EACAC;GtClHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EsCiHRA;EACAC;GrCnHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EqCkHRA;EACAC;GpCpHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EoCmHRA;EACAC;GnCrHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EmCoHRA;EACAC;GlCtHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;EkCqHRA;EACAC;GjCvHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EiCsHRA;EACAC;GhCxHF,UAAU;GACV,UAAU;;;;;;;;;;;EgCuHRA;EACAC;G/BzHF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E+BwHRA;EACAC;G9B1HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;E8ByHRA;EACAC;G7B3HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;E6B0HRA;EACAC;G5B5HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E4B2HRA;EACAC;G3B7HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E2B4HRA;EACAC;G1B9HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;E0B6HRA;EACAC;GzB/HF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EyB8HRA;EACAC;GxBhIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EwB+HRA;EACAC;GvBjIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EuBgIRA;EACAC;GtBlIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EsBiIRA;EACAC;GrBnIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EqBkIRA;EACAC;GpBpIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EoBmIRA;EACAC;GnBrIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;EmBoIRA;EACAC;GlBtIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EkBqIRA;EACAC;GjBvIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EiBsIRA;EACAC;GhBxIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;EgBuIRA;EACAC;GfzIF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EewIRA;EACAC;Gd1IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EcyIRA;EACAC;Gb3IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Ea0IRA;EACAC;GZ5IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EY2IRA;EACAC;GX7IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EW4IRA;EACAC;GV9IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;EU6IRA;EACAC;GT/IF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ES8IRA;EACAC;GRhJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EQ+IRA;EACAC;GPjJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EOgJRA;EACAC;GNlJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;EMiJRA;EACAC;GLnJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EKkJRA;EACAC;GJpJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EImJRA;EACAC;GHrJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EGoJRA;EACAC;GFtJF,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEqJRA;EACAC;GDvJF,UAAU;GACV,UA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"}