[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"projectName\": \"next-enterprise\",\n  \"projectOwner\": \"Blazity\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": true,\n  \"commitConvention\": \"angular\",\n  \"contributors\": [\n    {\n      \"login\": \"bmstefanski\",\n      \"name\": \"Bart Stefanski\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/28964599?v=4\",\n      \"profile\": \"https://bstefanski.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jjablonski-it\",\n      \"name\": \"Jakub Jabłoński\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/51968772?v=4\",\n      \"profile\": \"https://github.com/jjablonski-it\",\n      \"contributions\": [\n        \"infra\"\n      ]\n    },\n    {\n      \"login\": \"neg4n\",\n      \"name\": \"Igor Klepacki\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/57688858?v=4\",\n      \"profile\": \"https://neg4n.dev/\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7,\n  \"linkToUsage\": true,\n  \"commitType\": \"docs\"\n}\n"
  },
  {
    "path": ".github/nodejs.version",
    "content": "v24.3.0\n"
  },
  {
    "path": ".github/workflows/check.yml",
    "content": "name: Check\n\non:\n  push:\n    branches:\n      - main\n      - master\n      - develop\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  check:\n    name: Check\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - run: echo \"node_version=$(cat .github/nodejs.version)\" >> $GITHUB_ENV\n      - name: \"use node ${{ env.node_version }}\"\n        uses: actions/setup-node@v3\n        with:\n          node-version: \"${{ env.node_version }}\"\n\n      - name: \"Install pnpm & dependencies\"\n        uses: pnpm/action-setup@v4\n        with:\n          run_install: |\n            - recursive: true\n            - args: [--frozen-lockfile]\n\n      - name: Lint check\n        run: pnpm run lint\n      - name: Format check\n        run: pnpm run prettier\n      - name: Unit & Integration tests\n        run: pnpm run test\n      - name: Smoke & Acceptance tests\n        run: |\n          pnpm run build-storybook --quiet\n          pnpm playwright install\n          pnpm dlx concurrently -k -s first -n \"SB,TEST\" -c \"magenta,blue\" \\\n            \"pnpm dlx http-server storybook-static --port 6006 --silent\" \\\n            \"pnpm dlx wait-on tcp:127.0.0.1:6006 && pnpm run test-storybook\"\n"
  },
  {
    "path": ".github/workflows/nextjs_bundle_analysis.yml",
    "content": "name: \"Next.js Bundle Analysis\"\n\non:\n  push:\n    branches:\n      - main\n      - develop\n  pull_request:\n    branches:\n      - main\n      - develop\n  workflow_dispatch:\n\ndefaults:\n  run:\n    # change this if your nextjs app does not live at the root of the repo\n    working-directory: ./\n\njobs:\n  analyze:\n    env:\n      SKIP_ENV_VALIDATION: true\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Set up node\n        uses: actions/setup-node@v3\n        with:\n          node-version: \"20.x\"\n\n      - name: \"Install pnpm & dependencies\"\n        uses: pnpm/action-setup@v4\n        with:\n          run_install: |\n            - recursive: true\n            - args: [--frozen-lockfile]\n\n      # - name: Install dependencies\n      #   run: pnpm install --frozen-lockfile\n\n      - name: Restore next build\n        uses: actions/cache@v3\n        id: restore-build-cache\n        env:\n          cache-name: cache-next-build\n        with:\n          path: .next/cache\n          # change this if you prefer a more strict cache\n          key: ${{ runner.os }}-build-${{ env.cache-name }}\n\n      - name: Build next.js app\n        env:\n          SKIP_BUILD_PRODUCT_REDIRECTS: 1\n        # change this if your site requires a custom build command\n        run: pnpm build\n\n      # Here's the first place where next-bundle-analysis' own script is used\n      # This step pulls the raw bundle stats for the current bundle\n      - name: Analyze bundle\n        run: node report-bundle-size.js\n\n      - name: Upload bundle\n        uses: actions/upload-artifact@v4\n        with:\n          name: bundle\n          path: .next/analyze/__bundle_analysis.json\n\n      - name: Download base branch bundle stats\n        uses: dawidd6/action-download-artifact@v8\n        if: success() && github.event.number\n        with:\n          workflow: nextjs_bundle_analysis.yml\n          branch: ${{ github.event.pull_request.base.ref }}\n          path: .next/analyze/base\n\n      # And here's the second place - this runs after we have both the current and\n      # base branch bundle stats, and will compare them to determine what changed.\n      # There are two configurable arguments that come from package.json:\n      #\n      # - budget: optional, set a budget (bytes) against which size changes are measured\n      #           it's set to 350kb here by default, as informed by the following piece:\n      #           https://infrequently.org/2021/03/the-performance-inequality-gap/\n      #\n      # - red-status-percentage: sets the percent size increase where you get a red\n      #                          status indicator, defaults to 20%\n      #\n      # Either of these arguments can be changed or removed by editing the `nextBundleAnalysis`\n      # entry in your package.json file.\n      - name: Compare with base branch bundle\n        if: success() && github.event.number\n        run: ls -laR .next/analyze/base && npx -p nextjs-bundle-analysis compare\n\n      - name: Get comment body\n        id: get-comment-body\n        if: success() && github.event.number\n        uses: actions/github-script@v6\n        with:\n          result-encoding: string\n          script: |\n            const fs = require('fs')\n            const comment = fs.readFileSync('.next/analyze/__bundle_analysis_comment.txt', 'utf8')\n            core.setOutput('body', comment)\n\n      - name: Find Comment\n        uses: peter-evans/find-comment@v2\n        if: success() && github.event.number\n        id: fc\n        with:\n          issue-number: ${{ github.event.number }}\n          body-includes: \"<!-- __NEXTJS_BUNDLE -->\"\n\n      - name: Create Comment\n        uses: peter-evans/create-or-update-comment@v3\n        if: success() && github.event.number && steps.fc.outputs.comment-id == 0\n        with:\n          issue-number: ${{ github.event.number }}\n          body: ${{ steps.get-comment-body.outputs.body }}\n\n      - name: Update Comment\n        uses: peter-evans/create-or-update-comment@v3\n        if: success() && github.event.number && steps.fc.outputs.comment-id != 0\n        with:\n          issue-number: ${{ github.event.number }}\n          body: ${{ steps.get-comment-body.outputs.body }}\n          comment-id: ${{ steps.fc.outputs.comment-id }}\n          edit-mode: replace\n"
  },
  {
    "path": ".github/workflows/playwright.yml",
    "content": "name: Playwright Tests\non:\n  push:\n    branches:\n      - main\n      - master\n      - develop\n  pull_request: null\n  workflow_dispatch: null\njobs:\n  test:\n    timeout-minutes: 60\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - run: echo \"node_version=$(cat .github/nodejs.version)\" >> $GITHUB_ENV\n      - name: \"use node ${{ env.node_version }}\"\n        uses: actions/setup-node@v3\n        with:\n          node-version: \"${{ env.node_version }}\"\n\n      - name: \"Install pnpm & dependencies\"\n        uses: pnpm/action-setup@v4\n        with:\n          run_install: |\n            - recursive: true\n            - args: [--frozen-lockfile]\n\n      - name: Install Playwright Browsers\n        run: pnpm playwright install --with-deps\n\n      - name: Run Playwright tests\n        run: pnpm playwright test\n\n      - uses: actions/upload-artifact@v4\n        if: always()\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 30\n"
  },
  {
    "path": ".gitignore",
    "content": "# 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# testing\ncoverage\n\n# next.js\n.next/\nout/\nbuild\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# local env files\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\nstorybook-static/\n/test-results/\n/playwright-report/\n/playwright/.cache/\n\n/.npm-only-allow\n.pnpm-store/"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n  - repo: https://github.com/qoomon/git-conventional-commits\n    rev: v2.6.3\n    hooks:\n      - id: conventional-commits\n"
  },
  {
    "path": ".prettierignore",
    "content": ".next\nnode_modules"
  },
  {
    "path": ".releaserc",
    "content": "{\n  branches: [\"main\"],\n  \"plugins\":\n    [\n      [\"@semantic-release/npm\", { \"npmPublish\": false }],\n      \"@semantic-release/release-notes-generator\",\n      \"@semantic-release/github\",\n      \"@semantic-release/commit-analyzer\",\n      \"@semantic-release/git\",\n      \"@semantic-release/changelog\",\n    ],\n}\n"
  },
  {
    "path": ".storybook/main.ts",
    "content": "import type { StorybookConfig } from \"@storybook/nextjs\"\nconst config: StorybookConfig = {\n  stories: [\"../components/**/*.stories.mdx\", \"../components/**/*.stories.@(js|jsx|ts|tsx)\"],\n  addons: [\"@storybook/addon-links\", \"@storybook/addon-essentials\", \"@storybook/addon-interactions\"],\n  framework: {\n    name: \"@storybook/nextjs\",\n    options: {},\n  },\n  docs: {\n    autodocs: \"tag\",\n  },\n  typescript: {\n    check: false,\n    checkOptions: {},\n    reactDocgen: false,\n    reactDocgenTypescriptOptions: {\n      shouldExtractLiteralValuesFromEnum: true,\n      propFilter: (prop) => (prop.parent ? !/node_modules/.test(prop.parent.fileName) : true),\n    },\n  },\n}\nexport default config\n"
  },
  {
    "path": ".storybook/preview.ts",
    "content": "import type { Preview } from \"@storybook/react\"\n\nimport \"../styles/tailwind.css\"\n\nconst preview: Preview = {\n  parameters: {\n    actions: { argTypesRegex: \"^on[A-Z].*\" },\n    controls: {\n      matchers: {\n        color: /(background|color)$/i,\n        date: /Date$/,\n      },\n    },\n  },\n}\n\nexport default preview\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"tailwindCSS.experimental.classRegex\": [\n    [\"cva(?:<[^>]*>)?(([^)]*))\", \"[\\\"'`]([^\\\"'`]*).*?[\\\"'`]\", \"(?:twMerge|twJoin)\\\\(([^\\\\);]*)[\\\\);]\"]\n  ]\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Blazity\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "\n# [Next.js Enterprise Boilerplate](https://blazity.com/open-source/nextjs-enterprise-boilerplate) \n\nA production-ready template for building enterprise applications with Next.js. This boilerplate provides a solid foundation with carefully selected technologies and ready-to-go infrastructure to help you develop high-quality applications efficiently.\n\n## Motivation\n\nWhile most Next.js boilerplates focus on individual developer needs with excessive complexity, **next-enterprise** prioritizes strategic simplicity for enterprise teams. It offers a streamlined foundation with high-impact features that maximize developer productivity and accelerate time-to-market for business-critical applications.\n\n<a href=\"https://blazity.com/\">\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"/assets/blazity-logo-dark.svg\">\n  <source media=\"(prefers-color-scheme: light)\" srcset=\"/assets/blazity-logo-light.svg\">\n  <img alt=\"Logo\" align=\"right\" height=\"80\" src=\"/assets/blazity-logo-light.svg\">\n</picture>\n</a>\n\n> [!NOTE]\n> **Blazity** is a group of Next.js architects. We help organizations architect, optimize, and deploy high-performance Next.js applications at scale. Contact us at [contact@blazity.com](https://blazity.com) if you’d like to talk about your project.\n\n\n\n## Documentation\n\nThere is a separate documentation that explains its functionality, highlights core business values and technical decisions, provides guidelines for future development, and includes architectural diagrams.\n\nWe encourage you to [visit our docs (docs.blazity.com)](https://docs.blazity.com) to learn more\n\n## Integrated features\n\n### Boilerplate\nWith this template you will get all the boilerplate features included:\n\n* [Next.js 15](https://nextjs.org/) - Performance-optimized configuration using App Directory\n* [Tailwind CSS v4](https://tailwindcss.com/) - Utility-first CSS framework for efficient UI development\n* [ESlint 9](https://eslint.org/) and [Prettier](https://prettier.io/) - Code consistency and error prevention\n* [Corepack](https://github.com/nodejs/corepack) & [pnpm](https://pnpm.io/) as the package manager - For project management without compromises \n* [Strict TypeScript](https://www.typescriptlang.org/) - Enhanced type safety with carefully crafted config and [ts-reset](https://github.com/total-typescript/ts-reset) library\n* [GitHub Actions](https://github.com/features/actions) - Pre-configured workflows including bundle size and performance tracking\n* Perfect Lighthouse score - Optimized performance metrics\n* [Bundle analyzer](https://www.npmjs.com/package/@next/bundle-analyzer) - Monitor and manage bundle size during development\n* Testing suite - [Vitest](https://vitest.dev), [React Testing Library](https://testing-library.com/react), and [Playwright](https://playwright.dev/) for comprehensive testing\n* [Storybook](https://storybook.js.org/) - Component development and documentation\n* Advanced testing - Smoke and acceptance testing capabilities\n* [Conventional commits](https://www.conventionalcommits.org/) - Standardized commit history management\n* [Observability](https://opentelemetry.io/) - Open Telemetry integration\n* [Absolute imports](https://nextjs.org/docs/advanced-features/module-path-aliases) - Simplified import structure\n* [Health checks](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) - Kubernetes-compatible monitoring\n* [Radix UI](https://www.radix-ui.com/) - Headless components for customization\n* [CVA](http://cva.style/) (Class Variance Authority) - Consistent design system creation\n* [Renovate BOT](https://www.whitesourcesoftware.com/free-developer-tools/renovate) - Automated dependency and security updates\n* [Patch-package](https://www.npmjs.com/package/patch-package) - External dependency fixes without compromises\n* Component relationship tools - Graph for managing coupling and cohesion\n* [Semantic Release](https://github.com/semantic-release/semantic-release) - Automated changelog generation\n* [T3 Env](https://env.t3.gg/) - Streamlined environment variable management\n\n### Infrastructure & deployments\n\n#### Vercel\n\nEasily deploy your Next.js app with [Vercel](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=github&utm_campaign=next-enterprise) by clicking the button below:\n\n[![Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/Blazity/next-enterprise)\n\n#### Custom cloud infrastructure\n\n**next-enterprise** offers dedicated infrastructure as code (IaC) solutions built with Terraform, designed specifically for deploying Next.js applications based on our extensive experience working with enterprise clients.\n\nLearn more in our [documentation (docs.blazity.com)][docs] how to quickstart with the deployments using simple CLI.\n\n#### Available cloud providers and theirs features:\n\n* **AWS (Amazon Web Services)**\n  * Automated provisioning of AWS infrastructure\n  * Scalable & secure setup using:\n     * VPC - Isolated network infrastructure\n     * Elastic Container Service (ECS) - Container orchestration\n     * Elastic Container Registry (ECR) - Container image storage\n     * Application Load Balancer - Traffic distribution\n     * S3 + CloudFront - Static asset delivery and caching\n     * AWS WAF - Web Application Firewall protection\n     * Redis Cluster - Caching\n  * CI/CD ready - Continuous integration and deployment pipeline\n\n*... more coming soon*\n\n### Team & maintenance\n\n**next-enterprise** is backed and maintained by [Blazity](https://blazity.com), providing up to date security features and integrated feature updates.\n\n#### Active maintainers\n\n- Igor Klepacki ([neg4n](https://github.com/neg4n)) - Open Source Software Developer\n- Tomasz Czechowski ([tomaszczechowski](https://github.com/tomaszczechowski)) - Solutions Architect & DevOps\n- Jakub Jabłoński ([jjablonski-it](https://github.com/jjablonski-it)) - Head of Integrations\n\n#### All-time contributors\n[bmstefanski](https://github.com/bmstefanski)\n\n## License\n\nMIT\n\n\n[docs]: https://docs.blazity.com/next-enterprise/deployments/enterprise-cli\n"
  },
  {
    "path": "app/api/health/route.ts",
    "content": "export async function GET() {\n  return Response.json({ status: \"ok\" })\n}\n"
  },
  {
    "path": "app/layout.tsx",
    "content": "import \"styles/tailwind.css\"\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n  return (\n    <html lang=\"en\">\n      <body>{children}</body>\n    </html>\n  )\n}\n"
  },
  {
    "path": "app/page.tsx",
    "content": "import { Metadata } from \"next\"\nimport { Button } from \"components/Button/Button\"\n\nimport { LP_GRID_ITEMS } from \"lp-items\"\n\nexport const metadata: Metadata = {\n  title: \"Next.js Enterprise Boilerplate\",\n  twitter: {\n    card: \"summary_large_image\",\n  },\n  openGraph: {\n    url: \"https://next-enterprise.vercel.app/\",\n    images: [\n      {\n        width: 1200,\n        height: 630,\n        url: \"https://raw.githubusercontent.com/Blazity/next-enterprise/main/.github/assets/project-logo.png\",\n      },\n    ],\n  },\n}\n\nexport default function Web() {\n  return (\n    <>\n      <section className=\"bg-white dark:bg-gray-900\">\n        <div className=\"mx-auto grid max-w-(--breakpoint-xl) px-4 py-8 text-center lg:py-16\">\n          <div className=\"mx-auto place-self-center\">\n            <h1 className=\"mb-4 max-w-2xl text-4xl leading-none font-extrabold tracking-tight md:text-5xl xl:text-6xl dark:text-white\">\n              Next.js Enterprise Boilerplate\n            </h1>\n            <p className=\"mb-6 max-w-2xl font-light text-gray-500 md:text-lg lg:mb-8 lg:text-xl dark:text-gray-400\">\n              Jumpstart your enterprise project with our feature-packed, high-performance Next.js boilerplate!\n              Experience rapid UI development, AI-powered code reviews, and an extensive suite of tools for a smooth and\n              enjoyable development process.\n            </p>\n            <Button href=\"https://github.com/Blazity/next-enterprise\" className=\"mr-3\">\n              Get started\n            </Button>\n            <Button\n              href=\"https://vercel.com/new/git/external?repository-url=https://github.com/Blazity/next-enterprise\"\n              intent=\"secondary\"\n            >\n              Deploy Now\n            </Button>\n          </div>\n        </div>\n      </section>\n      <section className=\"bg-white dark:bg-gray-900\">\n        <div className=\"mx-auto max-w-(--breakpoint-xl) px-4 py-8 sm:py-16 lg:px-6\">\n          <div className=\"justify-center space-y-8 md:grid md:grid-cols-2 md:gap-12 md:space-y-0 lg:grid-cols-3\">\n            {LP_GRID_ITEMS.map((singleItem) => (\n              <div key={singleItem.title} className=\"flex flex-col items-center justify-center text-center\">\n                <div className=\"bg-primary-100 dark:bg-primary-900 mb-4 flex size-10 items-center justify-center rounded-full p-1.5 text-blue-700 lg:size-12\">\n                  {singleItem.icon}\n                </div>\n                <h3 className=\"mb-2 text-xl font-bold dark:text-white\">{singleItem.title}</h3>\n                <p className=\"text-gray-500 dark:text-gray-400\">{singleItem.description}</p>\n              </div>\n            ))}\n          </div>\n        </div>\n      </section>\n    </>\n  )\n}\n"
  },
  {
    "path": "components/Button/Button.stories.tsx",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\"\nimport { Button } from \"./Button\"\n\nconst meta: Meta<typeof Button> = {\n  title: \"Button\",\n  component: Button,\n  args: {\n    intent: \"primary\",\n    underline: false,\n    children: \"Button\",\n    size: \"lg\",\n  },\n  argTypes: {\n    intent: {\n      options: [\"primary\", \"secondary\"],\n      control: { type: \"select\" },\n    },\n    size: {\n      options: [\"sm\", \"lg\"],\n      control: { type: \"select\" },\n    },\n  },\n}\n\ntype Story = StoryObj<typeof Button>\n\nexport const Default: Story = {\n  render: (args) => <Button {...args} />,\n}\n\nexport default meta\n"
  },
  {
    "path": "components/Button/Button.test.tsx",
    "content": "import { render, screen } from \"@testing-library/react\"\nimport { describe, expect, it } from \"vitest\"\nimport { Button } from \"./Button\"\n\ndescribe(\"Button\", () => {\n  it(\"renders with children\", () => {\n    render(<Button href=\"/test\">Click me</Button>)\n    expect(screen.getByText(\"Click me\")).toBeInTheDocument()\n  })\n\n  it(\"applies correct intent classes\", () => {\n    const { container } = render(\n      <Button href=\"/test\" intent=\"secondary\">\n        Secondary\n      </Button>\n    )\n    const link = container.querySelector(\"a\")\n    expect(link).toHaveClass(\"bg-transparent\")\n    expect(link).toHaveClass(\"text-blue-400\")\n  })\n\n  it(\"applies correct size classes\", () => {\n    const { container } = render(\n      <Button href=\"/test\" size=\"sm\">\n        Small\n      </Button>\n    )\n    const link = container.querySelector(\"a\")\n    expect(link).toHaveClass(\"text-sm\")\n    expect(link).toHaveClass(\"min-w-20\")\n  })\n})\n"
  },
  {
    "path": "components/Button/Button.tsx",
    "content": "import { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { twMerge } from \"tailwind-merge\"\n\nconst button = cva(\n  [\n    \"justify-center\",\n    \"inline-flex\",\n    \"items-center\",\n    \"rounded-xl\",\n    \"text-center\",\n    \"border\",\n    \"border-blue-400\",\n    \"transition-colors\",\n    \"delay-50\",\n  ],\n  {\n    variants: {\n      intent: {\n        primary: [\"bg-blue-400\", \"text-white\", \"hover:enabled:bg-blue-700\"],\n        secondary: [\"bg-transparent\", \"text-blue-400\", \"hover:enabled:bg-blue-400\", \"hover:enabled:text-white\"],\n      },\n      size: {\n        sm: [\"min-w-20\", \"h-full\", \"min-h-10\", \"text-sm\", \"py-1.5\", \"px-4\"],\n        lg: [\"min-w-32\", \"h-full\", \"min-h-12\", \"text-lg\", \"py-2.5\", \"px-6\"],\n      },\n      underline: { true: [\"underline\"], false: [] },\n    },\n    defaultVariants: {\n      intent: \"primary\",\n      size: \"lg\",\n    },\n  }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLAnchorElement>, VariantProps<typeof button> {\n  underline?: boolean\n  href: string\n}\n\nexport function Button({ className, intent, size, underline, ...props }: ButtonProps) {\n  return (\n    <a className={twMerge(button({ intent, size, className, underline }))} {...props}>\n      {props.children}\n    </a>\n  )\n}\n"
  },
  {
    "path": "components/Tooltip/Tooltip.tsx",
    "content": "\"use client\"\n\nimport * as RadixTooltip from \"@radix-ui/react-tooltip\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport React from \"react\"\nimport { twMerge } from \"tailwind-merge\"\n\nconst tooltipContent = cva([], {\n  variants: {\n    intent: {\n      primary: [\"rounded-md\", \"bg-zinc-700\", \"font-sans\", \"text-white\"],\n    },\n    size: {\n      md: [\"px-4\", \"py-2.5\", \"text-xs\"],\n    },\n  },\n  defaultVariants: {\n    intent: \"primary\",\n    size: \"md\",\n  },\n})\n\nconst tooltipArrow = cva([], {\n  variants: {\n    intent: {\n      primary: [\"fill-zinc-700\"],\n    },\n    size: {\n      md: [\"w-4\", \"h-2\"],\n    },\n  },\n  defaultVariants: {\n    intent: \"primary\",\n    size: \"md\",\n  },\n})\n\nexport interface TooltipProps extends VariantProps<typeof tooltipContent>, RadixTooltip.TooltipProps {\n  explainer: React.ReactElement | string\n  children: React.ReactElement\n  className?: string\n  withArrow?: boolean\n  side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}\n\nexport function Tooltip({\n  children,\n  explainer,\n  open,\n  defaultOpen,\n  onOpenChange,\n  intent,\n  size,\n  side = \"top\",\n  className,\n  withArrow,\n}: TooltipProps) {\n  return (\n    <RadixTooltip.Provider>\n      <RadixTooltip.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange} delayDuration={200}>\n        <RadixTooltip.Trigger asChild>{children}</RadixTooltip.Trigger>\n        <RadixTooltip.Portal>\n          <RadixTooltip.Content\n            side={side}\n            sideOffset={5}\n            className={twMerge(tooltipContent({ intent, size, className }))}\n          >\n            {explainer}\n            {withArrow ? <RadixTooltip.Arrow className={twMerge(tooltipArrow({ intent, size, className }))} /> : null}\n          </RadixTooltip.Content>\n        </RadixTooltip.Portal>\n      </RadixTooltip.Root>\n    </RadixTooltip.Provider>\n  )\n}\n"
  },
  {
    "path": "e2e/example.spec.ts",
    "content": "import { expect, test } from \"@playwright/test\"\n\ntest(\"has title\", async ({ page }) => {\n  await page.goto(\"./\")\n\n  await expect(page).toHaveTitle(/Next.js Enterprise Boilerplate/)\n})\n"
  },
  {
    "path": "env.mjs",
    "content": "import { createEnv } from \"@t3-oss/env-nextjs\"\nimport { z } from \"zod\"\n\nexport const env = createEnv({\n  server: {\n    ANALYZE: z\n      .enum([\"true\", \"false\"])\n      .optional()\n      .transform((value) => value === \"true\"),\n  },\n  client: {},\n  runtimeEnv: {\n    ANALYZE: process.env.ANALYZE,\n  },\n})\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import * as fs from \"fs\"\n\n// https://github.com/francoismassart/eslint-plugin-tailwindcss/pull/381\n// import eslintPluginTailwindcss from \"eslint-plugin-tailwindcss\"\nimport eslintPluginImport from \"eslint-plugin-import\"\nimport eslintPluginNext from \"@next/eslint-plugin-next\"\nimport eslintPluginStorybook from \"eslint-plugin-storybook\"\nimport typescriptEslint from \"typescript-eslint\"\n\nconst eslintIgnore = [\n  \".git/\",\n  \".next/\",\n  \"node_modules/\",\n  \"dist/\",\n  \"build/\",\n  \"coverage/\",\n  \"*.min.js\",\n  \"*.config.js\",\n  \"*.d.ts\",\n]\n\nconst config = typescriptEslint.config(\n  {\n    ignores: eslintIgnore,\n  },\n  ...eslintPluginStorybook.configs[\"flat/recommended\"],\n  //  https://github.com/francoismassart/eslint-plugin-tailwindcss/pull/381\n  // ...eslintPluginTailwindcss.configs[\"flat/recommended\"],\n  typescriptEslint.configs.recommended,\n  eslintPluginImport.flatConfigs.recommended,\n  {\n    plugins: {\n      \"@next/next\": eslintPluginNext,\n    },\n    rules: {\n      ...eslintPluginNext.configs.recommended.rules,\n      ...eslintPluginNext.configs[\"core-web-vitals\"].rules,\n    },\n  },\n  {\n    settings: {\n      tailwindcss: {\n        callees: [\"classnames\", \"clsx\", \"ctl\", \"cn\", \"cva\"],\n      },\n\n      \"import/resolver\": {\n        typescript: true,\n        node: true,\n      },\n    },\n    rules: {\n      \"@typescript-eslint/no-unused-vars\": [\n        \"warn\",\n        {\n          argsIgnorePattern: \"^_\",\n          varsIgnorePattern: \"^_\",\n        },\n      ],\n      \"sort-imports\": [\n        \"error\",\n        {\n          ignoreCase: true,\n          ignoreDeclarationSort: true,\n        },\n      ],\n      \"import/order\": [\n        \"warn\",\n        {\n          groups: [\"external\", \"builtin\", \"internal\", \"sibling\", \"parent\", \"index\"],\n          pathGroups: [\n            ...getDirectoriesToSort().map((singleDir) => ({\n              pattern: `${singleDir}/**`,\n              group: \"internal\",\n            })),\n            {\n              pattern: \"env\",\n              group: \"internal\",\n            },\n            {\n              pattern: \"theme\",\n              group: \"internal\",\n            },\n            {\n              pattern: \"public/**\",\n              group: \"internal\",\n              position: \"after\",\n            },\n          ],\n          pathGroupsExcludedImportTypes: [\"internal\"],\n          alphabetize: {\n            order: \"asc\",\n            caseInsensitive: true,\n          },\n        },\n      ],\n    },\n  }\n)\n\nfunction getDirectoriesToSort() {\n  const ignoredSortingDirectories = [\".git\", \".next\", \".vscode\", \"node_modules\"]\n  return fs\n    .readdirSync(process.cwd())\n    .filter((file) => fs.statSync(process.cwd() + \"/\" + file).isDirectory())\n    .filter((f) => !ignoredSortingDirectories.includes(f))\n}\n\nexport default config\n"
  },
  {
    "path": "git-conventional-commits.yaml",
    "content": "---\nconvention:\n  commitTypes:\n  - feat\n  - fix\n  - perf\n  - refactor\n  - style\n  - test\n  - build\n  - ops\n  - docs\n  - chore\n  - merge\n  - revert\n  commitScopes: []\n  releaseTagGlobPattern: v[0-9]*.[0-9]*.[0-9]*\nchangelog:\n  commitTypes:\n  - feat\n  - fix\n  - perf\n  - merge\n  includeInvalidCommits: true\n  commitIgnoreRegexPattern: \"^WIP \"\n  headlines:\n    feat: Features\n    fix: Bug Fixes\n    perf: Performance Improvements\n    merge: Merges\n    breakingChange: BREAKING CHANGES\n\n  ## GitHub\n  # commitUrl: https://github.com/ACCOUNT/REPOSITORY/commit/%commit%\n  # commitRangeUrl: https://github.com/ACCOUNT/REPOSITORY/compare/%from%...%to%?diff=split\n\n  ## GitHub Issues\n  # issueRegexPattern: \"#[0-9]+\"\n  # issueUrl: https://github.com/ACCOUNT/REPOSITORY/issues/%issue%\n\n  ## Jira Issues\n  # issueRegexPattern: \"[A-Z][A-Z0-9]+-[0-9]+\"\n  # issueUrl: https://WORKSPACE.atlassian.net/browse/%issue%\n"
  },
  {
    "path": "instrumentation.ts",
    "content": "import { registerOTel } from \"@vercel/otel\"\n\nexport function register() {\n  registerOTel(\"next-app\")\n}\n"
  },
  {
    "path": "lp-items.tsx",
    "content": "export const LP_GRID_ITEMS = [\n  {\n    title: \"Next.js\",\n    description: \"Fast by default, with config optimized for performance.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M12 18v-5.25m0 0a6.01 6.01 0 001.5-.189m-1.5.189a6.01 6.01 0 01-1.5-.189m3.75 7.478a12.06 12.06 0 01-4.5 0m3.75 2.383a14.406 14.406 0 01-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 10-7.517 0c.85.493 1.509 1.333 1.509 2.316V18\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Tailwind CSS\",\n    description: \"A utility-first CSS framework for rapid UI development.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M4.5 12a7.5 7.5 0 0015 0m-15 0a7.5 7.5 0 1115 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077l1.41-.513m14.095-5.13l1.41-.513M5.106 17.785l1.15-.964m11.49-9.642l1.149-.964M7.501 19.795l.75-1.3m7.5-12.99l.75-1.3m-6.063 16.658l.26-1.477m2.605-14.772l.26-1.477m0 17.726l-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205L12 12m6.894 5.785l-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864l-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"ESlint & Prettier\",\n    description: \"For clean, consistent, and error-free code.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n      </svg>\n    ),\n  },\n  {\n    title: \"Extremely strict TypeScript\",\n    description: \"With `ts-reset` library for ultimate type safety.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Bundle analyzer plugin\",\n    description: \"Keep an eye on your bundle size.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Vitest & React Testing Library\",\n    description: \"For rock-solid unit and integration tests.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0112 15a9.065 9.065 0 00-6.23-.693L5 14.5m14.8.8l1.402 1.402c1.232 1.232.65 3.318-1.067 3.611A48.309 48.309 0 0112 21c-2.773 0-5.491-.235-8.135-.687-1.718-.293-2.3-2.379-1.067-3.61L5 14.5\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Playwright\",\n    description: \"Write end-to-end tests like a pro.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5M9 11.25v1.5M12 9v3.75m3-6v6\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Storybook\",\n    description: \"Create, test, and showcase your components.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Smoke Testing & Acceptance Tests\",\n    description: \"For confidence in your deployments.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Conventional commits git hook\",\n    description: \"Keep your commit history neat and tidy.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M6.75 7.5l3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0021 18V6a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 6v12a2.25 2.25 0 002.25 2.25z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Observability\",\n    description: \"Open Telemetry integration for seamless monitoring.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\"\n        />\n        <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n      </svg>\n    ),\n  },\n  {\n    title: \"Absolute imports\",\n    description: \"No more spaghetti imports.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Health checks\",\n    description: \"Kubernetes-compatible for robust deployments.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Radix UI\",\n    description: \"Headless UI components for endless customization.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M14.25 6.087c0-.355.186-.676.401-.959.221-.29.349-.634.349-1.003 0-1.036-1.007-1.875-2.25-1.875s-2.25.84-2.25 1.875c0 .369.128.713.349 1.003.215.283.401.604.401.959v0a.64.64 0 01-.657.643 48.39 48.39 0 01-4.163-.3c.186 1.613.293 3.25.315 4.907a.656.656 0 01-.658.663v0c-.355 0-.676-.186-.959-.401a1.647 1.647 0 00-1.003-.349c-1.036 0-1.875 1.007-1.875 2.25s.84 2.25 1.875 2.25c.369 0 .713-.128 1.003-.349.283-.215.604-.401.959-.401v0c.31 0 .555.26.532.57a48.039 48.039 0 01-.642 5.056c1.518.19 3.058.309 4.616.354a.64.64 0 00.657-.643v0c0-.355-.186-.676-.401-.959a1.647 1.647 0 01-.349-1.003c0-1.035 1.008-1.875 2.25-1.875 1.243 0 2.25.84 2.25 1.875 0 .369-.128.713-.349 1.003-.215.283-.4.604-.4.959v0c0 .333.277.599.61.58a48.1 48.1 0 005.427-.63 48.05 48.05 0 00.582-4.717.532.532 0 00-.533-.57v0c-.355 0-.676.186-.959.401-.29.221-.634.349-1.003.349-1.035 0-1.875-1.007-1.875-2.25s.84-2.25 1.875-2.25c.37 0 .713.128 1.003.349.283.215.604.401.96.401v0a.656.656 0 00.658-.663 48.422 48.422 0 00-.37-5.36c-1.886.342-3.81.574-5.766.689a.578.578 0 01-.61-.58v0z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"CVA\",\n    description: \"Create a consistent, reusable, and atomic design system.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M21 7.5l-2.25-1.313M21 7.5v2.25m0-2.25l-2.25 1.313M3 7.5l2.25-1.313M3 7.5l2.25 1.313M3 7.5v2.25m9 3l2.25-1.313M12 12.75l-2.25-1.313M12 12.75V15m0 6.75l2.25-1.313M12 21.75V19.5m0 2.25l-2.25-1.313m0-16.875L12 2.25l2.25 1.313M21 14.25v2.25l-2.25 1.313m-13.5 0L3 16.5v-2.25\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Renovate BOT\",\n    description: \"Auto-updating dependencies, so you can focus on coding.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M3.75 13.5l10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Patch-package\",\n    description: \"Fix external dependencies without losing your mind.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Components coupling & cohesion graph\",\n    description: \"A tool for managing component relationships.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6a7.5 7.5 0 107.5 7.5h-7.5V6z\" />\n        <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 10.5H21A7.5 7.5 0 0013.5 3v7.5z\" />\n      </svg>\n    ),\n  },\n  {\n    title: \"GitHub Actions\",\n    description: \"Pre-configured actions for smooth workflows, including Bundle Size and performance stats.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.348a1.125 1.125 0 010 1.971l-11.54 6.347a1.125 1.125 0 01-1.667-.985V5.653z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Automated ChatGPT Code Reviews\",\n    description: \"Stay on the cutting edge with AI-powered code reviews!\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M2.25 12.76c0 1.6 1.123 2.994 2.707 3.227 1.068.157 2.148.279 3.238.364.466.037.893.281 1.153.671L12 21l2.652-3.978c.26-.39.687-.634 1.153-.67 1.09-.086 2.17-.208 3.238-.365 1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0012 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018z\"\n        />\n      </svg>\n    ),\n  },\n  {\n    title: \"Semantic Release\",\n    description: \"For automatic changelog generation.\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        strokeWidth={1.5}\n        stroke=\"currentColor\"\n        className=\"h-6 w-6\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          d=\"M15 11.25l-3-3m0 0l-3 3m3-3v7.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n        />\n      </svg>\n    ),\n  },\n]\n"
  },
  {
    "path": "next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.\n"
  },
  {
    "path": "next.config.ts",
    "content": "import withBundleAnalyzer from \"@next/bundle-analyzer\"\nimport { type NextConfig } from \"next\"\n\nimport { env } from \"./env.mjs\"\n\nconst config: NextConfig = {\n  reactStrictMode: true,\n  logging: {\n    fetches: {\n      fullUrl: true,\n    },\n  },\n  rewrites: async () => [\n    { source: \"/healthz\", destination: \"/api/health\" },\n    { source: \"/api/healthz\", destination: \"/api/health\" },\n    { source: \"/health\", destination: \"/api/health\" },\n    { source: \"/ping\", destination: \"/api/health\" },\n  ],\n}\n\nexport default env.ANALYZE ? withBundleAnalyzer({ enabled: env.ANALYZE })(config) : config\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"next-enterprise\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env FORCE_COLOR=1 next dev --turbo\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\",\n    \"lint:fix\": \"next lint --fix\",\n    \"prettier\": \"prettier --check \\\"**/*.{js,jsx,ts,tsx}\\\"\",\n    \"prettier:fix\": \"prettier --write \\\"**/*.{js,jsx,ts,tsx}\\\"\",\n    \"analyze\": \"cross-env ANALYZE=true pnpm run build\",\n    \"storybook\": \"cross-env FORCE_COLOR=1 storybook dev -p 6006\",\n    \"test-storybook\": \"cross-env FORCE_COLOR=1 test-storybook\",\n    \"build-storybook\": \"cross-env FORCE_COLOR=1 storybook build\",\n    \"test\": \"cross-env FORCE_COLOR=1 vitest\",\n    \"test:watch\": \"cross-env FORCE_COLOR=1 vitest --watch\",\n    \"test:ui\": \"cross-env FORCE_COLOR=1 vitest --ui\",\n    \"test:coverage\": \"cross-env FORCE_COLOR=1 vitest --coverage\",\n    \"e2e:headless\": \"playwright test\",\n    \"e2e:ui\": \"playwright test --ui\",\n    \"format\": \"prettier --write \\\"**/*.{ts,tsx,md}\\\"\",\n    \"postinstall\": \"npx patch-package -y\",\n    \"coupling-graph\": \"npx madge --extensions js,jsx,ts,tsx,css,md,mdx ./ --exclude '.next|tailwind.config.js|reset.d.ts|prettier.config.js|postcss.config.js|playwright.config.ts|next.config.js|next-env.d.ts|instrumentation.ts|e2e/|README.md|.storybook/|.eslintrc.js' --image graph.svg\"\n  },\n  \"dependencies\": {\n    \"@next/bundle-analyzer\": \"^15.3.1\",\n    \"@radix-ui/react-accordion\": \"^1.2.12\",\n    \"@radix-ui/react-checkbox\": \"^1.3.3\",\n    \"@radix-ui/react-dialog\": \"^1.1.15\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n    \"@radix-ui/react-form\": \"^0.1.8\",\n    \"@radix-ui/react-label\": \"^2.1.8\",\n    \"@radix-ui/react-popover\": \"^1.1.15\",\n    \"@radix-ui/react-radio-group\": \"^1.3.8\",\n    \"@radix-ui/react-scroll-area\": \"^1.2.10\",\n    \"@radix-ui/react-select\": \"^2.2.6\",\n    \"@radix-ui/react-slider\": \"^1.3.6\",\n    \"@radix-ui/react-switch\": \"^1.2.6\",\n    \"@radix-ui/react-tabs\": \"^1.1.13\",\n    \"@radix-ui/react-toggle-group\": \"^1.1.11\",\n    \"@radix-ui/react-tooltip\": \"^1.2.8\",\n    \"@semantic-release/changelog\": \"^6.0.3\",\n    \"@semantic-release/commit-analyzer\": \"^13.0.1\",\n    \"@semantic-release/git\": \"^10.0.1\",\n    \"@semantic-release/github\": \"^12.0.6\",\n    \"@semantic-release/npm\": \"^13.1.5\",\n    \"@semantic-release/release-notes-generator\": \"^14.1.0\",\n    \"@t3-oss/env-nextjs\": \"^0.13.10\",\n    \"@vercel/otel\": \"^1.12.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"lodash\": \"^4.17.23\",\n    \"next\": \"15.5.10\",\n    \"react\": \"^19.2.4\",\n    \"react-dom\": \"^19.2.4\",\n    \"tailwind-merge\": \"^3.5.0\",\n    \"zod\": \"^3.24.4\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.29.0\",\n    \"@babel/plugin-syntax-flow\": \"^7.28.6\",\n    \"@babel/plugin-transform-optional-chaining\": \"^7.28.6\",\n    \"@babel/plugin-transform-react-jsx\": \"^7.28.6\",\n    \"@eslint/eslintrc\": \"^3.3.5\",\n    \"@next/eslint-plugin-next\": \"15.1.6\",\n    \"@opentelemetry/api\": \"1.7.0\",\n    \"@opentelemetry/resources\": \"1.18.1\",\n    \"@opentelemetry/sdk-node\": \"0.45.1\",\n    \"@opentelemetry/sdk-trace-node\": \"1.18.1\",\n    \"@opentelemetry/semantic-conventions\": \"1.40.0\",\n    \"@playwright/test\": \"^1.58.2\",\n    \"@storybook/addon-controls\": \"^8.6.14\",\n    \"@storybook/addon-essentials\": \"^8.6.14\",\n    \"@storybook/addon-interactions\": \"^8.6.14\",\n    \"@storybook/addon-links\": \"^8.6.14\",\n    \"@storybook/blocks\": \"^8.6.14\",\n    \"@storybook/nextjs\": \"^8.6.14\",\n    \"@storybook/react\": \"^8.6.14\",\n    \"@storybook/test\": \"^8.6.18\",\n    \"@storybook/test-runner\": \"^0.21.3\",\n    \"@tailwindcss/postcss\": \"^4.2.1\",\n    \"@testing-library/jest-dom\": \"^6.9.1\",\n    \"@testing-library/react\": \"^16.3.2\",\n    \"@total-typescript/ts-reset\": \"^0.6.1\",\n    \"@types/node\": \"^22.15.0\",\n    \"@types/react\": \"^19.2.14\",\n    \"@types/react-dom\": \"^19.2.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.57.1\",\n    \"@vitejs/plugin-react\": \"^4.7.0\",\n    \"@vitest/ui\": \"^3.2.4\",\n    \"all-contributors-cli\": \"^6.26.1\",\n    \"cross-env\": \"^7.0.3\",\n    \"eslint\": \"^9.26.0\",\n    \"eslint-config-next\": \"15.1.6\",\n    \"eslint-config-prettier\": \"^10.1.8\",\n    \"eslint-plugin-import\": \"^2.32.0\",\n    \"eslint-plugin-storybook\": \"^0.11.6\",\n    \"eslint-plugin-tailwindcss\": \"^3.18.2\",\n    \"fetch-mock\": \"^12.6.0\",\n    \"gzip-size\": \"6.0.0\",\n    \"jsdom\": \"^26.1.0\",\n    \"mkdirp\": \"^3.0.1\",\n    \"patch-package\": \"^8.0.1\",\n    \"postcss\": \"^8.5.8\",\n    \"postcss-import\": \"^16.1.1\",\n    \"postinstall-postinstall\": \"^2.1.0\",\n    \"prettier\": \"^3.8.1\",\n    \"prettier-plugin-tailwindcss\": \"^0.7.2\",\n    \"semantic-release\": \"^25.0.3\",\n    \"storybook\": \"^8.6.18\",\n    \"tailwindcss\": \"^4.2.1\",\n    \"tsc\": \"^2.0.4\",\n    \"typed-query-selector\": \"^2.12.1\",\n    \"typescript\": \"^5.9.3\",\n    \"typescript-eslint\": \"^8.57.1\",\n    \"vite-tsconfig-paths\": \"^5.1.4\",\n    \"vitest\": \"^3.2.4\",\n    \"webpack\": \"5.99.9\"\n  },\n  \"engines\": {\n    \"node\": \">=20.0.0\"\n  },\n  \"packageManager\": \"pnpm@10.0.0\",\n  \"pnpm\": {\n    \"overrides\": {\n      \"tmp@<=0.2.3\": \">=0.2.4\"\n    }\n  }\n}\n"
  },
  {
    "path": "playwright.config.ts",
    "content": "import { defineConfig, devices } from \"@playwright/test\"\n\n/**\n * Read environment variables from file.\n * https://github.com/motdotla/dotenv\n */\n// require('dotenv').config();\n\n/**\n * See https://playwright.dev/docs/test-configuration.\n */\nexport default defineConfig({\n  testDir: \"./e2e\",\n  /* Run tests in files in parallel */\n  fullyParallel: true,\n  /* Fail the build on CI if you accidentally left test.only in the source code. */\n  forbidOnly: !!process.env.CI,\n  /* Retry on CI only */\n  retries: process.env.CI ? 2 : 0,\n  /* Opt out of parallel tests on CI. */\n  workers: process.env.CI ? 1 : undefined,\n  /* Reporter to use. See https://playwright.dev/docs/test-reporters */\n  reporter: \"html\",\n  /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */\n  use: {\n    /* Base URL to use in actions like `await page.goto('/')`. */\n    baseURL: \"http://127.0.0.1:3000\",\n\n    /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */\n    trace: \"on-first-retry\",\n  },\n\n  /* Configure projects for major browsers */\n  projects: [\n    {\n      name: \"chromium\",\n      use: { ...devices[\"Desktop Chrome\"] },\n    },\n\n    {\n      name: \"firefox\",\n      use: { ...devices[\"Desktop Firefox\"] },\n    },\n\n    {\n      name: \"webkit\",\n      use: { ...devices[\"Desktop Safari\"] },\n    },\n\n    /* Test against mobile viewports. */\n    // {\n    //   name: 'Mobile Chrome',\n    //   use: { ...devices['Pixel 5'] },\n    // },\n    // {\n    //   name: 'Mobile Safari',\n    //   use: { ...devices['iPhone 12'] },\n    // },\n\n    /* Test against branded browsers. */\n    // {\n    //   name: 'Microsoft Edge',\n    //   use: { ...devices['Desktop Edge'], channel: 'msedge' },\n    // },\n    // {\n    //   name: 'Google Chrome',\n    //   use: { ..devices['Desktop Chrome'], channel: 'chrome' },\n    // },\n  ],\n\n  /* Run your local dev server before starting the tests */\n  webServer: {\n    command: \"pnpm dev\",\n    url: \"http://127.0.0.1:3000\",\n    reuseExistingServer: !process.env.CI,\n  },\n})\n"
  },
  {
    "path": "postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    \"postcss-import\": {},\n    \"@tailwindcss/postcss\": {},\n  },\n}\n"
  },
  {
    "path": "prettier.config.js",
    "content": "module.exports = {\n  plugins: [\"prettier-plugin-tailwindcss\"],\n  trailingComma: \"es5\",\n  tabWidth: 2,\n  printWidth: 120,\n  semi: false,\n}\n"
  },
  {
    "path": "renovate.json",
    "content": "{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:base\"\n  ],\n  \"packageRules\": [\n    {\n      \"enabled\": false,\n      \"matchPackagePatterns\": [\"*\"]\n    }\n  ],\n  \"vulnerabilityAlerts\": {\n    \"enabled\": true\n  },\n  \"osvVulnerabilityAlerts\": true\n}\n"
  },
  {
    "path": "report-bundle-size.js",
    "content": "#!/usr/bin/env node\n/* eslint-disable no-console */\n/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\n// edited to work with the appdir by @raphaelbadia\n\nconst gzSize = require(\"gzip-size\")\nconst mkdirp = require(\"mkdirp\")\nconst fs = require(\"fs\")\nconst path = require(\"path\")\n\n// Pull options from `package.json`\nconst options = getOptions()\nconst BUILD_OUTPUT_DIRECTORY = getBuildOutputDirectory(options)\n\n// first we check to make sure that the build output directory exists\nconst nextMetaRoot = path.join(process.cwd(), BUILD_OUTPUT_DIRECTORY)\ntry {\n  fs.accessSync(nextMetaRoot, fs.constants.R_OK)\n} catch (err) {\n  console.error(\n    `No build output found at \"${nextMetaRoot}\" - you may not have your working directory set correctly, or not have run \"next build\".`\n  )\n  process.exit(1)\n}\n\n// if so, we can import the build manifest\nconst buildMeta = require(path.join(nextMetaRoot, \"build-manifest.json\"))\nconst appDirMeta = require(path.join(nextMetaRoot, \"app-build-manifest.json\"))\n\n// this memory cache ensures we dont read any script file more than once\n// bundles are often shared between pages\nconst memoryCache = {}\n\n// since _app is the template that all other pages are rendered into,\n// every page must load its scripts. we'll measure its size here\nconst globalBundle = buildMeta.pages[\"/_app\"]\nconst globalBundleSizes = getScriptSizes(globalBundle)\n\n// next, we calculate the size of each page's scripts, after\n// subtracting out the global scripts\nconst allPageSizes = Object.values(buildMeta.pages).reduce((acc, scriptPaths, i) => {\n  const pagePath = Object.keys(buildMeta.pages)[i]\n  const scriptSizes = getScriptSizes(scriptPaths.filter((scriptPath) => !globalBundle.includes(scriptPath)))\n\n  acc[pagePath] = scriptSizes\n\n  return acc\n}, {})\n\nconst globalAppDirBundle = buildMeta.rootMainFiles\nconst globalAppDirBundleSizes = getScriptSizes(globalAppDirBundle)\n\nconst allAppDirSizes = Object.values(appDirMeta.pages).reduce((acc, scriptPaths, i) => {\n  const pagePath = Object.keys(appDirMeta.pages)[i]\n  const scriptSizes = getScriptSizes(scriptPaths.filter((scriptPath) => !globalAppDirBundle.includes(scriptPath)))\n  acc[pagePath] = scriptSizes\n\n  return acc\n}, {})\n\n// format and write the output\nconst rawData = JSON.stringify({\n  ...allAppDirSizes,\n  __global: globalAppDirBundleSizes,\n})\n\n// log ouputs to the gh actions panel\nconsole.log(rawData)\n\nmkdirp.sync(path.join(nextMetaRoot, \"analyze/\"))\nfs.writeFileSync(path.join(nextMetaRoot, \"analyze/__bundle_analysis.json\"), rawData)\n\n// --------------\n// Util Functions\n// --------------\n\n// given an array of scripts, return the total of their combined file sizes\nfunction getScriptSizes(scriptPaths) {\n  const res = scriptPaths.reduce(\n    (acc, scriptPath) => {\n      const [rawSize, gzipSize] = getScriptSize(scriptPath)\n      acc.raw += rawSize\n      acc.gzip += gzipSize\n\n      return acc\n    },\n    { raw: 0, gzip: 0 }\n  )\n\n  return res\n}\n\n// given an individual path to a script, return its file size\nfunction getScriptSize(scriptPath) {\n  const encoding = \"utf8\"\n  const p = path.join(nextMetaRoot, scriptPath)\n\n  let rawSize, gzipSize\n  if (Object.keys(memoryCache).includes(p)) {\n    rawSize = memoryCache[p][0]\n    gzipSize = memoryCache[p][1]\n  } else {\n    const textContent = fs.readFileSync(p, encoding)\n    rawSize = Buffer.byteLength(textContent, encoding)\n    gzipSize = gzSize.sync(textContent)\n    memoryCache[p] = [rawSize, gzipSize]\n  }\n\n  return [rawSize, gzipSize]\n}\n\n/**\n * Reads options from `package.json`\n */\nfunction getOptions(pathPrefix = process.cwd()) {\n  const pkg = require(path.join(pathPrefix, \"package.json\"))\n\n  return { ...pkg.nextBundleAnalysis, name: pkg.name }\n}\n\n/**\n * Gets the output build directory, defaults to `.next`\n *\n * @param {object} options the options parsed from package.json.nextBundleAnalysis using `getOptions`\n * @returns {string}\n */\nfunction getBuildOutputDirectory(options) {\n  return options.buildOutputDirectory || \".next\"\n}\n"
  },
  {
    "path": "reset.d.ts",
    "content": "import \"@total-typescript/ts-reset\"\nimport \"typed-query-selector/strict\"\n"
  },
  {
    "path": "styles/tailwind.css",
    "content": "@import 'tailwindcss';\n\n/*\n  The default border color has changed to `currentColor` in Tailwind CSS v4,\n  so we've added these compatibility styles to make sure everything still\n  looks the same as it did with Tailwind CSS v3.\n\n  If we ever want to remove these styles, we need to add an explicit border\n  color utility to any element that depends on these defaults.\n*/\n@layer base {\n  *,\n  ::after,\n  ::before,\n  ::backdrop,\n  ::file-selector-button {\n    border-color: var(--color-gray-200, currentColor);\n  }\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"display\": \"Next.js\",\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noUncheckedIndexedAccess\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"incremental\": true,\n    \"baseUrl\": \".\",\n    \"types\": [\"node\", \"vitest/globals\", \"@testing-library/jest-dom\"],\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ]\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \"**/*.mjs\", \"vitest.config.ts\", \".next/types/**/*.ts\", \"eslint.config.mjs\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "vercel.json",
    "content": "{\n  \"$schema\": \"https://openapi.vercel.sh/vercel.json\",\n  \"installCommand\": \"corepack enable && pnpm install\"\n}\n"
  },
  {
    "path": "vitest.config.ts",
    "content": "import { defineConfig } from \"vitest/config\"\nimport react from \"@vitejs/plugin-react\"\nimport tsconfigPaths from \"vite-tsconfig-paths\"\n\nexport default defineConfig({\n  plugins: [tsconfigPaths(), react()],\n  test: {\n    environment: \"jsdom\",\n    setupFiles: \"./vitest.setup.ts\",\n    globals: true,\n    include: [\"**/*.test.{ts,tsx}\", \"**/*.spec.{ts,tsx}\"],\n    exclude: [\"**/node_modules/**\", \"**/dist/**\", \"**/e2e/**\", \".next/**\"],\n  },\n})\n"
  },
  {
    "path": "vitest.setup.ts",
    "content": "import \"@testing-library/jest-dom\"\n"
  }
]